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
|
// Construction/Destruction
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize) {
|
CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData /*=true*/) {
|
||||||
// Copy the data pointer
|
// Copy the data pointer
|
||||||
m_pbPE = pbPE;
|
m_pbPE = pbPE;
|
||||||
m_iSize = iSize;
|
m_iSize = iSize;
|
||||||
|
m_bKeepData = bKeepData;
|
||||||
|
|
||||||
// Get NT headers
|
// Get NT headers
|
||||||
m_ntHeaders = GetNTHeaders(m_pbPE);
|
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 a copy of the requested resource
|
||||||
// Returns 0 if the requested resource can't be found
|
// Returns 0 if the requested resource can't be found
|
||||||
BYTE* CResourceEditor::GetResourceW(WCHAR* szType, WCHAR* szName, LANGID wLanguage) {
|
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* nameDir = 0;
|
||||||
CResourceDirectory* langDir = 0;
|
CResourceDirectory* langDir = 0;
|
||||||
CResourceDataEntry* data = 0;
|
CResourceDataEntry* data = 0;
|
||||||
|
@ -398,6 +402,9 @@ void CResourceEditor::FreeResource(BYTE* pbResource)
|
||||||
|
|
||||||
// Saves the edited PE into a buffer and returns it.
|
// Saves the edited PE into a buffer and returns it.
|
||||||
DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) {
|
DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) {
|
||||||
|
if (!m_bKeepData)
|
||||||
|
throw runtime_error("Can't Save() when bKeepData is false");
|
||||||
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
DWORD dwReqSize;
|
DWORD dwReqSize;
|
||||||
|
|
||||||
|
@ -624,6 +631,18 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P
|
||||||
LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA;
|
LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA;
|
||||||
DWORD dwOffset = DWORD(pbData - m_pbPE);
|
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(
|
rdc->AddEntry(
|
||||||
new CResourceDirectoryEntry(
|
new CResourceDirectoryEntry(
|
||||||
szName,
|
szName,
|
||||||
|
|
|
@ -109,7 +109,7 @@ typedef struct RESOURCE_DIRECTORY {
|
||||||
)
|
)
|
||||||
class CResourceEditor {
|
class CResourceEditor {
|
||||||
public:
|
public:
|
||||||
CResourceEditor(BYTE* pbPE, int iSize);
|
CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData = true);
|
||||||
virtual ~CResourceEditor();
|
virtual ~CResourceEditor();
|
||||||
|
|
||||||
bool UpdateResource(WORD szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
|
bool UpdateResource(WORD szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
|
||||||
|
@ -144,6 +144,7 @@ public:
|
||||||
private:
|
private:
|
||||||
BYTE* m_pbPE;
|
BYTE* m_pbPE;
|
||||||
int m_iSize;
|
int m_iSize;
|
||||||
|
bool m_bKeepData;
|
||||||
|
|
||||||
PIMAGE_NT_HEADERS m_ntHeaders;
|
PIMAGE_NT_HEADERS m_ntHeaders;
|
||||||
|
|
||||||
|
|
|
@ -368,7 +368,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin
|
||||||
DWORD offset;
|
DWORD offset;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
|
||||||
CResourceEditor re(exeHeader, exeHeaderSize);
|
CResourceEditor re(exeHeader, exeHeaderSize, false);
|
||||||
|
|
||||||
LPBYTE seeker = uninstIconData;
|
LPBYTE seeker = uninstIconData;
|
||||||
|
|
||||||
|
@ -397,7 +397,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin
|
||||||
size = FIX_ENDIAN_INT32(*(LPDWORD)seeker);
|
size = FIX_ENDIAN_INT32(*(LPDWORD)seeker);
|
||||||
seeker += sizeof(DWORD);
|
seeker += sizeof(DWORD);
|
||||||
|
|
||||||
if (real_size < size)
|
if (real_size != size)
|
||||||
{
|
{
|
||||||
throw runtime_error("invalid icon size (possibly compressed icon)");
|
throw runtime_error("invalid icon size (possibly compressed icon)");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue