summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsagitario <sagitario@fc51e93f-b9fe-4711-8d8d-3ae870c5f7d8>2011-07-12 07:24:50 (GMT)
committersagitario <sagitario@fc51e93f-b9fe-4711-8d8d-3ae870c5f7d8>2011-07-12 07:24:50 (GMT)
commit805aac230223f45acc7db218eb64589a4adb390e (patch)
treee1968414f146bbd1c4837a94812a70251b65f4c2 /src
parent6195df84cf3d988d95180fb13e5937ba2ee011e4 (diff)
downloadcv2pdb-805aac230223f45acc7db218eb64589a4adb390e.zip
cv2pdb-805aac230223f45acc7db218eb64589a4adb390e.tar.gz
cv2pdb-805aac230223f45acc7db218eb64589a4adb390e.tar.bz2
fix crash with compressed symbols expanding to more than 4096 characters
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp6
-rw-r--r--src/symutil.cpp4
2 files changed, 8 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 9b6c247..18c1631 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -87,7 +87,7 @@ int main(int argc, char** argv)
printf("License for redistribution is given by the Artistic License 2.0\n");
printf("see file LICENSE for further details\n");
printf("\n");
- printf("usage: %s [-Dversion|-C|-n] <exe-file> [new-exe-file] [pdb-file]\n", argv[0]);
+ printf("usage: %s [-Dversion|-C|-n|-sC] <exe-file> [new-exe-file] [pdb-file]\n", argv[0]);
return -1;
}
@@ -106,8 +106,10 @@ int main(int argc, char** argv)
Dversion = 0;
else if (argv[0][1] == 'n')
demangleSymbols = false;
+ else if (argv[0][1] == 's' && argv[0][2])
+ dotReplacementChar = argv[0][2];
else
- fatal("unknwon option: %s", argv[0]);
+ fatal("unknown option: %s", argv[0]);
}
if (!img.load(argv[1]))
diff --git a/src/symutil.cpp b/src/symutil.cpp
index faed579..61a4fa0 100644
--- a/src/symutil.cpp
+++ b/src/symutil.cpp
@@ -33,6 +33,8 @@ int dsym2c(const BYTE* p, int len, char* cname, int maxclen)
zpos = ((ch >> 3) & 7) + 1; // + zlen;
if (zpos > cpos)
break;
+ if (cpos + zlen >= maxclen)
+ break;
for (int z = 0; z < zlen; z++)
cname[cpos + z] = cname[cpos - zpos + z];
cpos += zlen;
@@ -49,6 +51,8 @@ int dsym2c(const BYTE* p, int len, char* cname, int maxclen)
zpos = (ch3 & 0x7f) | ((ch & 7) << 7);
if (zpos > cpos)
break;
+ if (cpos + zlen >= maxclen)
+ break;
for(int z = 0; z < zlen; z++)
cname[cpos + z] = cname[cpos - zpos + z];
cpos += zlen;