From 9572ad1d9f213b76533a1d380eb8a81288b7b0e0 Mon Sep 17 00:00:00 2001 From: JosiahWI Date: Fri, 17 Sep 2021 11:39:45 -0500 Subject: [PATCH] fix integer overflow in mapgen Some calculations involving the magic seed had overflow because the result of an intermediate arithmetic step could not fit in an s32. By making the magic seed unsigned, the other operand in the equation will be cast to unsigned, and possibly other operands or intermediate operands. This will result in unexpected behavior if an operand is negative, which is technically possible, but logically should not happen. --- src/mapgen/mapgen.cpp | 3 ++- src/noise.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mapgen/mapgen.cpp b/src/mapgen/mapgen.cpp index 7984ff609..1c6395599 100644 --- a/src/mapgen/mapgen.cpp +++ b/src/mapgen/mapgen.cpp @@ -238,7 +238,8 @@ u32 Mapgen::getBlockSeed(v3s16 p, s32 seed) u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed) { - u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013 * seed; + // Unsigned magic seed prevents undefined behavior. + u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013U * seed; n = (n >> 13) ^ n; return (n * (n * n * 60493 + 19990303) + 1376312589); } diff --git a/src/noise.cpp b/src/noise.cpp index a10efa3c4..46067e09d 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -35,7 +35,8 @@ #define NOISE_MAGIC_X 1619 #define NOISE_MAGIC_Y 31337 #define NOISE_MAGIC_Z 52591 -#define NOISE_MAGIC_SEED 1013 +// Unsigned magic seed prevents undefined behavior. +#define NOISE_MAGIC_SEED 1013U typedef float (*Interp2dFxn)( float v00, float v10, float v01, float v11,