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

beware PT_LOAD.p_filesz==0

committer: jreiser <jreiser> 1009776680 +0000
This commit is contained in:
John Reiser 2001-12-31 05:31:20 +00:00
parent 2dfb82d5b9
commit ead8daf26c

View File

@ -239,7 +239,7 @@ void PackLinuxI386elf::pack2(OutputFile *fo, Filter &ft)
// count passes, set ptload vars // count passes, set ptload vars
ui_total_passes = 0; ui_total_passes = 0;
off_t ptload0hi = 0, ptload1lo = 0; off_t ptload0hi = 0, ptload1lo = 0, ptload1sz = 0;
int nx = 0; int nx = 0;
for (k = 0; k < ehdri.e_phnum; ++k) { for (k = 0; k < ehdri.e_phnum; ++k) {
if (PT_LOAD == phdri[k].p_type) { if (PT_LOAD == phdri[k].p_type) {
@ -250,6 +250,7 @@ void PackLinuxI386elf::pack2(OutputFile *fo, Filter &ft)
} }
else if (0 == ptload1lo) { else if (0 == ptload1lo) {
ptload1lo = x.offset; ptload1lo = x.offset;
ptload1sz = x.size;
} }
ui_total_passes++; ui_total_passes++;
} else { } else {
@ -257,7 +258,7 @@ void PackLinuxI386elf::pack2(OutputFile *fo, Filter &ft)
ui_total_passes++; ui_total_passes++;
} }
} }
if (ptload0hi < ptload1lo) if (0!=ptload1sz && ptload0hi < ptload1lo)
ui_total_passes++; ui_total_passes++;
// compress extents // compress extents
@ -296,7 +297,7 @@ void PackLinuxI386elf::pack2(OutputFile *fo, Filter &ft)
? &ft : 0 ), fo ); ? &ft : 0 ), fo );
++nx; ++nx;
} }
if (ptload0hi < ptload1lo) { // alignment hole? if (0!=ptload1sz && ptload0hi < ptload1lo) { // alignment hole?
x.offset = ptload0hi; x.offset = ptload0hi;
x.size = ptload1lo - ptload0hi; x.size = ptload1lo - ptload0hi;
packExtent(x, total_in, total_out, 0, fo); packExtent(x, total_in, total_out, 0, fo);
@ -405,7 +406,7 @@ void PackLinuxI386elf::unpack(OutputFile *fo)
unsigned total_out = 0; unsigned total_out = 0;
unsigned c_adler = upx_adler32(0, NULL, 0); unsigned c_adler = upx_adler32(0, NULL, 0);
unsigned u_adler = upx_adler32(0, NULL, 0); unsigned u_adler = upx_adler32(0, NULL, 0);
off_t ptload0hi=0, ptload1lo=0; off_t ptload0hi=0, ptload1lo=0, ptload1sz=0;
// decompress PT_LOAD // decompress PT_LOAD
bool first_PF_X = true; bool first_PF_X = true;
@ -417,6 +418,7 @@ void PackLinuxI386elf::unpack(OutputFile *fo)
} }
else if (0==ptload1lo) { else if (0==ptload1lo) {
ptload1lo = phdr->p_offset; ptload1lo = phdr->p_offset;
ptload1sz = phdr->p_filesz;
} }
if (fo) if (fo)
fo->seek(phdr->p_offset, SEEK_SET); fo->seek(phdr->p_offset, SEEK_SET);
@ -432,7 +434,7 @@ void PackLinuxI386elf::unpack(OutputFile *fo)
} }
} }
if (ptload0hi < ptload1lo) { // alignment hole? if (0!=ptload1sz && ptload0hi < ptload1lo) { // alignment hole?
if (fo) if (fo)
fo->seek(ptload0hi, SEEK_SET); fo->seek(ptload0hi, SEEK_SET);
unpackExtent(ptload1lo - ptload0hi, fo, total_in, total_out, unpackExtent(ptload1lo - ptload0hi, fo, total_in, total_out,