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:
parent
5a9bbbb021
commit
608701ccc8
3 changed files with 24 additions and 4 deletions
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue