From 6e3db44adbb111903913c1ee85c46fe2303b4d08 Mon Sep 17 00:00:00 2001 From: Rainer Schuetze Date: Tue, 9 Aug 2016 08:30:55 +0200 Subject: * do not uncompress names in field lists * copy symbol unmodified if uncompression fails --- src/cv2pdb.cpp | 6 ++++-- src/demangle.cpp | 32 ++++++++++++++++---------------- src/symutil.cpp | 10 ++++++++-- 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; } - templatestring operator=(const char (&p)[N]) + templatestring 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])) -- cgit v0.12