migrate to MemBuffer class from New() to remove leak
This commit is contained in:
+23
-16
@@ -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());
|
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;
|
||||||
}
|
}
|
||||||
@@ -1825,9 +1830,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,
|
||||||
@@ -2757,12 +2763,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>
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -341,6 +343,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;
|
||||||
|
|||||||
Reference in New Issue
Block a user