diff options
author | David Chisnall <dchisnall@pathscale.com> | 2014-05-09 01:35:37 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-05-09 01:35:37 +0000 |
commit | f44a20dc3fb460e389933e84ee65c28d3987a809 (patch) | |
tree | 1bc755d674965bdb5308a99564f787286a3e3167 | |
parent | 91803f2ab9d35835dba736e0e8d3e278c8d9a5a9 (diff) | |
parent | dafd555f547386c8c25f9afd07ea3693db13e52a (diff) | |
download | libcxxrt-f44a20dc3fb460e389933e84ee65c28d3987a809.tar.gz |
am dafd555f: Fix (anonymous namespace) demangling. Avoid a redundant malloc() / memcpy.
* commit 'dafd555f547386c8c25f9afd07ea3693db13e52a':
Fix (anonymous namespace) demangling. Avoid a redundant malloc() / memcpy.
-rw-r--r-- | src/libelftc_dem_gnu3.c | 14 | ||||
-rw-r--r-- | src/typeinfo.cc | 13 |
2 files changed, 24 insertions, 3 deletions
diff --git a/src/libelftc_dem_gnu3.c b/src/libelftc_dem_gnu3.c index de35518..11c2ca2 100644 --- a/src/libelftc_dem_gnu3.c +++ b/src/libelftc_dem_gnu3.c @@ -459,6 +459,7 @@ __cxa_demangle_gnu3(const char *org) if (org == NULL) return (NULL); + org_len = strlen(org); if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) { if ((rtn = malloc(org_len + 19)) == NULL) return (NULL); @@ -468,7 +469,7 @@ __cxa_demangle_gnu3(const char *org) } // Try demangling as a type for short encodings - if (((org_len = strlen(org)) < 2) || (org[0] != '_' || org[1] != 'Z' )) { + if ((org_len < 2) || (org[0] != '_' || org[1] != 'Z' )) { if (!cpp_demangle_data_init(&ddata, org)) return (NULL); if (!cpp_demangle_read_type(&ddata, 0)) @@ -1870,9 +1871,18 @@ static int cpp_demangle_read_sname(struct cpp_demangle_data *ddata) { long len; + int err; if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 || - len <= 0 || cpp_demangle_push_str(ddata, ddata->cur, len) == 0) + len <= 0) + return (0); + + if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0)) + err = cpp_demangle_push_str(ddata, "(anonymous namespace)", 21); + else + err = cpp_demangle_push_str(ddata, ddata->cur, len); + + if (err == 0) return (0); assert(ddata->output.size > 0); diff --git a/src/typeinfo.cc b/src/typeinfo.cc index f941abd..fda5196 100644 --- a/src/typeinfo.cc +++ b/src/typeinfo.cc @@ -86,7 +86,18 @@ extern "C" char* __cxa_demangle(const char* mangled_name, if (NULL != demangled) { size_t len = strlen(demangled); - buf = (char*)realloc(buf, len+1); + if (buf == NULL) + { + if (n) + { + *n = len; + } + return demangled; + } + if (*n < len+1) + { + buf = (char*)realloc(buf, len+1); + } if (0 != buf) { memcpy(buf, demangled, len); |