diff options
author | Nobuyoshi Nakada <[email protected]> | 2023-08-03 01:43:31 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-08-03 09:51:52 +0900 |
commit | fe977314d5a9fdf721584c0396e1040960d78000 (patch) | |
tree | da8559e06a8217a0f87957cf29b9bfe0a3a20431 /addr2line.c | |
parent | 4b6c584023f41827c891f33a16cb5db221b7cd19 (diff) |
Check if reader members are set
Diffstat (limited to 'addr2line.c')
-rw-r--r-- | addr2line.c | 17 |
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; |