fritzkink
2023-12-26 c3a1193deaa3a46b90c82aa59a5acf9cff2942b4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Solaris ELF objects can contain additional DTrace related .data section,
which can confuse Valgrind.
 
Previously, this was handled by detecting an ELF section outside all
mapped regions. However, it seems that even this DTrace related section
can be mapped into an existing region. This patch changes this detection
such that section mapping is no longer relevant.
 
Original fix:
https://sourceware.org/git/?p=valgrind.git;h=6260274e4ed84f02d3fbe73adbd3b65893e73bd8
 
Should be reported upstream.
 
--- valgrind-3.22.0/coregrind/m_debuginfo/readelf.c
+++ valgrind-3.22.0/coregrind/m_debuginfo/readelf.c
@@ -2153,17 +2153,24 @@ Bool ML_(read_elf_debug_info) ( struct _
                      }
                   }
                }
-               if (!loaded) {
-#                 if defined(SOLARIS_PT_SUNDWTRACE_THRP)
-                  if ((a_phdr.p_memsz == VKI_PT_SUNWDTRACE_SIZE)
-                     && ((a_phdr.p_flags & (PF_R | PF_W | PF_X)) == PF_R)) {
-                     TRACE_SYMTAB("PT_LOAD[%ld]:   ignore dtrace_data program "
-                                  "header\n", i);
-                     dtrace_data_vaddr = a_phdr.p_vaddr;
-                     continue;
+#              if defined(SOLARIS_PT_SUNDWTRACE_THRP)
+               if ((a_phdr.p_memsz == VKI_PT_SUNWDTRACE_SIZE)
+                  && ((a_phdr.p_flags & (PF_R | PF_W | PF_X)) == PF_R)) {
+                  if (dtrace_data_vaddr != 0) {
+                     ML_(symerr)(di, True, "Multiple dtrace_data headers detected");
+                     goto out;
                   }
-#                 endif /* SOLARIS_PT_SUNDWTRACE_THRP */
+                  dtrace_data_vaddr = a_phdr.p_vaddr;
 
+                  /* DTrace related section might be outside all mapped regions. */
+                  if (!loaded) {
+                     TRACE_SYMTAB("PT_LOAD[%ld]:   ignore dtrace_data program "
+                                  "header\n", i);
+                     continue;
+                  }
+               }
+#              endif /* SOLARIS_PT_SUNDWTRACE_THRP */
+               if (!loaded) {
                   ML_(symerr)(di, False,
                               "ELF section outside all mapped regions");
                   /* This problem might be solved by further memory mappings.