another 30 or so bytes saved, by modifying readSelfFile to do all length checking. Not sure if I broke anything though =)
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@1179 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
0728c9b4c8
commit
997ff07df8
4 changed files with 31 additions and 30 deletions
|
@ -164,7 +164,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
|
||||||
static char temp[512];
|
static char temp[512];
|
||||||
DWORD l=left;
|
DWORD l=left;
|
||||||
if (l > 512) l=512;
|
if (l > 512) l=512;
|
||||||
if (!ReadSelfFile(temp,l,&l))
|
if (!ReadSelfFile(temp,l))
|
||||||
{
|
{
|
||||||
m_Err=_LANG_INVALIDCRC;
|
m_Err=_LANG_INVALIDCRC;
|
||||||
#if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT)
|
#if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT)
|
||||||
|
@ -254,10 +254,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
|
||||||
#ifdef NSIS_CONFIG_CRC_SUPPORT
|
#ifdef NSIS_CONFIG_CRC_SUPPORT
|
||||||
if (do_crc)
|
if (do_crc)
|
||||||
{
|
{
|
||||||
DWORD l;
|
|
||||||
int fcrc;
|
int fcrc;
|
||||||
SetSelfFilePointer(m_pos,FILE_BEGIN);
|
SetSelfFilePointer(m_pos,FILE_BEGIN);
|
||||||
if (!ReadSelfFile(&fcrc,4,&l) || crc != fcrc)
|
if (!ReadSelfFile(&fcrc,4) || crc != fcrc)
|
||||||
{
|
{
|
||||||
m_Err=_LANG_INVALIDCRC;
|
m_Err=_LANG_INVALIDCRC;
|
||||||
goto end;
|
goto end;
|
||||||
|
|
|
@ -1345,13 +1345,13 @@ static int NSISCALL ExecuteEntry(entry *entry_)
|
||||||
if (hFile != INVALID_HANDLE_VALUE)
|
if (hFile != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
unsigned char *filebuf;
|
unsigned char *filebuf;
|
||||||
DWORD l;
|
|
||||||
filebuf=(unsigned char *)my_GlobalAlloc(g_filehdrsize);
|
filebuf=(unsigned char *)my_GlobalAlloc(g_filehdrsize);
|
||||||
if (filebuf)
|
if (filebuf)
|
||||||
{
|
{
|
||||||
int fixoffs=0;
|
int fixoffs=0;
|
||||||
|
DWORD lout;
|
||||||
SetSelfFilePointer(0,FILE_BEGIN);
|
SetSelfFilePointer(0,FILE_BEGIN);
|
||||||
ReadSelfFile((char*)filebuf,g_filehdrsize,&l);
|
ReadSelfFile((char*)filebuf,g_filehdrsize);
|
||||||
if (g_inst_header->uninstdata_offset != -1)
|
if (g_inst_header->uninstdata_offset != -1)
|
||||||
{
|
{
|
||||||
// Changed by Amir Szekely 11th July 2002
|
// Changed by Amir Szekely 11th July 2002
|
||||||
|
@ -1373,7 +1373,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
|
||||||
GlobalFree(unicon_data);
|
GlobalFree(unicon_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WriteFile(hFile,(char*)filebuf,g_filehdrsize,&l,NULL);
|
WriteFile(hFile,(char*)filebuf,g_filehdrsize,&lout,NULL);
|
||||||
GlobalFree(filebuf);
|
GlobalFree(filebuf);
|
||||||
ret=GetCompressedDataFromDataBlock(-1,hFile);
|
ret=GetCompressedDataFromDataBlock(-1,hFile);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,11 +51,10 @@ static z_stream g_inflate_stream;
|
||||||
|
|
||||||
const char * NSISCALL loadHeaders(void)
|
const char * NSISCALL loadHeaders(void)
|
||||||
{
|
{
|
||||||
DWORD r;
|
|
||||||
void *data;
|
void *data;
|
||||||
firstheader h;
|
firstheader h;
|
||||||
|
|
||||||
if (!ReadSelfFile((LPVOID)&h,sizeof(h),&r) || r != sizeof(h) || !isheader(&h)) return _LANG_INVALIDCRC;
|
if (!ReadSelfFile((LPVOID)&h,sizeof(h)) || !isheader(&h)) return _LANG_INVALIDCRC;
|
||||||
|
|
||||||
data=(void*)my_GlobalAlloc(h.length_of_header);
|
data=(void*)my_GlobalAlloc(h.length_of_header);
|
||||||
|
|
||||||
|
@ -130,7 +129,6 @@ static int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int out
|
||||||
int outbuffer_len=outbuf?outbuflen:OBUFSIZE;
|
int outbuffer_len=outbuf?outbuflen:OBUFSIZE;
|
||||||
int retval=0;
|
int retval=0;
|
||||||
int input_len;
|
int input_len;
|
||||||
DWORD r;
|
|
||||||
|
|
||||||
outbuffer = outbuf?outbuf:(inbuffer+IBUFSIZE);
|
outbuffer = outbuf?outbuf:(inbuffer+IBUFSIZE);
|
||||||
|
|
||||||
|
@ -148,24 +146,24 @@ static int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int out
|
||||||
SetSelfFilePointer(g_db_offset+offset,FILE_BEGIN);
|
SetSelfFilePointer(g_db_offset+offset,FILE_BEGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ReadSelfFile((LPVOID)&input_len,sizeof(int),&r)) return -3;
|
if (!ReadSelfFile((LPVOID)&input_len,sizeof(int))) return -3;
|
||||||
|
|
||||||
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
|
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
|
||||||
else if (input_len & 0x80000000) // compressed
|
if (input_len & 0x80000000) // compressed
|
||||||
{
|
{
|
||||||
inflateReset(&g_inflate_stream);
|
inflateReset(&g_inflate_stream);
|
||||||
input_len &= 0x7fffffff; // take off top bit.
|
input_len &= 0x7fffffff; // take off top bit.
|
||||||
|
|
||||||
while (input_len > 0)
|
while (input_len > 0)
|
||||||
{
|
{
|
||||||
DWORD r;
|
int l=min(input_len,IBUFSIZE);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!ReadSelfFile((LPVOID)inbuffer,min(input_len,IBUFSIZE),&r)) return -3;
|
if (!ReadSelfFile((LPVOID)inbuffer,l)) return -3;
|
||||||
|
|
||||||
g_inflate_stream.next_in = inbuffer;
|
g_inflate_stream.next_in = inbuffer;
|
||||||
g_inflate_stream.avail_in = r;
|
g_inflate_stream.avail_in = l;
|
||||||
input_len-=r;
|
input_len-=l;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -183,6 +181,7 @@ static int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int out
|
||||||
|
|
||||||
if (!outbuf)
|
if (!outbuf)
|
||||||
{
|
{
|
||||||
|
DWORD r;
|
||||||
if (!WriteFile(hFileOut,outbuffer,u,&r,NULL) || (int)r != u) return -2;
|
if (!WriteFile(hFileOut,outbuffer,u,&r,NULL) || (int)r != u) return -2;
|
||||||
retval+=u;
|
retval+=u;
|
||||||
}
|
}
|
||||||
|
@ -197,24 +196,26 @@ static int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int out
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif//NSIS_CONFIG_COMPRESSION_SUPPORT
|
|
||||||
else
|
else
|
||||||
|
#endif//NSIS_CONFIG_COMPRESSION_SUPPORT
|
||||||
{
|
{
|
||||||
if (!outbuf)
|
if (!outbuf)
|
||||||
{
|
{
|
||||||
while (input_len > 0)
|
while (input_len > 0)
|
||||||
{
|
{
|
||||||
|
DWORD l=min(input_len,outbuffer_len);
|
||||||
DWORD t;
|
DWORD t;
|
||||||
if (!ReadSelfFile((LPVOID)inbuffer,min(input_len,outbuffer_len),&r)) return -3;
|
if (!ReadSelfFile((LPVOID)inbuffer,l)) return -3;
|
||||||
if (!WriteFile(hFileOut,inbuffer,r,&t,NULL) || r!=t) return -2;
|
if (!WriteFile(hFileOut,inbuffer,l,&t,NULL) || l!=t) return -2;
|
||||||
retval+=r;
|
retval+=l;
|
||||||
input_len-=r;
|
input_len-=l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ReadSelfFile((LPVOID)outbuf,min(input_len,outbuflen),&r)) return -3;
|
int l=min(input_len,outbuflen);
|
||||||
retval=r;
|
if (!ReadSelfFile((LPVOID)outbuf,l)) return -3;
|
||||||
|
retval=l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -241,11 +242,11 @@ static int NSISCALL __ensuredata(int amount)
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
DWORD or;
|
int l=min(IBUFSIZE,dbd_fulllen-dbd_srcpos);
|
||||||
if (!ReadSelfFile((LPVOID)_inbuffer,min(IBUFSIZE,dbd_fulllen-dbd_srcpos),&or)) return -1;
|
if (!ReadSelfFile((LPVOID)_inbuffer,l)) return -1;
|
||||||
dbd_srcpos+=or;
|
dbd_srcpos+=l;
|
||||||
g_inflate_stream.next_in=_inbuffer;
|
g_inflate_stream.next_in=_inbuffer;
|
||||||
g_inflate_stream.avail_in=or;
|
g_inflate_stream.avail_in=l;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
DWORD r,t;
|
DWORD r,t;
|
||||||
|
@ -286,7 +287,7 @@ static int NSISCALL __ensuredata(int amount)
|
||||||
}
|
}
|
||||||
dbd_size+=r;
|
dbd_size+=r;
|
||||||
}
|
}
|
||||||
else if (g_inflate_stream.avail_in || !or) return -3;
|
else if (g_inflate_stream.avail_in || !l) return -3;
|
||||||
else break;
|
else break;
|
||||||
}
|
}
|
||||||
while (g_inflate_stream.avail_in);
|
while (g_inflate_stream.avail_in);
|
||||||
|
@ -351,9 +352,10 @@ int NSISCALL GetCompressedDataFromDataBlockToMemory(int offset, char *out, int o
|
||||||
return _dodecomp(offset,NULL,out,out_len);
|
return _dodecomp(offset,NULL,out,out_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead)
|
BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead)
|
||||||
{
|
{
|
||||||
return ReadFile(g_db_hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL);
|
DWORD rd;
|
||||||
|
return ReadFile(g_db_hFile,lpBuffer,nNumberOfBytesToRead,&rd,NULL) && (rd == nNumberOfBytesToRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove, DWORD dwMoveMethod)
|
DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove, DWORD dwMoveMethod)
|
||||||
|
|
|
@ -478,7 +478,7 @@ extern int g_quit_flag;
|
||||||
const char * NSISCALL GetStringFromStringTab(int offs);
|
const char * NSISCALL GetStringFromStringTab(int offs);
|
||||||
int NSISCALL GetCompressedDataFromDataBlock(int offset, HANDLE hFileOut);
|
int NSISCALL GetCompressedDataFromDataBlock(int offset, HANDLE hFileOut);
|
||||||
int NSISCALL GetCompressedDataFromDataBlockToMemory(int offset, char *out, int out_len);
|
int NSISCALL GetCompressedDataFromDataBlockToMemory(int offset, char *out, int out_len);
|
||||||
BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead);
|
BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead);
|
||||||
DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove, DWORD dwMoveMethod);
|
DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove, DWORD dwMoveMethod);
|
||||||
|
|
||||||
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
|
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue