migrate to MemBuffer class from New() to remove leak

This commit is contained in:
Liam Murphy
2020-11-26 00:14:00 +00:00
committed by Markus F.X.J. Oberhumer
parent 2a135e245b
commit cbe129795e
2 changed files with 26 additions and 16 deletions
+23 -16
View File
@@ -1737,16 +1737,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()); mem.dealloc();
unsigned bpos = 0,spos = dsize; newstart = nullptr;
build(root,bpos,spos,0); if (dirsize()) {
mem.alloc(dirsize());
newstart = static_cast<upx_byte *>(mem.getVoidPtr());
unsigned bpos = 0,spos = dsize;
build(root,bpos,spos,0);
// dirsize() is 4 bytes aligned, so we may need to zero // dirsize() is 4 bytes aligned, so we may need to zero
// up to 2 bytes to make valgrind happy // up to 2 bytes to make valgrind happy
while (spos < dirsize()) while (spos < dirsize())
newstart[spos++] = 0; newstart[spos++] = 0;
}
return newstart; return newstart;
} }
@@ -1833,9 +1838,10 @@ void PeFile::processResources(Resource *res,unsigned newaddr)
while (res->next()) while (res->next())
if (res->newoffs()) if (res->newoffs())
res->newoffs() += newaddr; res->newoffs() += newaddr;
upx_byte *p = res->build(); if (res->dirsize()) {
memcpy(oresources,p,res->dirsize()); upx_byte *p = res->build();
delete [] p; memcpy(oresources,p,res->dirsize());
}
} }
static bool match(unsigned itype, const unsigned char *ntype, static bool match(unsigned itype, const unsigned char *ntype,
@@ -2767,12 +2773,13 @@ void PeFile::rebuildResources(upx_byte *& extrainfo, unsigned lastvaddr)
icondir_count = 0; icondir_count = 0;
} }
} }
upx_byte *p = res.build(); if (res.dirsize()) {
OCHECK(obuf + ODADDR(PEDIR_RESOURCE) - rvamin, 16); upx_byte *p = res.build();
// write back when the original is zeroed OCHECK(obuf + ODADDR(PEDIR_RESOURCE) - rvamin, 16);
if (get_le32(obuf + ODADDR(PEDIR_RESOURCE) - rvamin + 12) == 0) // 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()); omemcpy(obuf + ODADDR(PEDIR_RESOURCE) - rvamin, p, res.dirsize());
delete [] p; }
} }
template <typename LEXX, typename ord_mask_t> template <typename LEXX, typename ord_mask_t>
+3
View File
@@ -29,6 +29,8 @@
#ifndef __UPX_PEFILE_H #ifndef __UPX_PEFILE_H
#define __UPX_PEFILE_H 1 #define __UPX_PEFILE_H 1
#include "mem.h"
/************************************************************************* /*************************************************************************
// general/pe handling // general/pe handling
@@ -348,6 +350,7 @@ protected:
struct upx_rbranch; struct upx_rbranch;
struct upx_rleaf; struct upx_rleaf;
MemBuffer mem;
const upx_byte *start; const upx_byte *start;
upx_byte *newstart; upx_byte *newstart;
upx_rnode *root; upx_rnode *root;