Some cleanups.
committer: mfx <mfx> 977048446 +0000
This commit is contained in:
parent
77b63fdbe9
commit
118660205e
@ -93,11 +93,13 @@ int PackVmlinuzI386::readFileHeader()
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
setup_size = (1 + (h.setup_sects ? h.setup_sects : 4)) * 0x200;
|
setup_size = (1 + (h.setup_sects ? h.setup_sects : 4)) * 0x200;
|
||||||
if (setup_size > file_size)
|
if (setup_size <= 0 || setup_size >= file_size)
|
||||||
return -1;
|
return -1;
|
||||||
if (h.sys_size * 16 + setup_size - ALIGN_UP(file_size, 16))
|
if (setup_size + 16 * h.sys_size != (unsigned) ALIGN_UP(file_size, 16))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
// FIXME: add more checks for a valid kernel
|
||||||
|
|
||||||
if (memcmp(h.hdrs, "HdrS", 4) == 0 && (h.load_flags & 1) != 0)
|
if (memcmp(h.hdrs, "HdrS", 4) == 0 && (h.load_flags & 1) != 0)
|
||||||
return UPX_F_BVMLINUZ_i386;
|
return UPX_F_BVMLINUZ_i386;
|
||||||
|
|
||||||
@ -114,35 +116,26 @@ int PackVmlinuzI386::uncompressKernel()
|
|||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
fi->readx(obuf, file_size);
|
fi->readx(obuf, file_size);
|
||||||
|
|
||||||
// estimate gzip-uncompressed kernel size &
|
// estimate gzip-uncompressed kernel size & alloc buffer
|
||||||
// alloc buffer to hold the gzip-uncompressed kernel
|
|
||||||
ibuf.alloc((file_size - setup_size) * 3);
|
ibuf.alloc((file_size - setup_size) * 3);
|
||||||
|
|
||||||
// find gzip/zlib header
|
// find gzip/zlib header
|
||||||
int klen = 0;
|
|
||||||
gzFile zf= 0;
|
|
||||||
|
|
||||||
for (int gzoff = setup_size; gzoff < file_size; gzoff++)
|
for (int gzoff = setup_size; gzoff < file_size; gzoff++)
|
||||||
{
|
{
|
||||||
int off = find(obuf + gzoff, file_size - gzoff, "\x1F\x8B", 2);
|
int off = find(obuf + gzoff, file_size - gzoff, "\x1F\x8B", 2);
|
||||||
if (off < 0)
|
if (off < 0)
|
||||||
break;
|
break;
|
||||||
|
gzoff += off;
|
||||||
fi->seek(gzoff += off, SEEK_SET);
|
fi->seek(gzoff, SEEK_SET);
|
||||||
zf = gzdopen(dup(fi->getFd()), "r");
|
gzFile zf = gzdopen(fi->getFd(), "r");
|
||||||
if (zf == 0)
|
if (zf == 0)
|
||||||
break;
|
break;
|
||||||
klen = gzread(zf, ibuf, ibuf.getSize());
|
int klen = gzread(zf, ibuf, ibuf.getSize());
|
||||||
if (klen >= file_size)
|
if (klen >= file_size)
|
||||||
break;
|
return klen;
|
||||||
gzclose(zf);
|
|
||||||
zf = 0;
|
|
||||||
klen = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zf)
|
return 0;
|
||||||
gzclose(zf);
|
|
||||||
return klen;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -151,6 +144,8 @@ void PackVmlinuzI386::readKernel()
|
|||||||
int klen = uncompressKernel();
|
int klen = uncompressKernel();
|
||||||
if (klen <= 0)
|
if (klen <= 0)
|
||||||
throwCantPack("kernel decompression failed");
|
throwCantPack("kernel decompression failed");
|
||||||
|
if (klen >= (int) ibuf.getSize())
|
||||||
|
throwCantPack("kernel decompression failed -- too big");
|
||||||
|
|
||||||
//OutputFile::dump("kernel.img", ibuf, klen);
|
//OutputFile::dump("kernel.img", ibuf, klen);
|
||||||
|
|
||||||
@ -170,7 +165,6 @@ void PackVmlinuzI386::readKernel()
|
|||||||
// vmlinuz specific
|
// vmlinuz specific
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
int PackVmlinuzI386::buildLoader(const Filter *ft)
|
int PackVmlinuzI386::buildLoader(const Filter *ft)
|
||||||
{
|
{
|
||||||
// prepare loader
|
// prepare loader
|
||||||
@ -201,6 +195,7 @@ void PackVmlinuzI386::pack(OutputFile *fo)
|
|||||||
ft.buf_len = ph.u_len;
|
ft.buf_len = ph.u_len;
|
||||||
ft.addvalue = kernel_entry;
|
ft.addvalue = kernel_entry;
|
||||||
// prepare other settings
|
// prepare other settings
|
||||||
|
const unsigned overlap_range = 1 << 20;
|
||||||
unsigned overlapoh;
|
unsigned overlapoh;
|
||||||
|
|
||||||
int strategy = -1; // try the first working filter
|
int strategy = -1; // try the first working filter
|
||||||
@ -210,7 +205,7 @@ void PackVmlinuzI386::pack(OutputFile *fo)
|
|||||||
else if (opt->all_filters)
|
else if (opt->all_filters)
|
||||||
// choose best from all available filters
|
// choose best from all available filters
|
||||||
strategy = 0;
|
strategy = 0;
|
||||||
compressWithFilters(&ft, &overlapoh, 1 << 20, strategy);
|
compressWithFilters(&ft, &overlapoh, overlap_range, strategy);
|
||||||
|
|
||||||
const unsigned lsize = getLoaderSize();
|
const unsigned lsize = getLoaderSize();
|
||||||
MemBuffer loader(lsize);
|
MemBuffer loader(lsize);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user