Aaron Merey 03f159
From c791d16b7dcf9d985ebe0e852481142753603353 Mon Sep 17 00:00:00 2001
Aaron Merey 03f159
From: Aaron Merey <amerey@redhat.com>
Aaron Merey 03f159
Date: Fri, 8 Dec 2023 16:44:35 -0500
Aaron Merey 03f159
Subject: [PATCH] libdwfl: Correctly handle corefile non-contiguous segments
Aaron Merey 03f159
Aaron Merey 03f159
It is possible for segments of different shared libaries to be interleaved
Aaron Merey 03f159
in memory such that the segments of one library are located in between
Aaron Merey 03f159
non-contiguous segments of another library.
Aaron Merey 03f159
Aaron Merey 03f159
For example, this can be seen with firefox on RHEL 7.9 where multiple
Aaron Merey 03f159
shared libraries could be mapped in between ld-2.17.so segments:
Aaron Merey 03f159
Aaron Merey 03f159
      [...]
Aaron Merey 03f159
      7f0972082000-7f09720a4000 00000000 139264      /usr/lib64/ld-2.17.so
Aaron Merey 03f159
      7f09720a4000-7f09720a5000 00000000 4096        /memfd:mozilla-ipc (deleted)
Aaron Merey 03f159
      7f09720a5000-7f09720a7000 00000000 8192        /memfd:mozilla-ipc (deleted)
Aaron Merey 03f159
      7f09720a7000-7f09720a9000 00000000 8192        /memfd:mozilla-ipc (deleted)
Aaron Merey 03f159
      7f0972134000-7f0972136000 00000000 8192        /usr/lib64/firefox/libmozwayland.so
Aaron Merey 03f159
      7f0972136000-7f0972137000 00002000 4096        /usr/lib64/firefox/libmozwayland.so
Aaron Merey 03f159
      7f0972137000-7f0972138000 00003000 4096        /usr/lib64/firefox/libmozwayland.so
Aaron Merey 03f159
      7f0972138000-7f0972139000 00003000 4096        /usr/lib64/firefox/libmozwayland.so
Aaron Merey 03f159
      7f097213a000-7f0972147000 00000000 53248       /usr/lib64/firefox/libmozsqlite3.so
Aaron Merey 03f159
      7f0972147000-7f097221e000 0000d000 880640      /usr/lib64/firefox/libmozsqlite3.so
Aaron Merey 03f159
      7f097221e000-7f0972248000 000e4000 172032      /usr/lib64/firefox/libmozsqlite3.so
Aaron Merey 03f159
      7f0972248000-7f0972249000 0010e000 4096        /usr/lib64/firefox/libmozsqlite3.so
Aaron Merey 03f159
      7f0972249000-7f097224c000 0010e000 12288       /usr/lib64/firefox/libmozsqlite3.so
Aaron Merey 03f159
      7f097224c000-7f0972250000 00111000 16384       /usr/lib64/firefox/libmozsqlite3.so
Aaron Merey 03f159
      7f0972250000-7f0972253000 00000000 12288       /usr/lib64/firefox/liblgpllibs.so
Aaron Merey 03f159
      [...]
Aaron Merey 03f159
      7f09722a3000-7f09722a4000 00021000 4096        /usr/lib64/ld-2.17.so
Aaron Merey 03f159
      7f09722a4000-7f09722a5000 00022000 4096        /usr/lib64/ld-2.17.so
