int PackUnix::canUnpack() { int const small = 32 + sizeof(overlay_offset); // Allow zero-filled last page, for Mac OS X code signing. int bufsize = 2*4096 + 2*small +1; if (bufsize > fi->st_size()) bufsize = fi->st_size(); MemBuffer buf(bufsize); fi->seek(-(off_t)bufsize, SEEK_END); fi->readx(buf, bufsize); int i = bufsize; while (i > small && 0 == buf[--i]) { } i -= small; // allow incompressible extents if (i < 0 || !getPackHeader(buf + i, bufsize - i, true)) return false; int l = ph.buf_offset + ph.getPackHeaderSize(); if (l < 0 || l + 4 > bufsize) throwCantUnpack("file corrupted"); overlay_offset = get_te32(buf + i + l); if ((off_t)overlay_offset >= file_size) throwCantUnpack("file corrupted"); return true; }
int PackUnix::canUnpack() { upx_byte buf[sizeof(overlay_offset) + 32]; const int bufsize = sizeof(buf); fi->seek(-bufsize, SEEK_END); fi->readx(buf, bufsize); if (!getPackHeader(buf, bufsize, true)) // allow incompressible extents return false; int l = ph.buf_offset + ph.getPackHeaderSize(); if (l < 0 || l + 4 > bufsize) throwCantUnpack("file corrupted"); overlay_offset = get_te32(buf+l); if ((off_t)overlay_offset >= file_size) throwCantUnpack("file corrupted"); return true; }