From 1e1a0788089a5382d1f8f5235d6455662205eb24 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Wed, 20 Dec 2000 20:00:19 +0000 Subject: [PATCH] Cleaned up Packer::readPackHeader(). committer: mfx 977342419 +0000 --- src/p_com.cpp | 2 +- src/p_djgpp2.cpp | 3 ++- src/p_exe.cpp | 5 +++-- src/p_tmt.cpp | 3 ++- src/p_tos.cpp | 2 +- src/p_unix.cpp | 3 ++- src/p_vmlinz.cpp | 5 ++++- src/p_w32pe.cpp | 11 +++++++++-- src/p_wcle.cpp | 3 ++- src/packer.cpp | 32 +++++++++++++------------------- src/packer.h | 4 ++-- 11 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/p_com.cpp b/src/p_com.cpp index df8b599d..3e320aa7 100644 --- a/src/p_com.cpp +++ b/src/p_com.cpp @@ -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; diff --git a/src/p_djgpp2.cpp b/src/p_djgpp2.cpp index 6a59bc5f..55fd21f2 100644 --- a/src/p_djgpp2.cpp +++ b/src/p_djgpp2.cpp @@ -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; } diff --git a/src/p_exe.cpp b/src/p_exe.cpp index 8ee7f493..cefa8332 100644 --- a/src/p_exe.cpp +++ b/src/p_exe.cpp @@ -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); } diff --git a/src/p_tmt.cpp b/src/p_tmt.cpp index a574a6ea..79cc9aad 100644 --- a/src/p_tmt.cpp +++ b/src/p_tmt.cpp @@ -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; } diff --git a/src/p_tos.cpp b/src/p_tos.cpp index 730e2bb2..67335327 100644 --- a/src/p_tos.cpp +++ b/src/p_tos.cpp @@ -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 diff --git a/src/p_unix.cpp b/src/p_unix.cpp index a459cf29..cd305cd2 100644 --- a/src/p_unix.cpp +++ b/src/p_unix.cpp @@ -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(); diff --git a/src/p_vmlinz.cpp b/src/p_vmlinz.cpp index d138f270..11f34bb0 100644 --- a/src/p_vmlinz.cpp +++ b/src/p_vmlinz.cpp @@ -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; } diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 9a1eadee..7a52ee1c 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -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; diff --git a/src/p_wcle.cpp b/src/p_wcle.cpp index cbea80a6..1448de36 100644 --- a/src/p_wcle.cpp +++ b/src/p_wcle.cpp @@ -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; } diff --git a/src/packer.cpp b/src/packer.cpp index 95b9419c..a9f0ff5f 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -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 **************************************************************************/ diff --git a/src/packer.h b/src/packer.h index 5072ce3f..0d475609 100644 --- a/src/packer.h +++ b/src/packer.h @@ -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;