diff --git a/0001-Refix-still_reachable-xml-closing-tag-and-add-testca.patch b/0001-Refix-still_reachable-xml-closing-tag-and-add-testca.patch new file mode 100644 index 0000000..e773946 --- /dev/null +++ b/0001-Refix-still_reachable-xml-closing-tag-and-add-testca.patch @@ -0,0 +1,352 @@ +From a4e37741625163fe3e9fde5f21dc4d3e9167fd9a Mon Sep 17 00:00:00 2001 +From: Paul Floyd +Date: Thu, 29 Jan 2026 12:18:08 +0100 +Subject: [PATCH] Refix still_reachable xml closing tag and add testcases + +https://bugs.kde.org/show_bug.cgi?id=514613 +--- + memcheck/mc_leakcheck.c | 16 ++-- + memcheck/tests/Makefile.am | 14 ++- + memcheck/tests/nothing.c | 5 ++ + memcheck/tests/nothing_xml.stderr.exp | 0 + memcheck/tests/nothing_xml.vgtest | 4 + + memcheck/tests/simple_leak.c | 10 +++ + memcheck/tests/simple_leak_xml.stderr.exp | 0 + memcheck/tests/simple_leak_xml.vgtest | 4 + + memcheck/tests/simple_reachable.c | 9 ++ + .../tests/simple_reachable_xml.stderr.exp | 0 + memcheck/tests/simple_reachable_xml.vgtest | 4 + + memcheck/tests/xmas_tree.cpp | 90 +++++++++++++++++++ + memcheck/tests/xmas_tree_xml.stderr.exp | 0 + memcheck/tests/xmas_tree_xml.supp | 7 ++ + memcheck/tests/xmas_tree_xml.vgtest | 4 + + 16 files changed, 162 insertions(+), 9 deletions(-) + create mode 100644 memcheck/tests/nothing.c + create mode 100644 memcheck/tests/nothing_xml.stderr.exp + create mode 100644 memcheck/tests/nothing_xml.vgtest + create mode 100644 memcheck/tests/simple_leak.c + create mode 100644 memcheck/tests/simple_leak_xml.stderr.exp + create mode 100644 memcheck/tests/simple_leak_xml.vgtest + create mode 100644 memcheck/tests/simple_reachable.c + create mode 100644 memcheck/tests/simple_reachable_xml.stderr.exp + create mode 100644 memcheck/tests/simple_reachable_xml.vgtest + create mode 100644 memcheck/tests/xmas_tree.cpp + create mode 100644 memcheck/tests/xmas_tree_xml.stderr.exp + create mode 100644 memcheck/tests/xmas_tree_xml.supp + create mode 100644 memcheck/tests/xmas_tree_xml.vgtest + +diff --git a/memcheck/mc_leakcheck.c b/memcheck/mc_leakcheck.c +index 4df0b180d5d1..b0056b65bd3e 100644 +--- a/memcheck/mc_leakcheck.c ++++ b/memcheck/mc_leakcheck.c +@@ -1768,23 +1768,23 @@ static void print_results(ThreadId tid, LeakCheckParams* lcp) + umsg_or_xml(VG_(clo_xml) ? + " \n" + " %'lu%s\n" +- " %'lu%s\n" +- " \n" : ++ " %'lu%s\n" : + " still reachable: %'lu%s bytes in %'lu%s blocks\n", + MC_(bytes_reachable), + DBY (MC_(bytes_reachable), old_bytes_reachable), + MC_(blocks_reachable), + DBL (MC_(blocks_reachable), old_blocks_reachable)); +- for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++) ++ for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++) { + if (old_blocks_heuristically_reachable[i] > 0 + || MC_(blocks_heuristically_reachable)[i] > 0) { + umsg_or_xml(VG_(clo_xml) ? "" : " of which " + "reachable via heuristic:\n"); + break; + } +- for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++) +- if (old_blocks_heuristically_reachable[i] > 0 +- || MC_(blocks_heuristically_reachable)[i] > 0) ++ } ++ for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++) { ++ if (old_blocks_heuristically_reachable[i] > 0 ++ || MC_(blocks_heuristically_reachable)[i] > 0) { + umsg_or_xml(VG_(clo_xml) ? + " \n" + " %ls\n" +@@ -1800,7 +1800,9 @@ static void print_results(ThreadId tid, LeakCheckParams* lcp) + MC_(blocks_heuristically_reachable)[i], + DBL (MC_(blocks_heuristically_reachable)[i], + old_blocks_heuristically_reachable[i])); +- if (VG_(clo_xml) && MC_(bytes_reachable)) { ++ } ++ } ++ if (VG_(clo_xml)) { + umsg_or_xml(" \n"); + } + umsg_or_xml(VG_(clo_xml) ? +diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am +index 4bdca487aa51..c8469f1265cb 100644 +--- a/memcheck/tests/Makefile.am ++++ b/memcheck/tests/Makefile.am +@@ -307,6 +307,7 @@ EXTRA_DIST = \ + new_nothrow.stderr.exp new_nothrow.vgtest \ + new_override.stderr.exp new_override.stdout.exp new_override.vgtest \ + noisy_child.vgtest noisy_child.stderr.exp noisy_child.stdout.exp \ ++ nothing_xml.vgtest nothing_xml.stderr.exp \ + null_socket.stderr.exp null_socket.vgtest \ + origin1-yes.vgtest origin1-yes.stdout.exp origin1-yes.stderr.exp \ + origin1-yes.stderr.exp-freebsd \ +@@ -403,6 +404,8 @@ EXTRA_DIST = \ + sigkill.stderr.exp-glibc-2.28 sigkill.vgtest \ + signal2.stderr.exp signal2.stdout.exp signal2.vgtest \ + sigprocmask.stderr.exp sigprocmask.stderr.exp2 sigprocmask.vgtest \ ++ simple_leak_xml.vgtest simple_reachable_xml.vgtest \ ++ simple_leak_xml.stderr.exp simple_reachable_xml.stderr.exp \ + sized_delete.stderr.exp sized_delete.stderr.exp-x86 sized_delete.vgtest \ + static_malloc.stderr.exp static_malloc.vgtest \ + stpncpy.vgtest stpncpy.stderr.exp stpncpy.stdout.exp \ +@@ -478,6 +481,7 @@ EXTRA_DIST = \ + wrapmallocstatic.vgtest wrapmallocstatic.stdout.exp \ + wrapmallocstatic.stderr.exp \ + writev1.stderr.exp writev1.stderr.exp-solaris writev1.vgtest \ ++ xmas_tree_xml.vgtest xmas_tree_xml.supp xmas_tree_xml.stderr.exp \ + xml1.stderr.exp xml1.stdout.exp xml1.vgtest xml1.stderr.exp-s390x-mvc + + check_PROGRAMS = \ +@@ -539,6 +543,7 @@ check_PROGRAMS = \ + mismatches new_override metadata \ + nanoleak_supp nanoleak2 new_nothrow \ + noisy_child \ ++ nothing \ + null_socket \ + origin1-yes origin2-not-quite origin3-no \ + origin4-many origin5-bz2 origin6-fp \ +@@ -556,7 +561,9 @@ check_PROGRAMS = \ + sbfragment \ + sendmsg \ + sh-mem sh-mem-random \ +- sigaltstack signal2 sigprocmask static_malloc sigkill \ ++ sigaltstack signal2 sigprocmask \ ++ simple_leak simple_reachable \ ++ static_malloc sigkill \ + strchr \ + str_tester \ + supp_unknown supp1 supp2 suppfree \ +@@ -575,7 +582,8 @@ check_PROGRAMS = \ + wmemcmp \ + wrap1 wrap2 wrap3 wrap4 wrap5 wrap6 wrap7 wrap7so.so wrap8 \ + wrapmalloc wrapmallocso.so wrapmallocstatic \ +- writev1 ++ writev1 \ ++ xmas_tree + + if !SOLARIS_SUN_STUDIO_AS + # Sun Studio assembler fails on "IDENT too long" +@@ -950,3 +958,5 @@ endif + writev1_CFLAGS = $(AM_CFLAGS) @FLAG_W_NO_STRINGOP_OVERFLOW@ @FLAG_W_NO_STRINGOP_OVERREAD@ + xml1_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE @FLAG_W_NO_UNINITIALIZED@ @FLAG_W_NO_USE_AFTER_FREE@ + ++xmas_tree_SOURCES = xmas_tree.cpp ++xmas_tree_CXXFLAGS = ${AM_CXXFLAGS} @FLAG_W_NO_UNINITIALIZED@ +diff --git a/memcheck/tests/nothing.c b/memcheck/tests/nothing.c +new file mode 100644 +index 000000000000..2e424a58ded8 +--- /dev/null ++++ b/memcheck/tests/nothing.c +@@ -0,0 +1,5 @@ ++/* no errors, except Darwin */ ++int main() ++{ ++} ++ +diff --git a/memcheck/tests/nothing_xml.stderr.exp b/memcheck/tests/nothing_xml.stderr.exp +new file mode 100644 +index 000000000000..e69de29bb2d1 +diff --git a/memcheck/tests/nothing_xml.vgtest b/memcheck/tests/nothing_xml.vgtest +new file mode 100644 +index 000000000000..db2eca402af1 +--- /dev/null ++++ b/memcheck/tests/nothing_xml.vgtest +@@ -0,0 +1,4 @@ ++prereq: which xmllint > /dev/null ++prog: nothing ++args: | xmllint --noout - ++vgopts: --xml=yes --xml-fd=1 +diff --git a/memcheck/tests/simple_leak.c b/memcheck/tests/simple_leak.c +new file mode 100644 +index 000000000000..b94dade4c24c +--- /dev/null ++++ b/memcheck/tests/simple_leak.c +@@ -0,0 +1,10 @@ ++#include ++ ++static void *p; ++ ++int main () ++{ ++ p = malloc (1024); ++ p = NULL; ++} ++ +diff --git a/memcheck/tests/simple_leak_xml.stderr.exp b/memcheck/tests/simple_leak_xml.stderr.exp +new file mode 100644 +index 000000000000..e69de29bb2d1 +diff --git a/memcheck/tests/simple_leak_xml.vgtest b/memcheck/tests/simple_leak_xml.vgtest +new file mode 100644 +index 000000000000..9652b32764b8 +--- /dev/null ++++ b/memcheck/tests/simple_leak_xml.vgtest +@@ -0,0 +1,4 @@ ++prereq: which xmllint > /dev/null ++prog: simple_leak ++args: | xmllint --noout - ++vgopts: --xml=yes --xml-fd=1 +diff --git a/memcheck/tests/simple_reachable.c b/memcheck/tests/simple_reachable.c +new file mode 100644 +index 000000000000..4fe1adaf4556 +--- /dev/null ++++ b/memcheck/tests/simple_reachable.c +@@ -0,0 +1,9 @@ ++#include ++ ++static void *p; ++ ++int main () ++{ ++ p = malloc (1024); ++} ++ +diff --git a/memcheck/tests/simple_reachable_xml.stderr.exp b/memcheck/tests/simple_reachable_xml.stderr.exp +new file mode 100644 +index 000000000000..e69de29bb2d1 +diff --git a/memcheck/tests/simple_reachable_xml.vgtest b/memcheck/tests/simple_reachable_xml.vgtest +new file mode 100644 +index 000000000000..a64cb2ac5d69 +--- /dev/null ++++ b/memcheck/tests/simple_reachable_xml.vgtest +@@ -0,0 +1,4 @@ ++prereq: which xmllint > /dev/null ++prog: simple_reachable ++args: | xmllint --noout - ++vgopts: --xml=yes --xml-fd=1 +diff --git a/memcheck/tests/xmas_tree.cpp b/memcheck/tests/xmas_tree.cpp +new file mode 100644 +index 000000000000..680833b46dac +--- /dev/null ++++ b/memcheck/tests/xmas_tree.cpp +@@ -0,0 +1,90 @@ ++#include ++#include ++#include ++#include ++#include "../memcheck.h" ++ ++struct Ae ++{ ++ virtual ~Ae() ++ { ++ } ++}; ++struct Be ++{ ++ virtual ~Be() ++ { ++ } ++}; ++struct Ce : public Ae, public Be ++{ ++ virtual ~Ce() ++ { ++ } ++}; ++ ++void* reachable; ++Be *interior; ++ ++int suppress_me() ++{ ++ int qqq; ++ if (qqq) ++ return 2; ++ return 1; ++} ++ ++int main() ++{ ++ std::align_val_t misalign(static_cast(63U)); ++ std::align_val_t align(static_cast(64U)); ++ std::align_val_t align2(static_cast(32U)); ++ std::size_t size(32); ++ std::size_t badsize(42); ++ std::nothrow_t tag; ++ int count{0}; ++ ++ char *mem = static_cast(operator new[](size, tag)); ++ if (mem[31]) ++ ++count; ++ if (mem[32]) ++ ++count; ++ operator delete(mem, misalign, tag); ++ ++ mem = static_cast(operator new(size, align, tag)); ++ operator delete(mem, align2, tag); ++ ++ mem = static_cast(malloc(20)); ++ mem = static_cast(realloc(mem, 0)); ++ delete mem; ++ ++ mem = static_cast(operator new[](size)); ++ memcpy(mem+10, mem+5, 10); ++ operator delete[](mem, badsize); ++ ++ mem = static_cast(malloc(-1)); ++ ++ int fd{42}; ++ int bad; ++ fd += bad; ++ fd -= bad; ++ char* buf{nullptr}; ++ ++buf; ++ write(fd, buf, fd); ++ ++ int zzz; ++ VALGRIND_CHECK_MEM_IS_DEFINED(&zzz, 4); ++ ++ reachable = malloc(10); ++ mem = static_cast(malloc(20)); ++ ++ char* indirect = static_cast(malloc(30)); ++ memcpy(&mem[8], &indirect, sizeof(indirect)); ++ mem = nullptr; ++ ++ count += suppress_me(); ++ ++ interior = new Ce; // interior ptr. ++ ++ return count; ++} +diff --git a/memcheck/tests/xmas_tree_xml.stderr.exp b/memcheck/tests/xmas_tree_xml.stderr.exp +new file mode 100644 +index 000000000000..e69de29bb2d1 +diff --git a/memcheck/tests/xmas_tree_xml.supp b/memcheck/tests/xmas_tree_xml.supp +new file mode 100644 +index 000000000000..2643371609d3 +--- /dev/null ++++ b/memcheck/tests/xmas_tree_xml.supp +@@ -0,0 +1,7 @@ ++{ ++ Hello, suppression World! ++ Memcheck:Cond ++ fun:_Z11suppress_mev ++ fun:main ++} ++ +diff --git a/memcheck/tests/xmas_tree_xml.vgtest b/memcheck/tests/xmas_tree_xml.vgtest +new file mode 100644 +index 000000000000..5061ad12a466 +--- /dev/null ++++ b/memcheck/tests/xmas_tree_xml.vgtest +@@ -0,0 +1,4 @@ ++prereq: which xmllint > /dev/null ++prog: xmas_tree ++args: | xmllint --noout - ++vgopts: --xml=yes --xml-fd=1 --leak-check=full --suppressions=xmas_tree_xml.supp --leak-check-heuristics=multipleinheritance +-- +2.52.0 + diff --git a/valgrind.spec b/valgrind.spec index ba10a62..ec211d3 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -3,7 +3,7 @@ Summary: Dynamic analysis tools to detect memory or thread bugs and profile Name: %{?scl_prefix}valgrind Version: 3.26.0 -Release: 4%{?dist} +Release: 5%{?dist} Epoch: 1 # This ignores licenses that are only found in the test or perf sources @@ -95,6 +95,9 @@ Patch10: 0006-Disable-linux-madvise-MADV_GUARD_INSTALL.patch Patch11: 0007-Bug-514613-Unclosed-leak_summary-still_reachable-tag.patch Patch12: 0008-Bug-514206-Assertion-sr_isError-sr-failed-mmap-fd-po.patch +# Refix for https://bugs.kde.org/show_bug.cgi?id=514613 +Patch100: 0001-Refix-still_reachable-xml-closing-tag-and-add-testca.patch + BuildRequires: make BuildRequires: glibc-devel @@ -283,6 +286,8 @@ Valgrind User Manual for details. %patch -P11 -p1 %patch -P12 -p1 +%patch -P100 -p1 + %build # LTO triggers undefined symbols in valgrind. But valgrind has a # --enable-lto configure time option that we will use instead. @@ -522,6 +527,9 @@ echo ===============END TESTING=============== %endif %changelog +* Thu Jan 29 2026 Mark Wielaard - 3.26.0-5 +- Add 0001-Refix-still_reachable-xml-closing-tag-and-add-testca.patch + * Tue Jan 27 2026 Mark Wielaard - 3.26.0-4 - Add VALGRIND_3_26_BRANCH patches - 0001-Prepare-NEWS-for-branch-3.26-fixes.patch