Fix #27855: crash on enabling high resolution smoke.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 5 Jul 2011 12:25:56 +0000 (12:25 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 5 Jul 2011 12:25:56 +0000 (12:25 +0000)
Wavelet tile generation code was reading outside of array bounds, and as a
result could give a noise.wavelets file with nan values. Now that problem
is fixed, and existing files with nan are ignored.

intern/smoke/intern/WAVELET_NOISE.h

index b556b4a2e6675bba8fd6504080c2572fb636a675..edbf4254199c69c5784e6190a7a5a684c4a6d15e 100644 (file)
@@ -69,7 +69,7 @@ static void downsampleX(float *from, float *to, int n){
        const float *a = &downCoeffs[16];
        for (int i = 0; i < n / 2; i++) {
                to[i] = 0;
        const float *a = &downCoeffs[16];
        for (int i = 0; i < n / 2; i++) {
                to[i] = 0;
-               for (int k = 2 * i - 16; k <= 2 * i + 16; k++)
+               for (int k = 2 * i - 16; k < 2 * i + 16; k++)
                        to[i] += a[k - 2 * i] * from[modFast128(k)];
        }
 }
                        to[i] += a[k - 2 * i] * from[modFast128(k)];
        }
 }
@@ -79,7 +79,7 @@ static void downsampleY(float *from, float *to, int n){
        const float *a = &downCoeffs[16];
        for (int i = 0; i < n / 2; i++) {
                to[i * n] = 0;
        const float *a = &downCoeffs[16];
        for (int i = 0; i < n / 2; i++) {
                to[i * n] = 0;
-               for (int k = 2 * i - 16; k <= 2 * i + 16; k++)
+               for (int k = 2 * i - 16; k < 2 * i + 16; k++)
                        to[i * n] += a[k - 2 * i] * from[modFast128(k) * n];
        }
 }
                        to[i * n] += a[k - 2 * i] * from[modFast128(k) * n];
        }
 }
@@ -89,7 +89,7 @@ static void downsampleZ(float *from, float *to, int n){
        const float *a = &downCoeffs[16];
        for (int i = 0; i < n / 2; i++) {
                to[i * n * n] = 0;
        const float *a = &downCoeffs[16];
        for (int i = 0; i < n / 2; i++) {
                to[i * n * n] = 0;
-               for (int k = 2 * i - 16; k <= 2 * i + 16; k++)
+               for (int k = 2 * i - 16; k < 2 * i + 16; k++)
                        to[i * n * n] += a[k - 2 * i] * from[modFast128(k) * n * n];
        }
 }
                        to[i * n * n] += a[k - 2 * i] * from[modFast128(k) * n * n];
        }
 }
@@ -262,6 +262,14 @@ static bool loadTile(float* const noiseTileData, std::string filename)
                printf("loadTile: Noise tile '%s' is wrong size %d.\n", filename.c_str(), (int)bread);
                return false;
        } 
                printf("loadTile: Noise tile '%s' is wrong size %d.\n", filename.c_str(), (int)bread);
                return false;
        } 
+
+       // check for invalid nan tile data that could be generated. bug is now
+       // fixed, but invalid files may still hang around
+       if (isnan(noiseTileData[0])) {
+               printf("loadTile: Noise tile '%s' contains nan values.\n", filename.c_str());
+               return false;
+       }
+
        return true;
 }
 
        return true;
 }