1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-11-23 16:07:37 +01:00

(lookup_symbol): Return -UNW_ENOINFO if symbol cannot be looked up for some reason.

Return -UNW_ENOMEM if string buffer is too small.  This makes the routine
	compatible with the definition of the unw_get_proc_name(3).

(Logical change 1.63)
This commit is contained in:
mostang.com!davidm 2003-03-19 19:25:18 +00:00
parent e24351b6c0
commit 7bfbbb6126

View file

@ -53,11 +53,11 @@ elfW (lookup_symbol) (unw_word_t ip, struct elf_image *ei,
ElfW (Off) soff, str_soff; ElfW (Off) soff, str_soff;
ElfW (Shdr) *shdr, *str_shdr; ElfW (Shdr) *shdr, *str_shdr;
ElfW (Addr) val, min_dist = ~(ElfW (Addr))0; ElfW (Addr) val, min_dist = ~(ElfW (Addr))0;
int i, ret = 0;
char *strtab; char *strtab;
int i;
if (!elfW (valid_object) (ei)) if (!elfW (valid_object) (ei))
return -1; return -UNW_ENOINFO;
soff = ehdr->e_shoff; soff = ehdr->e_shoff;
if (soff + ehdr->e_shnum * ehdr->e_shentsize > ei->size) if (soff + ehdr->e_shnum * ehdr->e_shentsize > ei->size)
@ -65,7 +65,7 @@ elfW (lookup_symbol) (unw_word_t ip, struct elf_image *ei,
debug (1, "%s: section table outside of image? (%lu > %lu)\n", debug (1, "%s: section table outside of image? (%lu > %lu)\n",
__FUNCTION__, soff + ehdr->e_shnum * ehdr->e_shentsize, __FUNCTION__, soff + ehdr->e_shnum * ehdr->e_shentsize,
ei->size); ei->size);
return -1; return -UNW_ENOINFO;
} }
shdr = (ElfW (Shdr) *) ((char *) ei->image + soff); shdr = (ElfW (Shdr) *) ((char *) ei->image + soff);
@ -110,9 +110,10 @@ elfW (lookup_symbol) (unw_word_t ip, struct elf_image *ei,
if ((ElfW (Addr)) (ip - val) < min_dist) if ((ElfW (Addr)) (ip - val) < min_dist)
{ {
min_dist = (ElfW (Addr)) (ip - val); min_dist = (ElfW (Addr)) (ip - val);
buf[buf_len - 1] = 'x';
strncpy (buf, strtab + sym->st_name, buf_len); strncpy (buf, strtab + sym->st_name, buf_len);
buf[buf_len - 1] = '\0'; buf[buf_len - 1] = '\0';
if (strlen (strtab + sym->st_name) >= buf_len)
ret = -UNW_ENOMEM;
} }
} }
} }
@ -124,10 +125,10 @@ elfW (lookup_symbol) (unw_word_t ip, struct elf_image *ei,
shdr = (Elf64_Shdr *) (((char *) shdr) + ehdr->e_shentsize); shdr = (Elf64_Shdr *) (((char *) shdr) + ehdr->e_shentsize);
} }
if (min_dist >= ei->size) if (min_dist >= ei->size)
return -1; /* not found */ return -UNW_ENOINFO; /* not found */
if (offp) if (offp)
*offp = min_dist; *offp = min_dist;
return 0; return ret;
} }
/* Find the ELF image that contains IP and return the "closest" /* Find the ELF image that contains IP and return the "closest"