Browse Source

Avoid undefined signed overflow in SDLTest_RandomIntegerInRange

Partial backport of efba42a67bff4fe5cc3c4083a76d49ecc34fee37
Anonymous Maarten 3 months ago
parent
commit
1fa217434b
1 changed files with 9 additions and 6 deletions
  1. 9 6
      src/test/SDL_test_fuzzer.c

+ 9 - 6
src/test/SDL_test_fuzzer.c

@@ -153,10 +153,10 @@ Sint32 SDLTest_RandomIntegerInRange(Sint32 pMin, Sint32 pMax)
 {
     Sint64 min = pMin;
     Sint64 max = pMax;
-    Sint64 temp;
-    Sint64 number;
+    Uint64 range;
 
     if (pMin > pMax) {
+        Sint32 temp;
         temp = min;
         min = max;
         max = temp;
@@ -164,10 +164,13 @@ Sint32 SDLTest_RandomIntegerInRange(Sint32 pMin, Sint32 pMax)
         return (Sint32)min;
     }
 
-    number = SDLTest_RandomUint32();
-    /* invocation count increment in preceeding call */
-
-    return (Sint32)((number % ((max + 1) - min)) + min);
+    range = (Sint64)max - (Sint64)min;
+    if (range < SDL_MAX_SINT32) {
+        return min + (Sint32) (SDLTest_RandomUint32() % (range + 1));
+    } else {
+        Uint64 add = SDLTest_RandomUint32() | SDLTest_RandomUint32();
+        return (Sint32) (min + (Sint64) (add % (range + 1)));
+    }
 }
 
 /* !