summaryrefslogtreecommitdiff
path: root/addr2line.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-03 01:43:31 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-03 09:51:52 +0900
commitfe977314d5a9fdf721584c0396e1040960d78000 (patch)
treeda8559e06a8217a0f87957cf29b9bfe0a3a20431 /addr2line.c
parent4b6c584023f41827c891f33a16cb5db221b7cd19 (diff)
Check if reader members are set
Diffstat (limited to 'addr2line.c')
-rw-r--r--addr2line.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/addr2line.c b/addr2line.c
index ebb9e1e568..287a69d5e4 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -1165,20 +1165,25 @@ resolve_strx(DebugInfoReader *reader, uint64_t idx)
return reader->obj->debug_str.ptr + off;
}
-static void
-debug_info_reader_read_addr_value_member(DebugInfoReader *reader, DebugInfoValue *v, int size, const char *mem)
+static bool
+debug_info_reader_read_addr_value_member(DebugInfoReader *reader, DebugInfoValue *v, int size)
{
if (size == 4) {
set_uint_value(v, read_uint32(&reader->p));
} else if (size == 8) {
set_uint_value(v, read_uint64(&reader->p));
} else {
- UNREACHABLE; /* should have checked already */
+ return false;
}
+ return true;
}
#define debug_info_reader_read_addr_value(reader, v, mem) \
- debug_info_reader_read_addr_value_member((reader), (v), (reader)->mem, #mem)
+ if (!debug_info_reader_read_addr_value_member((reader), (v), (reader)->mem)) { \
+ kprintf("unknown " #mem ":%d", (reader)->mem); \
+ return false; \
+ }
+
static bool
debug_info_reader_read_value(DebugInfoReader *reader, uint64_t form, DebugInfoValue *v)
@@ -1935,7 +1940,7 @@ debug_info_read(DebugInfoReader *reader, int num_traces, void **traces,
uintptr_t saddr = ranges_include(reader, &ranges, offset, &rnglists_header);
if (saddr == UINTPTR_MAX) return false;
if (saddr) {
- /* fprintf(stdout, "%d:%tx: %d %lx->%lx %x %s: %s/%s %d %s %s %s\n",__LINE__,die.pos, i,addr,offset, die.tag,line.sname,line.dirname,line.filename,line.line,reader->obj->path,line.sname,lines[i].sname); */
+ /* kprintf("%d:%tx: %d %lx->%lx %x %s: %s/%s %d %s %s %s\n",__LINE__,die.pos, i,addr,offset, die.tag,line.sname,line.dirname,line.filename,line.line,reader->obj->path,line.sname,lines[i].sname); */
if (lines[i].sname) {
line_info_t *lp = malloc(sizeof(line_info_t));
memcpy(lp, &lines[i], sizeof(line_info_t));
@@ -1981,7 +1986,7 @@ parse_ver5_debug_line_header(const char *p, int idx, uint8_t format, obj_info_t
int entry_count = (int)uleb128(&p);
- DebugInfoReader reader;
+ DebugInfoReader reader = {0};
debug_info_reader_init(&reader, obj);
reader.format = format;
reader.p = p;