Verify size in sawyercoding_read_chunk

This commit is contained in:
Michał Janiszewski 2016-06-22 22:20:27 +02:00 committed by Ted John
parent 9b958bfb47
commit bee6bcd1c7
3 changed files with 48 additions and 1 deletions

View File

@ -2641,7 +2641,7 @@ int object_get_scenario_text(rct_object_entry *entry)
}
else {
chunk = (uint8*)malloc(chunkSize);
sawyercoding_read_chunk(rw, chunk);
sawyercoding_read_chunk_with_size(rw, chunk, chunkSize);
}
SDL_RWclose(rw);

View File

@ -140,6 +140,52 @@ size_t sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer)
return chunkHeader.length;
}
/**
*
* rct2: 0x0067685F
* buffer (esi)
*/
size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const size_t buffer_size)
{
sawyercoding_chunk_header chunkHeader;
// Read chunk header
if (SDL_RWread(rw, &chunkHeader, sizeof(sawyercoding_chunk_header), 1) != 1) {
log_error("Unable to read chunk header!");
return -1;
}
uint8* src_buffer = malloc(chunkHeader.length);
// Read chunk data
if (SDL_RWread(rw, src_buffer, chunkHeader.length, 1) != 1) {
free(src_buffer);
log_error("Unable to read chunk data!");
return -1;
}
// Decode chunk data
switch (chunkHeader.encoding) {
case CHUNK_ENCODING_NONE:
assert(chunkHeader.length <= buffer_size);
memcpy(buffer, src_buffer, chunkHeader.length);
break;
case CHUNK_ENCODING_RLE:
chunkHeader.length = decode_chunk_rle(src_buffer, buffer, chunkHeader.length);
break;
case CHUNK_ENCODING_RLECOMPRESSED:
chunkHeader.length = decode_chunk_rle(src_buffer, buffer, chunkHeader.length);
chunkHeader.length = decode_chunk_repeat(buffer, chunkHeader.length);
break;
case CHUNK_ENCODING_ROTATE:
memcpy(buffer, src_buffer, chunkHeader.length);
decode_chunk_rotate(buffer, chunkHeader.length);
break;
}
free(src_buffer);
return chunkHeader.length;
}
/**
*
* rct2: 0x006762E1

View File

@ -51,6 +51,7 @@ int sawyercoding_validate_checksum(SDL_RWops* rw);
uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length);
bool sawyercoding_read_chunk_safe(SDL_RWops *rw, void *dst, size_t dstLength);
size_t sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer);
size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const size_t buffer_size);
size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader);
size_t sawyercoding_decode_sv4(const uint8 *src, uint8 *dst, size_t length);
size_t sawyercoding_decode_sc4(const uint8 *src, uint8 *dst, size_t length);