From bcd6e6e4579ebc13ce4fc90c658ad7af3701353a Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 19 Oct 2024 11:49:37 +1100 Subject: [PATCH] Properly prevent loading multiplayer maps over 2 GB in size --- src/Menus.c | 3 +-- src/Protocol.c | 4 ++++ src/Widgets.c | 1 - src/World.h | 5 +++++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 7454169be..0bccc80fd 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1061,8 +1061,7 @@ static void GenLevelScreen_Gen(void* screen, const struct MapGenerator* gen) { int length = GenLevelScreen_GetInt(s, 2); int seed = GenLevelScreen_GetSeedInt(s, 3); - cc_uint64 volume = (cc_uint64)width * height * length; - if (volume > Int32_MaxValue) { + if (!World_CheckVolume(width, height, length)) { Chat_AddRaw("&cThe generated map's volume is too big."); } else if (!width || !height || !length) { Chat_AddRaw("&cOne of the map dimensions is invalid."); diff --git a/src/Protocol.c b/src/Protocol.c index 0a8383d4d..3068f6947 100644 --- a/src/Protocol.c +++ b/src/Protocol.c @@ -627,6 +627,10 @@ static void Classic_LevelFinalise(cc_uint8* data) { Chat_AddRaw("&cFailed to load map, try joining a different map"); Chat_Add2( " &cBlocks array size (%i) does not match volume of map (%i)", &map_volume, &volume); FreeMapStates(); + } else if (!World_CheckVolume(width, height, length)) { + Chat_AddRaw("&cFailed to load map, try joining a different map"); + Chat_AddRaw(" &cAttempted to load map over 2 GB in size"); + FreeMapStates(); } #ifdef EXTENDED_BLOCKS diff --git a/src/Widgets.c b/src/Widgets.c index d7fa29dcc..4b820e278 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -2217,7 +2217,6 @@ static int TextGroupWidget_Reduce(struct TextGroupWidget* w, char* chars, int ta } static void TextGroupWidget_RemoveColorPrefix(cc_string* text, int i) { - /* Delete leading colour code if present */ if (i + 2 > text->length || text->buffer[i] != '&') return; if (!Drawer2D_ValidColorCodeAt(text, i + 1)) return; diff --git a/src/World.h b/src/World.h index bbfd09921..08ed9647e 100644 --- a/src/World.h +++ b/src/World.h @@ -115,6 +115,11 @@ static CC_INLINE cc_bool World_ContainsXZ(int x, int z) { && (unsigned)z < (unsigned)World.Length; } +static CC_INLINE cc_bool World_CheckVolume(int width, int height, int length) { + cc_uint64 volume = (cc_uint64)width * height * length; + return volume <= Int32_MaxValue; +} + enum EnvVar { ENV_VAR_EDGE_BLOCK, ENV_VAR_SIDES_BLOCK, ENV_VAR_EDGE_HEIGHT, ENV_VAR_SIDES_OFFSET, ENV_VAR_CLOUDS_HEIGHT, ENV_VAR_CLOUDS_SPEED, ENV_VAR_WEATHER_SPEED, ENV_VAR_WEATHER_FADE,