When calling the C++ demangler, make sure to free the returned buffer,
which might have been reallocated. Pointed out by: stefanf
This commit is contained in:
parent
b95d8becdb
commit
404087cc06
@ -50,6 +50,26 @@ extern char *__cxa_demangle(const char *, char *, size_t *, int *);
|
|||||||
|
|
||||||
static void proc_rdl2prmap(rd_loadobj_t *, prmap_t *);
|
static void proc_rdl2prmap(rd_loadobj_t *, prmap_t *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
demangle(const char *symbol, char *buf, size_t len)
|
||||||
|
{
|
||||||
|
char *dembuf;
|
||||||
|
size_t demlen = len;
|
||||||
|
|
||||||
|
dembuf = malloc(len);
|
||||||
|
if (!dembuf)
|
||||||
|
goto fail;
|
||||||
|
dembuf = __cxa_demangle(symbol, dembuf, &demlen, NULL);
|
||||||
|
if (!dembuf)
|
||||||
|
goto fail;
|
||||||
|
strlcpy(buf, dembuf, len);
|
||||||
|
free(dembuf);
|
||||||
|
|
||||||
|
return;
|
||||||
|
fail:
|
||||||
|
strlcpy(buf, symbol, len);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
proc_rdl2prmap(rd_loadobj_t *rdl, prmap_t *map)
|
proc_rdl2prmap(rd_loadobj_t *rdl, prmap_t *map)
|
||||||
{
|
{
|
||||||
@ -268,9 +288,8 @@ proc_addr2sym(struct proc_handle *p, uintptr_t addr, char *name,
|
|||||||
if (addr >= rsym && addr <= (rsym + sym.st_size)) {
|
if (addr >= rsym && addr <= (rsym + sym.st_size)) {
|
||||||
s = elf_strptr(e, dynsymstridx, sym.st_name);
|
s = elf_strptr(e, dynsymstridx, sym.st_name);
|
||||||
if (s) {
|
if (s) {
|
||||||
if (strlen(s) > 2 &&
|
if (s[0] == '_' && s[1] == 'Z' && s[2])
|
||||||
s[0] == '_' && s[1] == 'Z')
|
demangle(s, name, namesz);
|
||||||
__cxa_demangle(s, name, &namesz, NULL);
|
|
||||||
else
|
else
|
||||||
strlcpy(name, s, namesz);
|
strlcpy(name, s, namesz);
|
||||||
memcpy(symcopy, &sym, sizeof(sym));
|
memcpy(symcopy, &sym, sizeof(sym));
|
||||||
@ -308,9 +327,8 @@ symtab:
|
|||||||
if (addr >= rsym && addr <= (rsym + sym.st_size)) {
|
if (addr >= rsym && addr <= (rsym + sym.st_size)) {
|
||||||
s = elf_strptr(e, symtabstridx, sym.st_name);
|
s = elf_strptr(e, symtabstridx, sym.st_name);
|
||||||
if (s) {
|
if (s) {
|
||||||
if (strlen(s) > 2 &&
|
if (s[0] == '_' && s[1] == 'Z' && s[2])
|
||||||
s[0] == '_' && s[1] == 'Z')
|
demangle(s, name, namesz);
|
||||||
__cxa_demangle(s, name, &namesz, NULL);
|
|
||||||
else
|
else
|
||||||
strlcpy(name, s, namesz);
|
strlcpy(name, s, namesz);
|
||||||
memcpy(symcopy, &sym, sizeof(sym));
|
memcpy(symcopy, &sym, sizeof(sym));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user