diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index c2963f5fe8a..cbd80a356b8 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,3 +1,8 @@ +2018-11-22 Tom de Vries + + * dwarf.c (read_initial_length): Factor out of ... + (build_address_map, read_line_info): ... here. + 2018-11-21 Tom de Vries * dwarf.c (read_string): Factor out of ... diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c index c4f8732c7eb..4e93f120820 100644 --- a/libbacktrace/dwarf.c +++ b/libbacktrace/dwarf.c @@ -651,6 +651,25 @@ leb128_len (const unsigned char *p) return ret; } +/* Read initial_length from BUF and advance the appropriate number of bytes. */ + +static uint64_t +read_initial_length (struct dwarf_buf *buf, int *is_dwarf64) +{ + uint64_t len; + + len = read_uint32 (buf); + if (len == 0xffffffff) + { + len = read_uint64 (buf); + *is_dwarf64 = 1; + } + else + *is_dwarf64 = 0; + + return len; +} + /* Free an abbreviations structure. */ static void @@ -1463,14 +1482,7 @@ build_address_map (struct backtrace_state *state, uintptr_t base_address, unit_data_start = info.buf; - is_dwarf64 = 0; - len = read_uint32 (&info); - if (len == 0xffffffff) - { - len = read_uint64 (&info); - is_dwarf64 = 1; - } - + len = read_initial_length (&info, &is_dwarf64); unit_buf = info; unit_buf.left = len; @@ -2002,13 +2014,7 @@ read_line_info (struct backtrace_state *state, struct dwarf_data *ddata, line_buf.data = data; line_buf.reported_underflow = 0; - is_dwarf64 = 0; - len = read_uint32 (&line_buf); - if (len == 0xffffffff) - { - len = read_uint64 (&line_buf); - is_dwarf64 = 1; - } + len = read_initial_length (&line_buf, &is_dwarf64); line_buf.left = len; if (!read_line_header (state, u, is_dwarf64, &line_buf, hdr))