mirror of
https://github.com/raysan5/raylib.git
synced 2025-09-15 07:48:15 +00:00
REVIEWED: Avoid realloc() calls, small security improvement
This commit is contained in:
19
src/rcore.c
19
src/rcore.c
@@ -2562,19 +2562,20 @@ unsigned char *DecompressData(const unsigned char *compData, int compDataSize, i
|
||||
|
||||
#if defined(SUPPORT_COMPRESSION_API)
|
||||
// Decompress data from a valid DEFLATE stream
|
||||
data = (unsigned char *)RL_CALLOC(MAX_DECOMPRESSION_SIZE*1024*1024, 1);
|
||||
unsigned char *data0 = (unsigned char *)RL_CALLOC(MAX_DECOMPRESSION_SIZE*1024*1024, 1);
|
||||
int length = sinflate(data, MAX_DECOMPRESSION_SIZE*1024*1024, compData, compDataSize);
|
||||
|
||||
// WARNING: RL_REALLOC can make (and leave) data copies in memory, be careful with sensitive compressed data!
|
||||
// TODO: Use a different approach, create another buffer, copy data manually to it and wipe original buffer memory
|
||||
unsigned char *temp = (unsigned char *)RL_REALLOC(data, length);
|
||||
|
||||
if (temp != NULL) data = temp;
|
||||
else TRACELOG(LOG_WARNING, "SYSTEM: Failed to re-allocate required decompression memory");
|
||||
// WARNING: RL_REALLOC can make (and leave) data copies in memory,
|
||||
// that can be a security concern in case of compression of sensitive data
|
||||
// So, we use a second buffer to copy data manually, wiping original buffer memory
|
||||
data = (unsigned char *)RL_CALLOC(length, 1);
|
||||
memcpy(data, data0, length);
|
||||
memset(data0, 0, MAX_DECOMPRESSION_SIZE*1024*1024); // Wipe memory, is memset() safe?
|
||||
RL_FREE(data0);
|
||||
|
||||
TRACELOG(LOG_INFO, "SYSTEM: Decompress data: Comp. size: %i -> Original size: %i", compDataSize, length);
|
||||
|
||||
*dataSize = length;
|
||||
|
||||
TRACELOG(LOG_INFO, "SYSTEM: Decompress data: Comp. size: %i -> Original size: %i", compDataSize, *dataSize);
|
||||
#endif
|
||||
|
||||
return data;
|
||||
|
Reference in New Issue
Block a user