Aaron Merey 03f159
Aaron Merey 03f159
dwfl_segment_report_module did not account for the possibility of
Aaron Merey 03f159
interleaving non-contiguous segments, resulting in premature closure
Aaron Merey 03f159
of modules as well as failing to report modules.
Aaron Merey 03f159
Aaron Merey 03f159
Fix this by removing segment skipping in dwfl_segment_report_module.
Aaron Merey 03f159
When dwfl_segment_report_module reported a module, it would return
Aaron Merey 03f159
the index of the segment immediately following the end address of the
Aaron Merey 03f159
current module.  Since there's a chance that other modules might fall
Aaron Merey 03f159
within this address range, dwfl_segment_report_module instead returns
Aaron Merey 03f159
the index of the next segment.
Aaron Merey 03f159
Aaron Merey 03f159
This patch also fixes premature module closure that can occur in
Aaron Merey 03f159
dwfl_segment_report_module when interleaving non-contiguous segments
Aaron Merey 03f159
are found.  Previously modules with start and end addresses that overlap
Aaron Merey 03f159
with the current segment would have their build-ids compared with the
Aaron Merey 03f159
current segment's build-id.  If there was a mismatch, that module would
Aaron Merey 03f159
be closed.  Avoid closing modules in this case when mismatching build-ids
Aaron Merey 03f159
correspond to distinct modules.
Aaron Merey 03f159
Aaron Merey 03f159
https://sourceware.org/bugzilla/show_bug.cgi?id=30975
Aaron Merey 03f159
Aaron Merey 03f159
Signed-off-by: Aaron Merey <amerey@redhat.com>
Aaron Merey 03f159
---
Aaron Merey 03f159
 libdwfl/dwfl_segment_report_module.c | 37 +++++++++----
Aaron Merey 03f159
 tests/Makefile.am                    |  8 ++-
Aaron Merey 03f159
 tests/dwfl-core-noncontig.c          | 82 ++++++++++++++++++++++++++++
Aaron Merey 03f159
 tests/run-dwfl-core-noncontig.sh     | 63 +++++++++++++++++++++
Aaron Merey 03f159
 4 files changed, 176 insertions(+), 14 deletions(-)
Aaron Merey 03f159
 create mode 100644 tests/dwfl-core-noncontig.c
Aaron Merey 03f159
 create mode 100755 tests/run-dwfl-core-noncontig.sh
Aaron Merey 03f159
Aaron Merey 03f159
diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c
Aaron Merey 03f159
index 3ef62a7..09ee37b 100644
Aaron Merey 03f159
--- a/libdwfl/dwfl_segment_report_module.c
Aaron Merey 03f159
+++ b/libdwfl/dwfl_segment_report_module.c
Aaron Merey 03f159
@@ -737,17 +737,34 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
Aaron Merey 03f159
 	        && invalid_elf (module->elf, module->disk_file_has_build_id,
Aaron Merey 03f159
 				&build_id))
Aaron Merey 03f159
 	      {
Aaron Merey 03f159
-		elf_end (module->elf);
Aaron Merey 03f159
-		close (module->fd);
Aaron Merey 03f159
-		module->elf = NULL;
Aaron Merey 03f159
-		module->fd = -1;
Aaron Merey 03f159
+		/* If MODULE's build-id doesn't match the disk file's
Aaron Merey 03f159
+		   build-id, close ELF only if MODULE and ELF refer to
Aaron Merey 03f159
+		   different builds of files with the same name.  This
Aaron Merey 03f159
+		   prevents premature closure of the correct ELF in cases
Aaron Merey 03f159
+		   where segments of a module are non-contiguous in memory.  */
Aaron Merey 03f159
+		if (name != NULL && module->name[0] != '\0'
Aaron Merey 03f159
+		    && strcmp (basename (module->name), basename (name)) == 0)
Aaron Merey 03f159
+		  {
Aaron Merey 03f159
+		    elf_end (module->elf);
Aaron Merey 03f159
+		    close (module->fd);
Aaron Merey 03f159
+		    module->elf = NULL;
Aaron Merey 03f159
+		    module->fd = -1;
Aaron Merey 03f159
+		  }
Aaron Merey 03f159
 	      }
Aaron Merey 03f159
-	    if (module->elf != NULL)
Aaron Merey 03f159
+	    else if (module->elf != NULL)
Aaron Merey 03f159
 	      {
Aaron Merey 03f159
-		/* Ignore this found module if it would conflict in address
Aaron Merey 03f159
-		   space with any already existing module of DWFL.  */
Aaron Merey 03f159
+		/* This module has already been reported.  */
Aaron Merey 03f159
 		skip_this_module = true;
Aaron Merey 03f159
 	      }
