Use my_page_size, which is 0x4000 (16KiB) on arm64

https://github.com/upx/upx/issues/628
	modified:   p_mach.cpp
This commit is contained in:
John Reiser 2022-12-30 09:52:45 -08:00 committed by Markus F.X.J. Oberhumer
parent 01a30752c7
commit 77ba43328b

View File

@ -1724,7 +1724,7 @@ int PackMachBase<T>::canUnpack()
}
int const small = 32 + sizeof(overlay_offset);
unsigned bufsize = 4096 + sizeof(PackHeader);
unsigned bufsize = my_page_size + sizeof(PackHeader) + sizeof(overlay_offset);
if (391 == style) { // PackHeader precedes __LINKEDIT
fi->seek(offLINK - bufsize, SEEK_SET);
} else
@ -1749,7 +1749,7 @@ int PackMachBase<T>::canUnpack()
// Do not overwrite buf[]; For scratch space, then use buf3 instead.
int i = bufsize;
while (i > small && 0 == buf[--i]) { }
while (i > small && 0 == buf[--i]) { } // why is this search so slow?
i -= small;
// allow incompressible extents
if (i < 1 || !getPackHeader(buf + i, bufsize - i, true)) {
@ -1761,24 +1761,25 @@ int PackMachBase<T>::canUnpack()
fi->readx(buf3, bufsize);
unsigned char const *b = &buf3[0];
unsigned disp = *(TE32 const *)&b[1];
// Emulate the code
if (0xe8==b[0] && disp < bufsize
// This has been obsoleted by amd64-darwin.macho-entry.S
// searching for "executable_path=" etc.
&& 0x5d==b[5+disp] && 0xe8==b[6+disp]) {
unsigned disp2 = 0u - *(TE32 const *)&b[7+disp];
if (disp2 < (12+disp) && 0x5b==b[11+disp-disp2]) {
struct b_info const *bptr = (struct b_info const *)&b[11+disp];
// This is the folded stub.
// FIXME: check b_method?
if (bptr->sz_cpr < bptr->sz_unc && bptr->sz_unc < 0x1000) {
b = bptr->sz_cpr + (unsigned char const *)(1+ bptr);
// FIXME: check PackHeader::putPackHeader(), packhead.cpp
overlay_offset = *(TE32 const *)(32 + b);
if (overlay_offset < 0x1000) {
return true; // success
if (CPU_TYPE_X86_64 == my_cputype) { // Emulate the code
if (0xe8==b[0] && disp < bufsize
// This has been obsoleted by amd64-darwin.macho-entry.S
// searching for "executable_path=" etc.
&& 0x5d==b[5+disp] && 0xe8==b[6+disp]) {
unsigned disp2 = 0u - *(TE32 const *)&b[7+disp];
if (disp2 < (12+disp) && 0x5b==b[11+disp-disp2]) {
struct b_info const *bptr = (struct b_info const *)&b[11+disp];
// This is the folded stub.
// FIXME: check b_method?
if (bptr->sz_cpr < bptr->sz_unc && bptr->sz_unc < 0x1000) {
b = bptr->sz_cpr + (unsigned char const *)(1+ bptr);
// FIXME: check PackHeader::putPackHeader(), packhead.cpp
overlay_offset = *(TE32 const *)(32 + b);
if (overlay_offset < 0x1000) {
return true; // success
}
overlay_offset = 0; // failure
}
overlay_offset = 0;
}
}
}