|
@@ -31,6 +31,8 @@
|
|
|
#include "elf.h"
|
|
|
#include "warn.h"
|
|
|
|
|
|
+#define MAX_NAME_LEN 128
|
|
|
+
|
|
|
struct section *find_section_by_name(struct elf *elf, const char *name)
|
|
|
{
|
|
|
struct section *sec;
|
|
@@ -298,6 +300,8 @@ static int read_symbols(struct elf *elf)
|
|
|
/* Create parent/child links for any cold subfunctions */
|
|
|
list_for_each_entry(sec, &elf->sections, list) {
|
|
|
list_for_each_entry(sym, &sec->symbol_list, list) {
|
|
|
+ char pname[MAX_NAME_LEN + 1];
|
|
|
+ size_t pnamelen;
|
|
|
if (sym->type != STT_FUNC)
|
|
|
continue;
|
|
|
sym->pfunc = sym->cfunc = sym;
|
|
@@ -305,9 +309,16 @@ static int read_symbols(struct elf *elf)
|
|
|
if (!coldstr)
|
|
|
continue;
|
|
|
|
|
|
- coldstr[0] = '\0';
|
|
|
- pfunc = find_symbol_by_name(elf, sym->name);
|
|
|
- coldstr[0] = '.';
|
|
|
+ pnamelen = coldstr - sym->name;
|
|
|
+ if (pnamelen > MAX_NAME_LEN) {
|
|
|
+ WARN("%s(): parent function name exceeds maximum length of %d characters",
|
|
|
+ sym->name, MAX_NAME_LEN);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ strncpy(pname, sym->name, pnamelen);
|
|
|
+ pname[pnamelen] = '\0';
|
|
|
+ pfunc = find_symbol_by_name(elf, pname);
|
|
|
|
|
|
if (!pfunc) {
|
|
|
WARN("%s(): can't find parent function",
|