fixed bug with undefined behaviour when shifting left by 32 or more
authorHolger Schemel <info@artsoft.org>
Sun, 21 Nov 2021 23:13:01 +0000 (00:13 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 22 Jan 2022 16:58:28 +0000 (17:58 +0100)
The C99 standard says that the result of shifting a number by the
width in bits (or more) of the operand is undefined. For intel
processors, the shift count is masked to five bits (masked with 31),
so trying to left shift a 32-bit value for 32 bits or more does not
result in zero, as it might be expected (at least not on intel CPUs).

src/files.c

index a0e77bccfc3a6e5a49d7ad78fede30309b05a344..d78432d1ebb372df5ca77f21b97809554666b177 100644 (file)
@@ -2814,8 +2814,9 @@ static int LoadLevel_CUS3(File *file, int chunk_size, struct LevelInfo *level)
       for (x = 0; x < 3; x++)
        ei->content.e[x][y] = getMappedElement(getFile16BitBE(file));
 
       for (x = 0; x < 3; x++)
        ei->content.e[x][y] = getMappedElement(getFile16BitBE(file));
 
+    // bits 0 - 31 of "has_event[]"
     event_bits = getFile32BitBE(file);
     event_bits = getFile32BitBE(file);
-    for (j = 0; j < NUM_CHANGE_EVENTS; j++)
+    for (j = 0; j < MIN(NUM_CHANGE_EVENTS, 32); j++)
       if (event_bits & (1 << j))
        ei->change->has_event[j] = TRUE;
 
       if (event_bits & (1 << j))
        ei->change->has_event[j] = TRUE;