From 137813cec8a0fb6bd188651ca2c78365dcbddb74 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 6 Aug 2019 22:07:25 +1000 Subject: [PATCH] Don't crash if out of memory reading dat/fcm/lvl/cw maps or .wav files --- src/Audio.c | 4 +++- src/Formats.c | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Audio.c b/src/Audio.c index 9ef07c20c..934fc8c90 100644 --- a/src/Audio.c +++ b/src/Audio.c @@ -473,8 +473,10 @@ static ReturnCode Sound_ReadWaveData(struct Stream* stream, struct Sound* snd) { snd->Format.BitsPerSample = Stream_GetU16_LE(&tmp[14]); size -= WAV_FMT_SIZE; } else if (fourCC == WAV_FourCC('d','a','t','a')) { - snd->Data = (uint8_t*)Mem_Alloc(size, 1, "WAV sound data"); + snd->Data = (uint8_t*)Mem_TryAlloc(size, 1); snd->Size = size; + + if (!snd->Data) return ERR_OUT_OF_MEMORY; return Stream_Read(stream, snd->Data, size); } diff --git a/src/Formats.c b/src/Formats.c index dd135e3f6..3fa03f558 100644 --- a/src/Formats.c +++ b/src/Formats.c @@ -22,7 +22,9 @@ *#########################################################################################################################*/ static ReturnCode Map_ReadBlocks(struct Stream* stream) { World.Volume = World.Width * World.Length * World.Height; - World.Blocks = (BlockRaw*)Mem_Alloc(World.Volume, 1, "map blocks"); + World.Blocks = (BlockRaw*)Mem_TryAlloc(World.Volume, 1); + + if (!World.Blocks) return ERR_OUT_OF_MEMORY; return Stream_Read(stream, World.Blocks, World.Volume); } @@ -398,9 +400,11 @@ static ReturnCode Nbt_ReadTag(uint8_t typeId, bool readTagName, struct Stream* s if (NbtTag_IsSmall(&tag)) { res = Stream_Read(stream, tag.Value.Small, tag.DataSize); } else { - tag.Value.Big = (uint8_t*)Mem_Alloc(tag.DataSize, 1, "NBT data"); + tag.Value.Big = (uint8_t*)Mem_TryAlloc(tag.DataSize, 1); + if (!tag.Value.Big) return ERR_OUT_OF_MEMORY; + res = Stream_Read(stream, tag.Value.Big, tag.DataSize); - if (res) { Mem_Free(tag.Value.Big); } + if (res) Mem_Free(tag.Value.Big); } break; case NBT_STR: @@ -877,7 +881,9 @@ static ReturnCode Dat_ReadFieldData(struct Stream* stream, struct JFieldDesc* fi if ((res = Stream_ReadU32_BE(stream, &count))) return res; field->Value.Array.Size = count; - field->Value.Array.Ptr = (uint8_t*)Mem_Alloc(count, 1, ".dat map blocks"); + field->Value.Array.Ptr = (uint8_t*)Mem_TryAlloc(count, 1); + if (!field->Value.Array.Ptr) return ERR_OUT_OF_MEMORY; + res = Stream_Read(stream, field->Value.Array.Ptr, count); if (res) { Mem_Free(field->Value.Array.Ptr); return res; } } break;