diff --git a/valgrind-3.21.0-realloc-again.patch b/valgrind-3.21.0-realloc-again.patch new file mode 100644 index 0000000..7501cd2 --- /dev/null +++ b/valgrind-3.21.0-realloc-again.patch @@ -0,0 +1,167 @@ +From b904112d7084227f8d6fab322bc360a8a6240a51 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Thu, 1 Jun 2023 16:10:56 +0200 +Subject: [PATCH] memcheck: Handle Err_ReallocSizeZero in MC_(eq_Error) + +When an realloc size zero error is emitted MC_(eq_Error) is called to +see if the errors can be deduplicated. This crashed since +Err_ReallocSizeZero wasn't handled. Handle it like Err_Free. + +Also add a testcase for this case and test with both +--realloc-zero-bytes-frees=yes and +--realloc-zero-bytes-frees=no. +Which will report a different number of errors. + +https://bugs.kde.org/show_bug.cgi?id=470520 +--- + memcheck/mc_errors.c | 1 + + memcheck/tests/Makefile.am | 7 +++++++ + memcheck/tests/realloc_size_zero_again.c | 15 +++++++++++++++ + .../realloc_size_zero_again_no.stderr.exp | 18 ++++++++++++++++++ + .../realloc_size_zero_again_no.stdout.exp | 0 + .../tests/realloc_size_zero_again_no.vgtest | 2 ++ + .../realloc_size_zero_again_yes.stderr.exp | 18 ++++++++++++++++++ + .../realloc_size_zero_again_yes.stdout.exp | 0 + .../tests/realloc_size_zero_again_yes.vgtest | 2 ++ + 9 files changed, 63 insertions(+) + create mode 100644 memcheck/tests/realloc_size_zero_again.c + create mode 100644 memcheck/tests/realloc_size_zero_again_no.stderr.exp + create mode 100644 memcheck/tests/realloc_size_zero_again_no.stdout.exp + create mode 100644 memcheck/tests/realloc_size_zero_again_no.vgtest + create mode 100644 memcheck/tests/realloc_size_zero_again_yes.stderr.exp + create mode 100644 memcheck/tests/realloc_size_zero_again_yes.stdout.exp + create mode 100644 memcheck/tests/realloc_size_zero_again_yes.vgtest + +diff --git a/memcheck/mc_errors.c b/memcheck/mc_errors.c +index 00d6ec301..65210a220 100644 +--- a/memcheck/mc_errors.c ++++ b/memcheck/mc_errors.c +@@ -1041,6 +1041,7 @@ Bool MC_(eq_Error) ( VgRes res, const Error* e1, const Error* e2 ) + case Err_IllegalMempool: + case Err_Overlap: + case Err_Cond: ++ case Err_ReallocSizeZero: + return True; + + case Err_FishyValue: +diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am +index 71c38acba..5a17fd35d 100644 +--- a/memcheck/tests/Makefile.am ++++ b/memcheck/tests/Makefile.am +@@ -291,8 +291,14 @@ EXTRA_DIST = \ + realloc_size_zero.vgtest \ + realloc_size_zero_yes.stderr.exp realloc_size_zero_yes.stdout.exp \ + realloc_size_zero_yes.vgtest \ ++ realloc_size_zero_again_yes.stderr.exp \ ++ realloc_size_zero_again_yes.stdout.exp \ ++ realloc_size_zero_again_yes.vgtest \ + realloc_size_zero_no.stderr.exp realloc_size_zero_no.stdout.exp \ + realloc_size_zero_no.vgtest \ ++ realloc_size_zero_again_no.stderr.exp \ ++ realloc_size_zero_again_no.stdout.exp \ ++ realloc_size_zero_again_no.vgtest \ + realloc_size_zero_off.stderr.exp realloc_size_zero_off.stdout.exp \ + realloc_size_zero_off.vgtest \ + realloc_size_zero_mismatch.stderr.exp \ +@@ -459,6 +465,7 @@ check_PROGRAMS = \ + posix_memalign \ + post-syscall \ + realloc_size_zero realloc_size_zero_mismatch \ ++ realloc_size_zero_again \ + realloc1 realloc2 realloc3 \ + recursive-merge \ + resvn_stack \ +diff --git a/memcheck/tests/realloc_size_zero_again.c b/memcheck/tests/realloc_size_zero_again.c +new file mode 100644 +index 000000000..782d4bde5 +--- /dev/null ++++ b/memcheck/tests/realloc_size_zero_again.c +@@ -0,0 +1,15 @@ ++#include ++ ++int ++main () ++{ ++ char *p = malloc (1024); ++ for (int i = 3; i >= 0; i--) ++ for (int j = 0; j <= 3; j++) ++ { ++ char *q = realloc (p, i * j * 512); ++ p = q; ++ } ++ ++ free (p); ++} +diff --git a/memcheck/tests/realloc_size_zero_again_no.stderr.exp b/memcheck/tests/realloc_size_zero_again_no.stderr.exp +new file mode 100644 +index 000000000..b9c061d1a +--- /dev/null ++++ b/memcheck/tests/realloc_size_zero_again_no.stderr.exp +@@ -0,0 +1,18 @@ ++realloc() with size 0 ++ at 0x........: realloc (vg_replace_malloc.c:...) ++ ... ++ Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd ++ at 0x........: malloc (vg_replace_malloc.c:...) ++ ... ++ ++ERROR SUMMARY: 7 errors from 1 contexts (suppressed: 0 from 0) ++ ++7 errors in context 1 of 1: ++realloc() with size 0 ++ at 0x........: realloc (vg_replace_malloc.c:...) ++ ... ++ Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd ++ at 0x........: malloc (vg_replace_malloc.c:...) ++ ... ++ ++ERROR SUMMARY: 7 errors from 1 contexts (suppressed: 0 from 0) +diff --git a/memcheck/tests/realloc_size_zero_again_no.stdout.exp b/memcheck/tests/realloc_size_zero_again_no.stdout.exp +new file mode 100644 +index 000000000..e69de29bb +diff --git a/memcheck/tests/realloc_size_zero_again_no.vgtest b/memcheck/tests/realloc_size_zero_again_no.vgtest +new file mode 100644 +index 000000000..f1757b6c1 +--- /dev/null ++++ b/memcheck/tests/realloc_size_zero_again_no.vgtest +@@ -0,0 +1,2 @@ ++prog: realloc_size_zero_again ++vgopts: -q -s --realloc-zero-bytes-frees=no +diff --git a/memcheck/tests/realloc_size_zero_again_yes.stderr.exp b/memcheck/tests/realloc_size_zero_again_yes.stderr.exp +new file mode 100644 +index 000000000..d40aa2455 +--- /dev/null ++++ b/memcheck/tests/realloc_size_zero_again_yes.stderr.exp +@@ -0,0 +1,18 @@ ++realloc() with size 0 ++ at 0x........: realloc (vg_replace_malloc.c:...) ++ ... ++ Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd ++ at 0x........: malloc (vg_replace_malloc.c:...) ++ ... ++ ++ERROR SUMMARY: 5 errors from 1 contexts (suppressed: 0 from 0) ++ ++5 errors in context 1 of 1: ++realloc() with size 0 ++ at 0x........: realloc (vg_replace_malloc.c:...) ++ ... ++ Address 0x........ is 0 bytes inside a block of size 1,024 alloc'd ++ at 0x........: malloc (vg_replace_malloc.c:...) ++ ... ++ ++ERROR SUMMARY: 5 errors from 1 contexts (suppressed: 0 from 0) +diff --git a/memcheck/tests/realloc_size_zero_again_yes.stdout.exp b/memcheck/tests/realloc_size_zero_again_yes.stdout.exp +new file mode 100644 +index 000000000..e69de29bb +diff --git a/memcheck/tests/realloc_size_zero_again_yes.vgtest b/memcheck/tests/realloc_size_zero_again_yes.vgtest +new file mode 100644 +index 000000000..215392ed6 +--- /dev/null ++++ b/memcheck/tests/realloc_size_zero_again_yes.vgtest +@@ -0,0 +1,2 @@ ++prog: realloc_size_zero_again ++vgopts: -q -s --realloc-zero-bytes-frees=yes +-- +2.40.1 + diff --git a/valgrind.spec b/valgrind.spec index e149d3a..2945c0d 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -95,6 +95,10 @@ Patch6: valgrind-3.21.0-Add-with-gdbscripts-dir.patch # https://bugs.kde.org/show_bug.cgi?id=470121 Patch8: valgrind-3.21.0-callgrind_control-no-strict.patch +# Multiple realloc zero errors crash in MC_(eq_Error) +# https://bugs.kde.org/show_bug.cgi?id=470520 +Patch9: valgrind-3.21.0-realloc-again.patch + BuildRequires: make BuildRequires: glibc-devel @@ -236,6 +240,7 @@ Valgrind User Manual for details. %patch6 -p1 %patch8 -p1 +%patch9 -p1 %build @@ -471,6 +476,7 @@ fi %changelog * Fri Jun 23 2023 Mark Wielaard - Add valgrind-3.21.0-callgrind_control-no-strict.patch +- Add valgrind-3.21.0-realloc-again.patch * Tue May 16 2023 Alexandra Hájková - 3.21.0-3 - Add valgrind-3.21.0-Add-with-gdbscripts-dir.patch