Hello community, here is the log from the commit of package dwz for openSUSE:Factory checked in at 2020-02-03 11:10:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dwz (Old) and /work/SRC/openSUSE:Factory/.dwz.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dwz" Mon Feb 3 11:10:32 2020 rev:12 rq:766978 version:0.13 Changes: -------- --- /work/SRC/openSUSE:Factory/dwz/dwz.changes 2020-01-23 16:08:06.363536001 +0100 +++ /work/SRC/openSUSE:Factory/.dwz.new.26092/dwz.changes 2020-02-03 11:10:33.589761278 +0100 @@ -1,0 +2,6 @@ +Fri Jan 24 17:08:55 UTC 2020 - Tom de Vries <[email protected]> + +- Fix segfault in die_cu [swo#25456]. + * dwz-fix-segfault-in-die_cu.patch + +------------------------------------------------------------------- New: ---- dwz-fix-segfault-in-die_cu.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dwz.spec ++++++ --- /var/tmp/diff_new_pack.vgQfva/_old 2020-02-03 11:10:34.621761800 +0100 +++ /var/tmp/diff_new_pack.vgQfva/_new 2020-02-03 11:10:34.625761802 +0100 @@ -78,6 +78,7 @@ Patch3: dwz-fix-assertion-off-cu_size-in-recompute_abbrevs.patch Patch4: dwz-fix-refd-NULL-assertion-in-write_die.patch Patch5: dwz-fix-reference-from-pu-to-cu.patch +Patch6: dwz-fix-segfault-in-die_cu.patch %if %{build_main} %description @@ -111,6 +112,7 @@ %patch3 -p1 %patch4 -p1 %patch5 -p1 +%patch6 -p1 %build make %{?_smp_mflags} CFLAGS="%{optflags}" ++++++ dwz-fix-segfault-in-die_cu.patch ++++++ Fix segfault in die_cu [ Backport of master commit e2c440e. ] When running dwz in normal mode, we get an error: ... $ dwz clang-offload-bundler-10.debug -lnone dwz: clang-offload-bundler-10.debug: Couldn't find DIE referenced by \ DW_OP_GNU_implicit_pointer ... but when forcing low-mem mode, we get a segfault: ... $ dwz clang-offload-bundler-10.debug -l0 Segmentation fault (core dumped) ... In normal mode, we hit the error here: ... ref = off_htab_lookup (NULL, addr); if (ref == NULL) { error (0, 0, "%s: Couldn't find DIE referenced by %s", dso->filename, get_DW_OP_str (op)); ... but for low-mem mode, this doesn't trigger, because we find the dummy DIE that has been added by read_exprloc_low_mem_phase1. Fix this by testing for the dummy DIE in the error condition: ... - if (ref == NULL) + if (ref == NULL || (unlikely (low_mem) && ref->die_tag == 0)) ... 2020-01-24 Tom de Vries <[email protected]> PR dwz/25456 * dwz.c (read_exprloc): Test for dummy DIE in error condition. --- dwz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dwz.c b/dwz.c index 298bca1..44b5ba3 100644 --- a/dwz.c +++ b/dwz.c @@ -1597,7 +1597,7 @@ read_exprloc (DSO *dso, dw_die_ref die, unsigned char *ptr, size_t len, else ptr += 4; ref = off_htab_lookup (NULL, addr); - if (ref == NULL) + if (ref == NULL || (unlikely (low_mem) && ref->die_tag == 0)) { error (0, 0, "%s: Couldn't find DIE referenced by %s", dso->filename, get_DW_OP_str (op));
