From edb8eb1edccca1a259c083b8196bb2670fffc9ea Mon Sep 17 00:00:00 2001 From: Liam Murphy Date: Thu, 26 Nov 2020 00:14:00 +0000 Subject: [PATCH 1/3] migrate to MemBuffer class from New() to remove leak --- src/pefile.cpp | 39 +++++++++++++++++++++++---------------- src/pefile.h | 3 +++ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/pefile.cpp b/src/pefile.cpp index c513135e..ddd7bfa5 100644 --- a/src/pefile.cpp +++ b/src/pefile.cpp @@ -1729,16 +1729,21 @@ void PeFile::Resource::build(const upx_rnode *node, unsigned &bpos, } } -upx_byte *PeFile::Resource::build() +upx_byte* PeFile::Resource::build() { - newstart = New(upx_byte, dirsize()); - unsigned bpos = 0,spos = dsize; - build(root,bpos,spos,0); + mem.dealloc(); + newstart = nullptr; + if (dirsize()) { + mem.alloc(dirsize()); + newstart = static_cast(mem.getVoidPtr()); + unsigned bpos = 0,spos = dsize; + build(root,bpos,spos,0); - // dirsize() is 4 bytes aligned, so we may need to zero - // up to 2 bytes to make valgrind happy - while (spos < dirsize()) - newstart[spos++] = 0; + // dirsize() is 4 bytes aligned, so we may need to zero + // up to 2 bytes to make valgrind happy + while (spos < dirsize()) + newstart[spos++] = 0; + } return newstart; } @@ -1825,9 +1830,10 @@ void PeFile::processResources(Resource *res,unsigned newaddr) while (res->next()) if (res->newoffs()) res->newoffs() += newaddr; - upx_byte *p = res->build(); - memcpy(oresources,p,res->dirsize()); - delete [] p; + if (res->dirsize()) { + upx_byte *p = res->build(); + memcpy(oresources,p,res->dirsize()); + } } static bool match(unsigned itype, const unsigned char *ntype, @@ -2757,12 +2763,13 @@ void PeFile::rebuildResources(upx_byte *& extrainfo, unsigned lastvaddr) icondir_count = 0; } } - upx_byte *p = res.build(); - OCHECK(obuf + ODADDR(PEDIR_RESOURCE) - rvamin, 16); - // write back when the original is zeroed - if (get_le32(obuf + ODADDR(PEDIR_RESOURCE) - rvamin + 12) == 0) + if (res.dirsize()) { + upx_byte *p = res.build(); + OCHECK(obuf + ODADDR(PEDIR_RESOURCE) - rvamin, 16); + // write back when the original is zeroed + if (get_le32(obuf + ODADDR(PEDIR_RESOURCE) - rvamin + 12) == 0) omemcpy(obuf + ODADDR(PEDIR_RESOURCE) - rvamin, p, res.dirsize()); - delete [] p; + } } template diff --git a/src/pefile.h b/src/pefile.h index 99f12aa8..0a2815b8 100644 --- a/src/pefile.h +++ b/src/pefile.h @@ -29,6 +29,8 @@ #ifndef __UPX_PEFILE_H #define __UPX_PEFILE_H 1 +#include "mem.h" + /************************************************************************* // general/pe handling @@ -341,6 +343,7 @@ protected: struct upx_rbranch; struct upx_rleaf; + MemBuffer mem; const upx_byte *start; upx_byte *newstart; upx_rnode *root; From 579847073bcfeea46675184f5340c43c63ec6e2b Mon Sep 17 00:00:00 2001 From: Liam Murphy Date: Thu, 26 Nov 2020 03:00:21 +0000 Subject: [PATCH 2/3] tweak formatting to reduce diff --- src/pefile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pefile.cpp b/src/pefile.cpp index ddd7bfa5..0ecc4dee 100644 --- a/src/pefile.cpp +++ b/src/pefile.cpp @@ -1729,7 +1729,7 @@ void PeFile::Resource::build(const upx_rnode *node, unsigned &bpos, } } -upx_byte* PeFile::Resource::build() +upx_byte *PeFile::Resource::build() { mem.dealloc(); newstart = nullptr; From db3c86d8080bed0016621b9ad45587b2dcf987bb Mon Sep 17 00:00:00 2001 From: John Reiser Date: Sat, 5 Dec 2020 13:53:14 -0800 Subject: [PATCH 3/3] Use 'mb_' prefix on instances of MemBuffer modified: pefile.cpp modified: pefile.h --- src/pefile.cpp | 6 +++--- src/pefile.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pefile.cpp b/src/pefile.cpp index 0ecc4dee..502fa186 100644 --- a/src/pefile.cpp +++ b/src/pefile.cpp @@ -1731,11 +1731,11 @@ void PeFile::Resource::build(const upx_rnode *node, unsigned &bpos, upx_byte *PeFile::Resource::build() { - mem.dealloc(); + mb_start.dealloc(); newstart = nullptr; if (dirsize()) { - mem.alloc(dirsize()); - newstart = static_cast(mem.getVoidPtr()); + mb_start.alloc(dirsize()); + newstart = static_cast(mb_start.getVoidPtr()); unsigned bpos = 0,spos = dsize; build(root,bpos,spos,0); diff --git a/src/pefile.h b/src/pefile.h index 0a2815b8..f7a08fab 100644 --- a/src/pefile.h +++ b/src/pefile.h @@ -343,7 +343,7 @@ protected: struct upx_rbranch; struct upx_rleaf; - MemBuffer mem; + MemBuffer mb_start; const upx_byte *start; upx_byte *newstart; upx_rnode *root;