Some cleanups.

committer: mfx <mfx> 977048446 +0000
This commit is contained in:
Markus F.X.J. Oberhumer 2000-12-17 10:20:46 +00:00
parent 77b63fdbe9
commit 118660205e

View File

@ -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);