Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Backports:SLE-15
upx
0001-Mach-o-defend-against-bad-crafted-input.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-Mach-o-defend-against-bad-crafted-input.patch of Package upx
From 6eafa552bb4bf2303fbadf1f65e7d99919d476c6 Mon Sep 17 00:00:00 2001 From: John Reiser <jreiser@BitWagon.com> X-From: did conflict resolution for applying to 3.94.0, <jengelh@inai.de> Date: Wed, 15 Nov 2017 13:38:54 -0800 Subject: [PATCH] Mach-o defend against bad crafted input https://github.com/upx/upx/issues/146 modified: p_mach.cpp --- src/p_mach.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) Index: upx-3.94-src/src/p_mach.cpp =================================================================== --- upx-3.94-src.orig/src/p_mach.cpp +++ upx-3.94-src/src/p_mach.cpp @@ -1835,6 +1835,12 @@ bool PackMachBase<T>::canPack() return false; my_cpusubtype = mhdri.cpusubtype; + unsigned int szx = mhdri.sizeofcmds; + unsigned headway = file_size - sizeof(mhdri); + if (headway < szx) { + char buf[32]; snprintf(buf, sizeof(buf), "bad sizeofcmds %u", szx); + throwCantPack(buf); + } rawmseg = (Mach_segment_command *)new char[(unsigned) mhdri.sizeofcmds]; fi->readx(rawmseg, mhdri.sizeofcmds); @@ -1843,11 +1849,18 @@ bool PackMachBase<T>::canPack() unsigned char const *ptr = (unsigned char const *)rawmseg; for (unsigned j= 0; j < ncmds; ++j) { Mach_segment_command const *segptr = (Mach_segment_command const *)ptr; + if (headway < ((Mach_command const *)ptr)->cmdsize) { + char buf[64]; snprintf(buf, sizeof(buf), + "bad Mach_command[%d]{%#x, %#x}", j, + (unsigned)segptr->cmd, (unsigned)((Mach_command const *)ptr)->cmdsize); + throwCantPack(buf); + } + headway -= ((Mach_command const *)ptr)->cmdsize; if (lc_seg == segptr->cmd) { msegcmd[j] = *segptr; } else { - memcpy(&msegcmd[j], ptr, 2*sizeof(unsigned)); // cmd and size + memcpy(&msegcmd[j], ptr, 2*sizeof(unsigned)); // cmd and cmdsize } switch (((Mach_uuid_command const *)ptr)->cmd) { default: break; @@ -1872,7 +1885,7 @@ bool PackMachBase<T>::canPack() prev_init_address = ((Mach_routines_command const *)ptr)->init_address; } - ptr += (unsigned) ((const Mach_segment_command *)ptr)->cmdsize; + ptr += (unsigned) ((Mach_command const *)ptr)->cmdsize; } if (Mach_header::MH_DYLIB==my_filetype && 0==o_routines_cmd) { infoWarning("missing -init function");
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor