Fix OpenSubdiv related buffer overrun with multiple FVar channels.
authorAlexander Gavrilov <angavrilov@gmail.com>
Sat, 10 Sep 2016 18:15:52 +0000 (21:15 +0300)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 14 Sep 2016 08:26:20 +0000 (10:26 +0200)
The existing code uses the input value count of the first channel
for all of them. If the first channel is the largest, it leads to
a crash-causing buffer overrun in memcpy below. Likely this was
left since the time when only one channel was supported.

As a crash fix, probably should go into 2.78

intern/opensubdiv/opensubdiv_capi.cc

index ab90495..52ce98f 100644 (file)
@@ -165,7 +165,7 @@ static void interpolate_fvar_data(OpenSubdiv::Far::TopologyRefiner& refiner,
        const int max_level = refiner.GetMaxLevel();
        size_t fvar_data_offset = 0, values_offset = 0;
        for (int channel = 0; channel < refiner.GetNumFVarChannels(); ++channel) {
-               const int num_values = refiner.GetLevel(0).GetNumFVarValues(0) * 2,
+               const int num_values = refiner.GetLevel(0).GetNumFVarValues(channel) * 2,
                          num_values_max = refiner.GetLevel(max_level).GetNumFVarValues(channel),
                          num_values_total = refiner.GetNumFVarValuesTotal(channel);
                if (num_values_total <= 0) {