From 8141ac31ee373b67970c6b8d06a8a003df16845c80ed2e05e2ffbb3a65e89e33 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Fri, 24 Jan 2020 19:44:43 +0000 Subject: [PATCH] Accepting request 766977 from home:tomdevries:branches:devel:tools:compiler-dwz-fix-segfault-die-cu - Fix segfault in die_cu [swo#25456]. * dwz-fix-segfault-in-die_cu.patch OBS-URL: https://build.opensuse.org/request/show/766977 OBS-URL: https://build.opensuse.org/package/show/devel:tools:compiler/dwz?expand=0&rev=28 --- dwz-fix-segfault-in-die_cu.patch | 55 ++++++++++++++++++++++++++++++++ dwz.changes | 6 ++++ dwz.spec | 2 ++ 3 files changed, 63 insertions(+) create mode 100644 dwz-fix-segfault-in-die_cu.patch diff --git a/dwz-fix-segfault-in-die_cu.patch b/dwz-fix-segfault-in-die_cu.patch new file mode 100644 index 0000000..9e849a3 --- /dev/null +++ b/dwz-fix-segfault-in-die_cu.patch @@ -0,0 +1,55 @@ +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 + + 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)); diff --git a/dwz.changes b/dwz.changes index 40f051c..c1b43a2 100644 --- a/dwz.changes +++ b/dwz.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Jan 24 17:08:55 UTC 2020 - Tom de Vries + +- Fix segfault in die_cu [swo#25456]. + * dwz-fix-segfault-in-die_cu.patch + ------------------------------------------------------------------- Fri Jan 17 06:30:58 UTC 2020 - Tom de Vries diff --git a/dwz.spec b/dwz.spec index 5949486..78bc2e3 100644 --- a/dwz.spec +++ b/dwz.spec @@ -78,6 +78,7 @@ Patch2: dwz-fix-die-no-multifile-propagation.patch 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 @@ This package contains the testsuite results from DWZ. %patch3 -p1 %patch4 -p1 %patch5 -p1 +%patch6 -p1 %build make %{?_smp_mflags} CFLAGS="%{optflags}"