summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cv2pdb.cpp6
-rw-r--r--src/demangle.cpp32
-rw-r--r--src/symutil.cpp10
3 files changed, 28 insertions, 20 deletions
diff --git a/src/cv2pdb.cpp b/src/cv2pdb.cpp
index 8a94a58..4208f3f 100644
--- a/src/cv2pdb.cpp
+++ b/src/cv2pdb.cpp
@@ -340,9 +340,11 @@ static int copy_p2dsym(unsigned char* dp, int& dpos, const unsigned char* p, int
{
const BYTE* q = p + pos;
int plen = pstrlen(q);
- int len = dsym2c(q, plen, (char*) dp + dpos, maxdlen - dpos);
+ int len = min(plen, maxdlen - dpos);
+ memcpy(dp + dpos, q, len);
+ dp[dpos + len] = 0;
dpos += len + 1;
- pos = q - p + len;
+ pos = q - p + plen;
return len;
}
diff --git a/src/demangle.cpp b/src/demangle.cpp
index a2a4c13..a440b22 100644
--- a/src/demangle.cpp
+++ b/src/demangle.cpp
@@ -46,7 +46,7 @@ struct stringpool
*(char**)p = _first;
_first = p;
}
-
+
char* _first;
};
stringpool pool;
@@ -65,7 +65,7 @@ struct string
size_t length() const { return _len; }
char operator[] (size_t idx) const
- {
+ {
return _p[idx];
}
string substr(size_t pos, size_t len) const
@@ -97,29 +97,29 @@ struct string
_len += N - 1;
return *this;
}
- string operator+=(const string& s)
- {
+ string operator+=(const string& s)
+ {
assert(!_const);
assert(_len + s._len < maxLen);
memcpy(_p + _len, s._p, s._len);
_len += s._len;
return *this;
}
- string operator+=(char c)
- {
+ string operator+=(char c)
+ {
assert(!_const);
assert(_len < maxLen);
_p[_len++] = c;
return *this;
}
- template<int N>string operator=(const char (&p)[N])
+ template<int N>string operator=(const char (&p)[N])
{
_len = N-1;
memcpy(_p, p, _len);
_const = true;
return *this;
}
- string operator=(const string& s)
+ string operator=(const string& s)
{
assert(!_const);
_len = s._len;
@@ -176,7 +176,7 @@ class Demangle
public:
size_t ni;
string name;
-
+
static void error()
{
//writefln("error()");
@@ -185,7 +185,7 @@ public:
static ubyte ascii2hex(char c)
{
- if (!isxdigit(c))
+ if (!isxdigit((ubyte)c))
error();
return (ubyte)
( (c >= 'a') ? c - 'a' + 10 :
@@ -197,7 +197,7 @@ public:
//writefln("parseNumber() %d", ni);
size_t result = 0;
- while (ni < name.length && isdigit(name[ni]))
+ while (ni < name.length && isdigit((ubyte)name[ni]))
{
int i = name[ni] - '0';
if (result > (size_t_max - i) / 10)
@@ -250,7 +250,7 @@ public:
//writefln("parseQualifiedName() %d", ni);
string result;
- while (ni < name.length && isdigit(name[ni]))
+ while (ni < name.length && isdigit((ubyte)name[ni]))
{
if (result.length)
result += ".";
@@ -507,14 +507,14 @@ public:
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
i = ni - 1;
- while (ni < name.length && isdigit(name[ni]))
+ while (ni < name.length && isdigit((ubyte)name[ni]))
ni++;
result += name.substr(i, ni - i);
break;
case 'N':
i = ni;
- while (ni < name.length && isdigit(name[ni]))
+ while (ni < name.length && isdigit((ubyte)name[ni]))
ni++;
if (i == ni)
error();
@@ -590,7 +590,7 @@ public:
if (name.length < 3 ||
name[0] != '_' ||
name[1] != 'D' ||
- !isdigit(name[2]))
+ !isdigit((ubyte)name[2]))
{
goto Lnot;
}
@@ -627,7 +627,7 @@ void unittest()
{
// debug(demangle) printf("demangle.demangle.unittest\n");
- static string table[][2] =
+ static string table[][2] =
{
{ "_D6object14_moduleTlsCtorUZv15_moduleTlsCtor2MFAPS6object10ModuleInfoiZv", "void object._moduleTlsCtor._moduleTlsCtor2(struct object.ModuleInfo*[], int)"},
{ "_D7dparser3dmd8Template21TemplateTypeParameter13overloadMatchMFC7dparser3dmd8Template17TemplateParameterZi", "int dparser.dmd.Template.TemplateTypeParameter.overloadMatch(class dparser.dmd.Template.TemplateParameter)"},
diff --git a/src/symutil.cpp b/src/symutil.cpp
index f9ffa00..225235d 100644
--- a/src/symutil.cpp
+++ b/src/symutil.cpp
@@ -21,6 +21,7 @@ bool useTypedefEnum = false;
int dsym2c(const BYTE* p, int len, char* cname, int maxclen)
{
+ const BYTE* beg = p;
const BYTE* end = p + len;
int zlen, zpos, cpos = 0;
@@ -74,7 +75,7 @@ int dsym2c(const BYTE* p, int len, char* cname, int maxclen)
for(int z = 0; z < zlen; z++)
cname[cpos + z] = cname[cpos - zpos + z];
cpos += zlen;
- }
+ }
else if (ch > 0x80)
{
zlen = (ch & 0x7) + 1;
@@ -87,7 +88,12 @@ int dsym2c(const BYTE* p, int len, char* cname, int maxclen)
else
cname[cpos++] = ch;
}
-
+ if (p < end)
+ {
+ // decompression failed, assume it's containing UTF8 encoded characters
+ cpos = min(maxclen, len);
+ memcpy(cname, beg, cpos);
+ }
cname[cpos] = 0;
if(demangleSymbols)
if (cname[0] == '_' && cname[1] == 'D' && isdigit(cname[2]))