Fix 'refd != NULL' assertion in write_die [ Backport of master commits 6959430 and 7cc8aae. ] When running dwz on a file that contains invalid DW_FORM_ref_addr attributes (which has been observed to be generated by a google go compiler) we run either into an assert: ... $ dwz multidictionary dwz: dwz.c:9461: write_die: Assertion `refd != NULL' failed. Aborted (core dumped) ... or a segmentation fault in case of low-mem mode: ... $ dwz -l0 multidictionary Segmentation fault (core dumped) ... Fix this by erroring out instead: ... $ dwz multidictionary dwz: Couldn't find DIE at DW_FORM_ref_addr offset 0x97 ... 2019-02-05 Tom de Vries PR dwz/24169 * dwz.c (write_die): Error out on invalid DW_FORM_ref_addr. --- dwz.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dwz.c b/dwz.c index 928fefa..c7db337 100644 --- a/dwz.c +++ b/dwz.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -9124,6 +9125,9 @@ write_die (unsigned char *ptr, dw_cu_ref cu, dw_die_ref die, ? ptr_size : 4); inptr += refcu->cu_version == 2 ? ptr_size : 4; refd = off_htab_lookup (NULL, value); + if (refd == NULL || refd->die_tag == 0) + error (1, 0, "Couldn't find DIE at DW_FORM_ref_addr offset" + " 0x%" PRIx64, value); assert (refd != NULL); refdt = refd; while (refdt->die_toplevel == 0)