Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-12-17 10:53:29 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-12-17 11:00:22 +0400
commit61fb34a622d5f05e551e0342c05df946bd11fcb1 (patch)
tree64d1c08f5fb1aa9b592910d59fd6724b0293e360 /source/blender/freestyle
parentb3ea4ec90cad7362421e34f2a8f1b8b84f31a9f6 (diff)
Fix for obscure freestyle crash when attempting to negate INT_MIN
This gives undefined behavior - in my case stays the same value and crashes. Check for finite input resolves the issue.
Diffstat (limited to 'source/blender/freestyle')
-rw-r--r--source/blender/freestyle/intern/system/PseudoNoise.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/source/blender/freestyle/intern/system/PseudoNoise.cpp b/source/blender/freestyle/intern/system/PseudoNoise.cpp
index 634274874d3..e4fe497e064 100644
--- a/source/blender/freestyle/intern/system/PseudoNoise.cpp
+++ b/source/blender/freestyle/intern/system/PseudoNoise.cpp
@@ -30,6 +30,19 @@
#include "PseudoNoise.h"
#include "RandGen.h"
+static int modf_to_index(Freestyle::real x, unsigned int range)
+{
+ if (isfinite(x)) {
+ Freestyle::real tmp;
+ int i = abs((int)(modf(x, &tmp) * range));
+ BLI_assert(i >= 0 && i < range);
+ return i;
+ }
+ else {
+ return 0;
+ }
+}
+
namespace Freestyle {
real PseudoNoise::_values[];
@@ -46,7 +59,7 @@ void PseudoNoise::init(long seed)
real PseudoNoise::linearNoise(real x)
{
real tmp;
- int i = abs((int)(modf(x, &tmp) * NB_VALUE_NOISE));
+ int i = modf_to_index(x, NB_VALUE_NOISE);
real x1 = _values[i], x2 = _values[(i + 1) % NB_VALUE_NOISE];
real t = modf(x * NB_VALUE_NOISE, &tmp);
return x1 * (1 - t) + x2 * t;
@@ -64,9 +77,9 @@ static real LanczosWindowed(real t)
real PseudoNoise::smoothNoise(real x)
{
real tmp;
- int i = abs((int)(modf(x, &tmp) * NB_VALUE_NOISE));
+ int i = modf_to_index(x, NB_VALUE_NOISE);
int h = i - 1;
- if (h < 0) {
+ if (UNLIKELY(h < 0)) {
h = NB_VALUE_NOISE + h;
}