1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

Cleaned up Packer::readPackHeader().

committer: mfx <mfx> 977342419 +0000
This commit is contained in:
Markus F.X.J. Oberhumer 2000-12-20 20:00:19 +00:00
parent 7d652fa42b
commit 1e1a078808
11 changed files with 41 additions and 32 deletions

View File

@ -234,7 +234,7 @@ void PackCom::pack(OutputFile *fo)
int PackCom::canUnpack()
{
if (!readPackHeader(128, 0))
if (!readPackHeader(128))
return false;
if (file_size <= (off_t) ph.c_len)
return false;

View File

@ -378,7 +378,8 @@ int PackDjgpp2::canUnpack()
return false;
if (is_dlm(fi,coff_offset))
throwCantUnpack("can't handle DLM");
return readPackHeader(1024, coff_offset) ? 1 : -1;
fi->seek(coff_offset, SEEK_SET);
return readPackHeader(1024) ? 1 : -1;
}

View File

@ -531,8 +531,9 @@ int PackExe::canUnpack()
{
if (!readFileHeader())
return false;
const off_t off = ih.headsize16*16;
bool b = readPackHeader(128, off);
const off_t off = ih.headsize16 * 16;
fi->seek(off, SEEK_SET);
bool b = readPackHeader(128);
return b && (off + (off_t) ph.c_len <= file_size);
}

View File

@ -265,7 +265,8 @@ int PackTmt::canUnpack()
{
if (!PackTmt::readFileHeader())
return false;
return readPackHeader(512,adam_offset) ? 1 : -1;
fi->seek(adam_offset, SEEK_SET);
return readPackHeader(512) ? 1 : -1;
}

View File

@ -558,7 +558,7 @@ int PackTos::canUnpack()
{
if (!readFileHeader())
return false;
if (!readPackHeader(512, 0))
if (!readPackHeader(512))
return false;
// check header as set by packer
if ((ih.fh_text & 3) != 0 || (ih.fh_data & 3) != 0 || (ih.fh_bss & 3) != 0

View File

@ -212,7 +212,8 @@ int PackUnix::canUnpack()
const int bufsize = sizeof(buf);
fi->seek(-bufsize, SEEK_END);
if (!readPackHeader(128, -1, buf))
fi->readx(buf, bufsize);
if (!getPackHeader(buf, bufsize))
return false;
int l = ph.buf_offset + ph.getPackHeaderSize();

View File

@ -345,7 +345,10 @@ void PackBvmlinuzI386::pack(OutputFile *fo)
int PackVmlinuzI386::canUnpack()
{
return readFileHeader() == getFormat();
if (readFileHeader() != getFormat())
return false;
fi->seek(setup_size, SEEK_SET);
return readPackHeader(1024) ? 1 : -1;
}

View File

@ -1925,8 +1925,15 @@ int PackW32Pe::canUnpack()
bool found_ph = false;
if (memcmp(isection[0].name,"UPX",3) == 0)
{
found_ph = readPackHeader(1024, isection[1].rawdataptr - 64) // current version
|| readPackHeader(1024, isection[2].rawdataptr); // old versions
// current version
fi->seek(isection[1].rawdataptr - 64, SEEK_SET);
found_ph = readPackHeader(1024);
if (!found_ph)
{
// old versions
fi->seek(isection[2].rawdataptr, SEEK_SET);
found_ph = readPackHeader(1024);
}
}
if (is_packed && found_ph)
return true;

View File

@ -745,8 +745,9 @@ int PackWcle::canUnpack()
{
if (!LeFile::readFileHeader())
return false;
fi->seek(exe_offset + ih.data_pages_offset, SEEK_SET);
// FIXME: 1024 could be too large for some files
return readPackHeader(1024, ih.data_pages_offset+exe_offset) ? 1 : -1;
return readPackHeader(1024) ? 1 : -1;
}

View File

@ -594,26 +594,9 @@ int Packer::patchPackHeader(void *b, int blen)
}
bool Packer::readPackHeader(unsigned len, off_t seek_offset, upx_byte *buf)
bool Packer::getPackHeader(void *b, int blen)
{
assert((int)len > 0);
MemBuffer hbuf;
if (buf == NULL)
{
hbuf.alloc(len);
buf = hbuf;
}
memset(buf, 0, len);
if (seek_offset != -1)
{
if (seek_offset >= 0)
fi->seek(seek_offset, SEEK_SET);
}
len = fi->read(buf,len);
if (!ph.fillPackHeader(buf, len))
if (!ph.fillPackHeader((unsigned char *)b, blen))
return false;
if (ph.version > getVersion())
@ -649,6 +632,17 @@ bool Packer::readPackHeader(unsigned len, off_t seek_offset, upx_byte *buf)
}
bool Packer::readPackHeader(int len)
{
assert((int)len > 0);
MemBuffer buf(len);
len = fi->read(buf, len);
if (len <= 0)
return false;
return getPackHeader(buf, len);
}
/*************************************************************************
// patch util for loader
**************************************************************************/

View File

@ -180,8 +180,8 @@ protected:
// packheader handling
virtual int patchPackHeader(void *b, int blen);
virtual bool readPackHeader(unsigned len, off_t seek_offset,
upx_byte *buf=NULL);
virtual bool getPackHeader(void *b, int blen);
virtual bool readPackHeader(int len);
// filter handling
virtual bool isValidFilter(int filter_id) const;