fixed bug #2533431 - Script compiling fails with !packhdr, but succeeds without?!

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5909 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2009-01-31 15:46:54 +00:00
parent 5a9bbbb021
commit 608701ccc8
3 changed files with 24 additions and 4 deletions

View file

@ -125,10 +125,11 @@ PRESOURCE_DIRECTORY CResourceEditor::GetResourceDirectory(
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize) {
CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData /*=true*/) {
// Copy the data pointer
m_pbPE = pbPE;
m_iSize = iSize;
m_bKeepData = bKeepData;
// Get NT headers
m_ntHeaders = GetNTHeaders(m_pbPE);
@ -270,6 +271,9 @@ bool CResourceEditor::UpdateResource(WORD szType, WORD szName, LANGID wLanguage,
// Returns a copy of the requested resource
// Returns 0 if the requested resource can't be found
BYTE* CResourceEditor::GetResourceW(WCHAR* szType, WCHAR* szName, LANGID wLanguage) {
if (!m_bKeepData)
throw runtime_error("Can't GetResource() when bKeepData is false");
CResourceDirectory* nameDir = 0;
CResourceDirectory* langDir = 0;
CResourceDataEntry* data = 0;
@ -398,6 +402,9 @@ void CResourceEditor::FreeResource(BYTE* pbResource)
// Saves the edited PE into a buffer and returns it.
DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) {
if (!m_bKeepData)
throw runtime_error("Can't Save() when bKeepData is false");
unsigned int i;
DWORD dwReqSize;
@ -624,6 +631,18 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P
LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA;
DWORD dwOffset = DWORD(pbData - m_pbPE);
if (m_bKeepData)
{
if (dwOffset > m_iSize)
{
throw runtime_error("Invalid resource entry data pointer, possibly compressed resources");
}
}
else
{
pbData = m_pbPE; // dummy pointer to "nothing"
}
rdc->AddEntry(
new CResourceDirectoryEntry(
szName,

View file

@ -109,7 +109,7 @@ typedef struct RESOURCE_DIRECTORY {
)
class CResourceEditor {
public:
CResourceEditor(BYTE* pbPE, int iSize);
CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData = true);
virtual ~CResourceEditor();
bool UpdateResource(WORD szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
@ -144,6 +144,7 @@ public:
private:
BYTE* m_pbPE;
int m_iSize;
bool m_bKeepData;
PIMAGE_NT_HEADERS m_ntHeaders;

View file

@ -368,7 +368,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin
DWORD offset;
DWORD size;
CResourceEditor re(exeHeader, exeHeaderSize);
CResourceEditor re(exeHeader, exeHeaderSize, false);
LPBYTE seeker = uninstIconData;
@ -397,7 +397,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin
size = FIX_ENDIAN_INT32(*(LPDWORD)seeker);
seeker += sizeof(DWORD);
if (real_size < size)
if (real_size != size)
{
throw runtime_error("invalid icon size (possibly compressed icon)");
}