Aaron Merey 03f159
+	    else
Aaron Merey 03f159
+	      {
Aaron Merey 03f159
+		/* Only report this module if we haven't already done so.  */
Aaron Merey 03f159
+		for (Dwfl_Module *mod = dwfl->modulelist; mod != NULL;
Aaron Merey 03f159
+		     mod = mod->next)
Aaron Merey 03f159
+		  if (mod->low_addr == module_start
Aaron Merey 03f159
+		      && mod->high_addr == module_end)
Aaron Merey 03f159
+		    skip_this_module = true;
Aaron Merey 03f159
+	      }
Aaron Merey 03f159
 	  }
Aaron Merey 03f159
       if (skip_this_module)
Aaron Merey 03f159
 	goto out;
Aaron Merey 03f159
@@ -781,10 +798,6 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
Aaron Merey 03f159
 	}
Aaron Merey 03f159
     }
Aaron Merey 03f159
 
Aaron Merey 03f159
-  /* Our return value now says to skip the segments contained
Aaron Merey 03f159
-     within the module.  */
Aaron Merey 03f159
-  ndx = addr_segndx (dwfl, segment, module_end, true);
Aaron Merey 03f159
-
Aaron Merey 03f159
   /* Examine its .dynamic section to get more interesting details.
Aaron Merey 03f159
      If it has DT_SONAME, we'll use that as the module name.
Aaron Merey 03f159
      If it has a DT_DEBUG, then it's actually a PIE rather than a DSO.
Aaron Merey 03f159
@@ -929,6 +942,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
Aaron Merey 03f159
       ndx = -1;
Aaron Merey 03f159
       goto out;
Aaron Merey 03f159
     }
Aaron Merey 03f159
+  else
Aaron Merey 03f159
+    ndx++;
Aaron Merey 03f159
 
Aaron Merey 03f159
   /* We have reported the module.  Now let the caller decide whether we
Aaron Merey 03f159
      should read the whole thing in right now.  */
Aaron Merey 03f159
diff --git a/tests/Makefile.am b/tests/Makefile.am
Aaron Merey 03f159
index 7fb8efb..9f8f769 100644
Aaron Merey 03f159
--- a/tests/Makefile.am
Aaron Merey 03f159
+++ b/tests/Makefile.am
Aaron Merey 03f159
@@ -42,7 +42,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \
Aaron Merey 03f159
 		  dwfl-bug-addr-overflow arls dwfl-bug-fd-leak \
Aaron Merey 03f159
 		  dwfl-addr-sect dwfl-bug-report early-offscn \
Aaron Merey 03f159
 		  dwfl-bug-getmodules dwarf-getmacros dwarf-ranges addrcfi \
Aaron Merey 03f159
-		  dwarfcfi \
Aaron Merey 03f159
+		  dwfl-core-noncontig dwarfcfi \
Aaron Merey 03f159
 		  test-flag-nobits dwarf-getstring rerequest_tag \
Aaron Merey 03f159
 		  alldts typeiter typeiter2 low_high_pc \
Aaron Merey 03f159
 		  test-elf_cntl_gelf_getshdr dwflsyms dwfllines \
Aaron Merey 03f159
@@ -212,7 +212,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \
Aaron Merey 03f159
 	$(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \
Aaron Merey 03f159
 	run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \
Aaron Merey 03f159
 	run-readelf-dw-form-indirect.sh run-strip-largealign.sh \
Aaron Merey 03f159
-	run-readelf-Dd.sh
Aaron Merey 03f159
+	run-readelf-Dd.sh run-dwfl-core-noncontig.sh
Aaron Merey 03f159
 
Aaron Merey 03f159
 if !BIARCH
Aaron Merey 03f159
 export ELFUTILS_DISABLE_BIARCH = 1
Aaron Merey 03f159
@@ -632,7 +632,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
Aaron Merey 03f159
 	     run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \
Aaron Merey 03f159
 	     testfile_nvidia_linemap.bz2 \
Aaron Merey 03f159
 	     testfile-largealign.o.bz2 run-strip-largealign.sh \
Aaron Merey 03f159
-	     run-funcretval++11.sh
Aaron Merey 03f159
+	     run-funcretval++11.sh \
Aaron Merey 03f159
+	     run-dwfl-core-noncontig.sh testcore-noncontig.bz2
Aaron Merey 03f159
 
Aaron Merey 03f159
 
Aaron Merey 03f159
 if USE_VALGRIND
Aaron Merey 03f159
@@ -738,6 +739,7 @@ dwfl_bug_fd_leak_LDADD = $(libeu) $(libdw) $(libebl) $(libelf)
Aaron Merey 03f159
 dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf)
