From df4c6406c97560e88bcdcf5c68556030f80db0b0 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Fri, 1 Sep 2023 09:19:06 -0700 Subject: [PATCH] elfparser: demangle legacy rust $GT$ and $LT$ Related #2090 --- contrib/elfparser/demangle.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/contrib/elfparser/demangle.cpp b/contrib/elfparser/demangle.cpp index 1b2852dd..b6311f70 100644 --- a/contrib/elfparser/demangle.cpp +++ b/contrib/elfparser/demangle.cpp @@ -27,6 +27,8 @@ sysprof_cplus_demangle (const char *name) char *real_name; char *ret; int status; + guint i; + guint j; if (name == NULL) return NULL; @@ -36,7 +38,30 @@ sysprof_cplus_demangle (const char *name) if (real_name == NULL) return NULL; - ret = g_strdup (real_name); + /* We need to return a string that is guaranteed it can be freed with + * g_free() rather than free(), so we might as well look for Legacy + * Rust mangling like '$LT$' and '$GT$' while we're at it. + */ + + ret = (char *)g_malloc (strlen (real_name) + 1); + + for (i = 0, j = 0; real_name[i]; i++) + { + if (real_name[i] == '$') + { + if (real_name[i+1] == 'L' && real_name[i+2] == 'T' && real_name[i+3] == '$') + ret[j++] = '<', i += 3; + else if (real_name[i+1] == 'G' && real_name[i+2] == 'T' && real_name[i+3] == '$') + ret[j++] = '>', i += 3; + } + else + { + ret[j++] = real_name[i]; + } + } + + ret[j] = 0; + free (real_name); return ret;