From b19a694ad57699ac740286312a9280476198e9f0 Mon Sep 17 00:00:00 2001 From: anders_k Date: Sun, 16 Jun 2019 14:08:43 +0000 Subject: [PATCH] Allow up to 4 GiB of 3rd-party appended data. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7098 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/exehead/fileform.c | 20 ++++++++++---------- Source/exehead/fileform.h | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Source/exehead/fileform.c b/Source/exehead/fileform.c index 58369ab3..c856ff92 100644 --- a/Source/exehead/fileform.c +++ b/Source/exehead/fileform.c @@ -58,7 +58,7 @@ struct block_header g_blocks[BLOCKS_NUM]; header *g_header; int g_flags; -int g_filehdrsize; +UINT g_filehdrsize; int g_is_uninstaller; HANDLE g_db_hFile=INVALID_HANDLE_VALUE; @@ -68,8 +68,8 @@ HANDLE dbd_hFile=INVALID_HANDLE_VALUE; static int dbd_size, dbd_pos, dbd_srcpos, dbd_fulllen; #endif//NSIS_COMPRESS_WHOLE -static int m_length; -static int m_pos; +static MAXSIZETYPE m_length; +static UINT m_pos; #define _calc_percent() (MulDiv(min(m_pos,m_length),100,m_length)) #ifdef NSIS_COMPRESS_WHOLE @@ -159,7 +159,7 @@ static z_stream g_inflate_stream; const TCHAR * NSISCALL loadHeaders(int cl_flags) { - int left; + MAXSIZETYPE left; #ifdef NSIS_CONFIG_CRC_SUPPORT crc32_t crc = 0; int do_crc = 0; @@ -199,7 +199,7 @@ const TCHAR * NSISCALL loadHeaders(int cl_flags) while (left > 0) { static char temp[32768]; - DWORD l = min(left, (g_filehdrsize ? 32768 : 512)); + DWORD l = min(left, (g_filehdrsize ? 32768UL : 512UL)); if (!ReadSelfFile(temp, l)) { #if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) @@ -229,7 +229,7 @@ const TCHAR * NSISCALL loadHeaders(int cl_flags) g_exec_flags.silent |= cl_flags & FH_FLAGS_SILENT; #endif - if (h.length_of_all_following_data > left) + if ((MAXEXEDATASIZETYPE) h.length_of_all_following_data > left) return _LANG_INVALIDCRC; #ifdef NSIS_CONFIG_CRC_SUPPORT @@ -374,7 +374,7 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int o if (offset>=0) { UINT_PTR datofs=g_blocks[NB_DATA].offset+offset; -#if (NSIS_MAX_EXESIZE+0) > 0x7fffffff +#if (NSIS_MAX_EXEDATASIZE+0) > 0x7fffffffUL #error "SetFilePointer is documented to only support signed 32-bit offsets in lDistanceToMove" #endif const int pos=(int)datofs; @@ -472,8 +472,8 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int o static char _inbuffer[IBUFSIZE]; static char _outbuffer[OBUFSIZE]; -extern int m_length; -extern int m_pos; +extern MAXSIZETYPE m_length; +extern UINT m_pos; extern INT_PTR CALLBACK verProc(HWND, UINT, WPARAM, LPARAM); extern INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); static int NSISCALL __ensuredata(int amount) @@ -549,7 +549,7 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int o if (offset>=0) { UINT_PTR datofs=g_blocks[NB_DATA].offset+offset; -#if (NSIS_MAX_EXESIZE+0) > 0x7fffffff +#if (NSIS_MAX_EXEDATASIZE+0) > 0x7fffffffUL #error "SetFilePointer is documented to only support signed 32-bit offsets in lDistanceToMove" #endif dbd_pos=(int)datofs; diff --git a/Source/exehead/fileform.h b/Source/exehead/fileform.h index 2fd7fe65..2725cf62 100644 --- a/Source/exehead/fileform.h +++ b/Source/exehead/fileform.h @@ -584,10 +584,21 @@ typedef struct { #pragma pack(pop) -#ifdef EXEHEAD +#define NSIS_MAX_EXEDATASIZE 0x7fffffffUL // Maximum size of .exe including compressed installer data. +#ifndef NSIS_CONFIG_CRC_ANAL +#define NSIS_MAX_EXEFILESIZE 0xffffffffUL // Maximum size of .exe including compressed installer data AND 3rd-party appended data. (Windows refuses to run .EXE files larger than 4 GiB) +#else +#define NSIS_MAX_EXEFILESIZE NSIS_MAX_EXEDATASIZE +#endif +#ifdef EXEHEAD // the following are only used/implemented in exehead, not makensis. +#if NSIS_MAX_EXEDATASIZE <= 0xffffffffUL +#define MAXEXEDATASIZETYPE UINT // Maximum size of .exe including compressed installer data. (Unsigned allows size including 3rd-party appeded data to be 4 GiB instead of 2 GiB) +#endif +#define MAXSIZETYPE UINT + int NSISCALL isheader(firstheader *h); // returns 0 on not header, length_of_datablock on success // returns nonzero on error @@ -610,7 +621,7 @@ DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove); extern struct block_header g_blocks[BLOCKS_NUM]; extern header *g_header; extern int g_flags; -extern int g_filehdrsize; +extern UINT g_filehdrsize; extern int g_is_uninstaller; #define g_pages ( (page*) g_blocks[NB_PAGES].offset )