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:
parent
fb6945ec36
commit
b19a694ad5
2 changed files with 23 additions and 12 deletions
|
@ -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;
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue