56 lines
1.4 KiB
Diff
56 lines
1.4 KiB
Diff
|
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 <tdevries@suse.de>
|
||
|
|
||
|
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 <stdbool.h>
|
||
|
#include <stddef.h>
|
||
|
#include <stdint.h>
|
||
|
+#include <inttypes.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <unistd.h>
|
||
|
#include <sys/mman.h>
|
||
|
@@ -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)
|