From 9915194e85327c4807099f678fcdb55ccd51b8a8 Mon Sep 17 00:00:00 2001 From: kichik Date: Wed, 3 Oct 2007 18:27:37 +0000 Subject: [PATCH] more error handling and endianity fixes git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5311 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/icon.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Source/icon.cpp b/Source/icon.cpp index e32f185a..e169fcdf 100644 --- a/Source/icon.cpp +++ b/Source/icon.cpp @@ -55,7 +55,7 @@ IconGroup load_icon_res(CResourceEditor* re, WORD id) header = (IconGroupHeader*) group; - for (WORD i = 0; i < header->wCount; i++) + for (WORD i = 0; i < FIX_ENDIAN_INT16(header->wCount); i++) { Icon icon; icon.index = i; @@ -95,22 +95,34 @@ IconGroup load_icon_file(const char* filename) icon.data = NULL; if (!fread(&icon.meta, sizeof(IconGroupEntry), 1, file)) + { + free_loaded_icon(result); throw runtime_error("unable to read entry from file"); + } DWORD size = FIX_ENDIAN_INT32(icon.meta.dwRawSize); if (size > 1048576) // magic numbers are great + { + free_loaded_icon(result); throw runtime_error("invalid icon file size"); + } DWORD iconOffset; if (!fread(&iconOffset, sizeof(DWORD), 1, file)) + { + free_loaded_icon(result); throw runtime_error("unable to read offset from file"); + } fpos_t pos; fgetpos(file, &pos); if (fseek(file, iconOffset, SEEK_SET)) + { + free_loaded_icon(result); throw runtime_error("corrupted icon file, too small"); + } icon.data = new BYTE[size];