aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Chisnall <dchisnall@pathscale.com>2014-05-09 01:35:37 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-05-09 01:35:37 +0000
commitf44a20dc3fb460e389933e84ee65c28d3987a809 (patch)
tree1bc755d674965bdb5308a99564f787286a3e3167
parent91803f2ab9d35835dba736e0e8d3e278c8d9a5a9 (diff)
parentdafd555f547386c8c25f9afd07ea3693db13e52a (diff)
downloadlibcxxrt-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.c14
-rw-r--r--src/typeinfo.cc13
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);