diff options
author | AlexWhiter <a.whiter@yandex.ru> | 2018-04-05 17:21:54 (GMT) |
---|---|---|
committer | AlexWhiter <a.whiter@yandex.ru> | 2018-04-05 17:21:54 (GMT) |
commit | 833bfaa509c338d9458b3b549194290e78eb7345 (patch) | |
tree | 29a34e36d26a27a0db28deee805c3d7f75e1ed07 /src/cv2pdb.cpp | |
parent | a7749963973ea5448ec203602af67a3a69d3138f (diff) | |
download | cv2pdb-833bfaa509c338d9458b3b549194290e78eb7345.zip cv2pdb-833bfaa509c338d9458b3b549194290e78eb7345.tar.gz cv2pdb-833bfaa509c338d9458b3b549194290e78eb7345.tar.bz2 |
1. If exe-file consisted of just a disk letter and a file name (i.e. c:file.exe), AV occured.
2. Aligning the debug section offset to the closest 16-byte boundary.
Diffstat (limited to 'src/cv2pdb.cpp')
-rw-r--r-- | src/cv2pdb.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/cv2pdb.cpp b/src/cv2pdb.cpp index 84cf5f2..9b7edbf 100644 --- a/src/cv2pdb.cpp +++ b/src/cv2pdb.cpp @@ -18,7 +18,7 @@ static const int typePrefix = 4;
CV2PDB::CV2PDB(PEImage& image)
-: img(image), pdb(0), dbi(0), tpi(0), ipi(0), libraries(0), rsds(0), modules(0), globmod(0)
+: img(image), pdb(0), dbi(0), tpi(0), ipi(0), libraries(0), rsds(0), rsdsLen(0), modules(0), globmod(0)
, segMap(0), segMapDesc(0), segFrame2Index(0), globalTypeHeader(0)
, globalTypes(0), cbGlobalTypes(0), allocGlobalTypes(0)
, userTypes(0), cbUserTypes(0), allocUserTypes(0)
@@ -166,7 +166,11 @@ bool CV2PDB::openPDB(const TCHAR* pdbname, const TCHAR* pdbref) printf("PDB::QueryPdbImplementationVersion() = %d\n", pdb->QueryPdbImplementationVersion());
#endif
- rsds = (OMFSignatureRSDS *) new char[24 + strlen(pdbnameA) + 1]; // sizeof(OMFSignatureRSDS) without name
+ rsdsLen = 24 + strlen(pdbnameA) + 1; // sizeof(OMFSignatureRSDS) without name
+ // Growing the RSDS block to the closest 16-byte boundary.
+ if (rsdsLen & 0xF)
+ rsdsLen = (rsdsLen | 0xF) + 1;
+ rsds = (OMFSignatureRSDS *) new char[rsdsLen];
memcpy (rsds->Signature, "RSDS", 4);
pdb->QuerySignature2(&rsds->guid);
rsds->age = pdb->QueryAge();
@@ -3434,8 +3438,7 @@ bool CV2PDB::addSymbols() bool CV2PDB::writeImage(const TCHAR* opath, PEImage& exeImage)
{
- int len = sizeof(*rsds) + strlen((char*)(rsds + 1)) + 1;
- if (!exeImage.replaceDebugSection(rsds, len, true))
+ if (!exeImage.replaceDebugSection(rsds, rsdsLen, true))
return setError(exeImage.getLastError());
if (!exeImage.save(opath))
|