Aaron Merey 03f159
 dwfl_bug_getmodules_LDADD = $(libeu) $(libdw) $(libebl) $(libelf)
Aaron Merey 03f159
 dwfl_addr_sect_LDADD = $(libeu) $(libdw) $(libebl) $(libelf) $(argp_LDADD)
Aaron Merey 03f159
+dwfl_core_noncontig_LDADD = $(libdw) $(libelf)
Aaron Merey 03f159
 dwarf_getmacros_LDADD = $(libdw)
Aaron Merey 03f159
 dwarf_ranges_LDADD = $(libdw)
Aaron Merey 03f159
 dwarf_getstring_LDADD = $(libdw)
Aaron Merey 03f159
diff --git a/tests/dwfl-core-noncontig.c b/tests/dwfl-core-noncontig.c
Aaron Merey 03f159
new file mode 100644
Aaron Merey 03f159
index 0000000..04558e2
Aaron Merey 03f159
--- /dev/null
Aaron Merey 03f159
+++ b/tests/dwfl-core-noncontig.c
Aaron Merey 03f159
@@ -0,0 +1,82 @@
Aaron Merey 03f159
+/* Test program for dwfl_getmodules bug.
Aaron Merey 03f159
+   Copyright (C) 2008 Red Hat, Inc.
Aaron Merey 03f159
+   This file is part of elfutils.
Aaron Merey 03f159
+
Aaron Merey 03f159
+   This file is free software; you can redistribute it and/or modify
Aaron Merey 03f159
+   it under the terms of the GNU General Public License as published by
Aaron Merey 03f159
+   the Free Software Foundation; either version 3 of the License, or
Aaron Merey 03f159
+   (at your option) any later version.
Aaron Merey 03f159
+
Aaron Merey 03f159
+   elfutils is distributed in the hope that it will be useful, but
Aaron Merey 03f159
+   WITHOUT ANY WARRANTY; without even the implied warranty of
Aaron Merey 03f159
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Aaron Merey 03f159
+   GNU General Public License for more details.
Aaron Merey 03f159
+
Aaron Merey 03f159
+   You should have received a copy of the GNU General Public License
Aaron Merey 03f159
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Aaron Merey 03f159
+
Aaron Merey 03f159
+#include <config.h>
Aaron Merey 03f159
+#include <stdio.h>
Aaron Merey 03f159
+#include <fcntl.h>
Aaron Merey 03f159
+#include <assert.h>
Aaron Merey 03f159
+#include ELFUTILS_HEADER(dwfl)
Aaron Merey 03f159
+#include ELFUTILS_HEADER(elf)
Aaron Merey 03f159
+
Aaron Merey 03f159
+static const Dwfl_Callbacks cb =
Aaron Merey 03f159
+{
Aaron Merey 03f159
+  NULL,
Aaron Merey 03f159
+  NULL,
Aaron Merey 03f159
+  NULL,
Aaron Merey 03f159
+  NULL,
Aaron Merey 03f159
+};
Aaron Merey 03f159
+
Aaron Merey 03f159
+int
Aaron Merey 03f159
+main (int argc, char **argv)
Aaron Merey 03f159
+{
Aaron Merey 03f159
+  assert (argc == 2);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  Dwfl *dwfl = dwfl_begin (&cb;;
Aaron Merey 03f159
+
Aaron Merey 03f159
+  int fd = open (argv[1], O_RDONLY);
Aaron Merey 03f159
+  assert (fd != -1);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
Aaron Merey 03f159
+  (void) dwfl_core_file_report (dwfl, elf, argv[0]);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  /* testcore-noncontig contains a shared library mapped between 
Aaron Merey 03f159
+     non-contiguous segments of another shared library:
Aaron Merey 03f159
+
Aaron Merey 03f159
+     [...]
Aaron Merey 03f159
+     7f14e458c000-7f14e45ae000 00000000 139264      /usr/lib64/ld-2.17.so             (1)
Aaron Merey 03f159
+     7f14e4795000-7f14e4798000 00000000 12288       /usr/lib64/firefox/liblgpllibs.so (2)
Aaron Merey 03f159
+     7f14e4798000-7f14e479d000 00003000 20480       /usr/lib64/firefox/liblgpllibs.so
Aaron Merey 03f159
+     7f14e479d000-7f14e479f000 00008000 8192        /usr/lib64/firefox/liblgpllibs.so
Aaron Merey 03f159
+     7f14e479f000-7f14e47a0000 00009000 4096        /usr/lib64/firefox/liblgpllibs.so
Aaron Merey 03f159
+     7f14e47a0000-7f14e47a1000 0000a000 4096        /usr/lib64/firefox/liblgpllibs.so (3)
Aaron Merey 03f159
+     7f14e47ad000-7f14e47ae000 00021000 4096        /usr/lib64/ld-2.17.so             (4)
Aaron Merey 03f159
+     7f14e47ae000-7f14e47af000 00022000 4096        /usr/lib64/ld-2.17.so  */
Aaron Merey 03f159
+
Aaron Merey 03f159
+  /* First segment of the non-contiguous module (1).  */
Aaron Merey 03f159
+  int seg = dwfl_addrsegment (dwfl, 0x7f14e458c000, NULL);
Aaron Merey 03f159
+  assert (seg == 32);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  /* First segment of the module within the non-contiguous module's address
Aaron Merey 03f159
+     range (2).  */
Aaron Merey 03f159
+  seg = dwfl_addrsegment (dwfl, 0x7f14e4795000, NULL);
Aaron Merey 03f159
+  assert (seg == 33);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  /* Last segment of the module within the non-contiguous module's
Aaron Merey 03f159
+     address range (3).  */
Aaron Merey 03f159
+  seg = dwfl_addrsegment (dwfl, 0x7f14e47a0000, NULL);
Aaron Merey 03f159
+  assert (seg == 37);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  /* First segment of non-contiguous module following its address space
Aaron Merey 03f159
+     gap (4).  */
Aaron Merey 03f159
+  seg = dwfl_addrsegment (dwfl, 0x7f14e47ad000, NULL);
Aaron Merey 03f159
+  assert (seg == 40);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  dwfl_end (dwfl);
Aaron Merey 03f159
+  elf_end (elf);
Aaron Merey 03f159
+
Aaron Merey 03f159
+  return 0;
Aaron Merey 03f159
+}
Aaron Merey 03f159
diff --git a/tests/run-dwfl-core-noncontig.sh b/tests/run-dwfl-core-noncontig.sh
Aaron Merey 03f159
new file mode 100755
Aaron Merey 03f159
index 0000000..1245b67
Aaron Merey 03f159
--- /dev/null
Aaron Merey 03f159
+++ b/tests/run-dwfl-core-noncontig.sh
Aaron Merey 03f159
@@ -0,0 +1,63 @@
Aaron Merey 03f159
+#! /bin/sh
Aaron Merey 03f159
+# Copyright (C) 2023 Red Hat, Inc.
Aaron Merey 03f159
+# This file is part of elfutils.
Aaron Merey 03f159
+#
Aaron Merey 03f159
+# This file is free software; you can redistribute it and/or modify
Aaron Merey 03f159
+# it under the terms of the GNU General Public License as published by
Aaron Merey 03f159
+# the Free Software Foundation; either version 3 of the License, or
Aaron Merey 03f159
+# (at your option) any later version.
Aaron Merey 03f159
+#
Aaron Merey 03f159
+# elfutils is distributed in the hope that it will be useful, but
Aaron Merey 03f159
+# WITHOUT ANY WARRANTY; without even the implied warranty of
Aaron Merey 03f159
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Aaron Merey 03f159
+# GNU General Public License for more details.
Aaron Merey 03f159
+#
Aaron Merey 03f159
+# You should have received a copy of the GNU General Public License
Aaron Merey 03f159
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Aaron Merey 03f159
+
Aaron Merey 03f159
+. $srcdir/test-subr.sh
Aaron Merey 03f159
+
Aaron Merey 03f159
+# Test whether libdwfl can handle corefiles containing non-contiguous
Aaron Merey 03f159
+# segments where multiple modules are contained within the address
Aaron Merey 03f159
+# space of some other module.
Aaron Merey 03f159
+
Aaron Merey 03f159
+# testcore-noncontig was generated from the following program with
Aaron Merey 03f159
+# systemd-coredump on RHEL 7.9 Workstation, kernel
Aaron Merey 03f159
+# 3.10.0-1160.105.1.el7.x86_64. liblgpllibs.so was packaged with
Aaron Merey 03f159
+# firefox-115.4.0-1.el7_9.x86_64.rpm.
Aaron Merey 03f159
+
Aaron Merey 03f159
+# #include <unistd.h>
Aaron Merey 03f159
+# #include <dlfcn.h>
Aaron Merey 03f159
+#
Aaron Merey 03f159
+# int main () {
Aaron Merey 03f159
+#   dlopen ("/usr/lib64/firefox/liblgpllibs.so", RTLD_GLOBAL | RTLD_NOW);
Aaron Merey 03f159
+#   sleep (60);
Aaron Merey 03f159
+#   return 0;
Aaron Merey 03f159
+# }
Aaron Merey 03f159
+#
Aaron Merey 03f159
+# gcc -ldl -o test test.c
Aaron Merey 03f159
+
Aaron Merey 03f159
+tempfiles out
Aaron Merey 03f159
+testfiles testcore-noncontig
Aaron Merey 03f159
+
Aaron Merey 03f159
+testrun ${abs_builddir}/dwfl-core-noncontig testcore-noncontig
Aaron Merey 03f159
+
Aaron Merey 03f159
+# Remove parts of the output that could change depending on which
Aaron Merey 03f159
+# libraries are locally installed.
Aaron Merey 03f159
+testrun ${abs_top_builddir}/src/unstrip -n --core testcore-noncontig \
Aaron Merey 03f159
+  | sed 's/+/ /g' | cut -d " " -f1,3 | sort > out
Aaron Merey 03f159
+
Aaron Merey 03f159
+testrun_compare cat out <<\EOF
Aaron Merey 03f159
+0x400000 3a1748a544b40a38b3be3d2d13ffa34a2a5a71c0@0x400284
Aaron Merey 03f159
+0x7f14e357e000 edf51350c7f71496149d064aa8b1441f786df88a@0x7f14e357e1d8
Aaron Merey 03f159
+0x7f14e3794000 7615604eaf4a068dfae5085444d15c0dee93dfbd@0x7f14e37941d8
Aaron Merey 03f159
+0x7f14e3a96000 09cfb171310110bc7ea9f4476c9fa044d85baff4@0x7f14e3a96210
Aaron Merey 03f159
+0x7f14e3d9e000 e10cc8f2b932fc3daeda22f8dac5ebb969524e5b@0x7f14e3d9e248
Aaron Merey 03f159
+0x7f14e3fba000 fc4fa58e47a5acc137eadb7689bce4357c557a96@0x7f14e3fba280
Aaron Merey 03f159
+0x7f14e4388000 7f2e9cb0769d7e57bd669b485a74b537b63a57c4@0x7f14e43881d8
Aaron Merey 03f159
+0x7f14e458c000 62c449974331341bb08dcce3859560a22af1e172@0x7f14e458c1d8
Aaron Merey 03f159
+0x7f14e4795000 175efdcef445455872a86a6fbee7567ca16a513e@0x7f14e4795248
Aaron Merey 03f159
+0x7ffcfe59f000 80d79b32785868a2dc10047b39a80d1daec8923d@0x7ffcfe59f328
Aaron Merey 03f159
+EOF
Aaron Merey 03f159
+
Aaron Merey 03f159
+exit 0
Aaron Merey 03f159
-- 
Aaron Merey 03f159
2.43.0
Aaron Merey 03f159