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
This commit is contained in:
anders_k 2019-06-16 14:08:43 +00:00
parent fb6945ec36
commit b19a694ad5
2 changed files with 23 additions and 12 deletions

View file

@ -58,7 +58,7 @@
struct block_header g_blocks[BLOCKS_NUM]; struct block_header g_blocks[BLOCKS_NUM];
header *g_header; header *g_header;
int g_flags; int g_flags;
int g_filehdrsize; UINT g_filehdrsize;
int g_is_uninstaller; int g_is_uninstaller;
HANDLE g_db_hFile=INVALID_HANDLE_VALUE; 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; static int dbd_size, dbd_pos, dbd_srcpos, dbd_fulllen;
#endif//NSIS_COMPRESS_WHOLE #endif//NSIS_COMPRESS_WHOLE
static int m_length; static MAXSIZETYPE m_length;
static int m_pos; static UINT m_pos;
#define _calc_percent() (MulDiv(min(m_pos,m_length),100,m_length)) #define _calc_percent() (MulDiv(min(m_pos,m_length),100,m_length))
#ifdef NSIS_COMPRESS_WHOLE #ifdef NSIS_COMPRESS_WHOLE
@ -159,7 +159,7 @@ static z_stream g_inflate_stream;
const TCHAR * NSISCALL loadHeaders(int cl_flags) const TCHAR * NSISCALL loadHeaders(int cl_flags)
{ {
int left; MAXSIZETYPE left;
#ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT
crc32_t crc = 0; crc32_t crc = 0;
int do_crc = 0; int do_crc = 0;
@ -199,7 +199,7 @@ const TCHAR * NSISCALL loadHeaders(int cl_flags)
while (left > 0) while (left > 0)
{ {
static char temp[32768]; 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 (!ReadSelfFile(temp, l))
{ {
#if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) #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; g_exec_flags.silent |= cl_flags & FH_FLAGS_SILENT;
#endif #endif
if (h.length_of_all_following_data > left) if ((MAXEXEDATASIZETYPE) h.length_of_all_following_data > left)
return _LANG_INVALIDCRC; return _LANG_INVALIDCRC;
#ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT
@ -374,7 +374,7 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int o
if (offset>=0) if (offset>=0)
{ {
UINT_PTR datofs=g_blocks[NB_DATA].offset+offset; 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" #error "SetFilePointer is documented to only support signed 32-bit offsets in lDistanceToMove"
#endif #endif
const int pos=(int)datofs; 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 _inbuffer[IBUFSIZE];
static char _outbuffer[OBUFSIZE]; static char _outbuffer[OBUFSIZE];
extern int m_length; extern MAXSIZETYPE m_length;
extern int m_pos; extern UINT m_pos;
extern INT_PTR CALLBACK verProc(HWND, UINT, WPARAM, LPARAM); extern INT_PTR CALLBACK verProc(HWND, UINT, WPARAM, LPARAM);
extern INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); extern INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
static int NSISCALL __ensuredata(int amount) 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) if (offset>=0)
{ {
UINT_PTR datofs=g_blocks[NB_DATA].offset+offset; 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" #error "SetFilePointer is documented to only support signed 32-bit offsets in lDistanceToMove"
#endif #endif
dbd_pos=(int)datofs; dbd_pos=(int)datofs;

View file

@ -584,10 +584,21 @@ typedef struct {
#pragma pack(pop) #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. // 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 int NSISCALL isheader(firstheader *h); // returns 0 on not header, length_of_datablock on success
// returns nonzero on error // returns nonzero on error
@ -610,7 +621,7 @@ DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove);
extern struct block_header g_blocks[BLOCKS_NUM]; extern struct block_header g_blocks[BLOCKS_NUM];
extern header *g_header; extern header *g_header;
extern int g_flags; extern int g_flags;
extern int g_filehdrsize; extern UINT g_filehdrsize;
extern int g_is_uninstaller; extern int g_is_uninstaller;
#define g_pages ( (page*) g_blocks[NB_PAGES].offset ) #define g_pages ( (page*) g_blocks[NB_PAGES].offset )