Print this page
libconv

*** 475,506 **** /* demangle C++ names */ static char * demangled_name(char *s) { static char *buf = NULL; const char *dn; size_t len; dn = conv_demangle_name(s); /* * If not demangled, just return the symbol name */ ! if (strcmp(s, dn) == 0) return (s); - /* - * Demangled. Format it - */ - if (buf != NULL) - free(buf); - len = strlen(dn) + strlen(s) + 4; if ((buf = malloc(len)) == NULL) return (s); ! (void) snprintf(buf, len, "%s\t[%s]", dn, s); return (buf); } /* * Print the symbol table. Input is an ELF file descriptor, a --- 475,510 ---- /* demangle C++ names */ static char * demangled_name(char *s) { static char *buf = NULL; + size_t buflen = 0; const char *dn; size_t len; dn = conv_demangle_name(s); /* * If not demangled, just return the symbol name */ ! if (dn == s) return (s); len = strlen(dn) + strlen(s) + 4; + + if (buflen < len) { + free(buf); if ((buf = malloc(len)) == NULL) return (s); + buflen = len; + } ! /* ! * Demangled. Format it ! */ ! (void) snprintf(buf, buflen, "%s\t[%s]", dn, s); ! free(dn); return (buf); } /* * Print the symbol table. Input is an ELF file descriptor, a
*** 524,534 **** if (gelf_getclass(elf_file) == ELFCLASS64) adj = 8; while (range > 0) { ! char *sym_name = (char *)0; int type, bind; int specsec; unsigned int shndx; (void) gelf_getsym(sym_data, index, &sym); --- 528,538 ---- if (gelf_getclass(elf_file) == ELFCLASS64) adj = 8; while (range > 0) { ! char *sym_name = NULL; int type, bind; int specsec; unsigned int shndx; (void) gelf_getsym(sym_data, index, &sym);