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];
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;

View file

@ -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 )