glibc 2.34 changes the way that malloc checking works. For more
context see these nbdkit commits:
https://gitlab.com/nbdkit/nbdkit/-/commit/362e0fdcae37db876e13b944102a5c1...
https://gitlab.com/nbdkit/nbdkit/-/commit/8972831aa2a32d4b5820465d37c1827...
Thanks: Siddhesh Poyarekar and Eric Blake
---
configure.ac | 12 ++++++++++++
copy/Makefile.am | 3 +--
fuse/Makefile.am | 3 +--
golang/Makefile.am | 3 +--
info/Makefile.am | 3 +--
ocaml/tests/Makefile.am | 3 +--
python/Makefile.am | 3 +--
sh/Makefile.am | 3 +--
subdir-rules.mk | 16 ++++++++++++++++
tests/Makefile.am | 3 +--
10 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/configure.ac b/configure.ac
index 734d2730..3e7f367e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -121,6 +121,18 @@ AC_CHECK_HEADERS([dlfcn.h],[have_dlfcn=yes],[have_dlfcn=no])
AM_CONDITIONAL([HAVE_LIBDL],
[test "x$have_libdl" = "xyes" && test
"x$have_dlfcn" = "xyes"])
+dnl Does this platform require libc_malloc_debug.so.0 (glibc >= 2.34)?
+AC_MSG_CHECKING([if this is glibc >= 2.34])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <limits.h>
+#if !defined(__GLIBC__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__
< 34)
+#error "not glibc 2.34"
+#endif
+ ]])], [is_glibc_234=yes], [is_glibc_234=no]
+)
+AC_MSG_RESULT([$is_glibc_234])
+AM_CONDITIONAL([HAVE_GLIBC_234], [test "x$is_glibc_234" = "xyes"])
+
dnl Check for GnuTLS (optional, for TLS support).
AC_ARG_WITH([gnutls],
[AS_HELP_STRING([--without-gnutls],
diff --git a/copy/Makefile.am b/copy/Makefile.am
index d35abe46..f2100853 100644
--- a/copy/Makefile.am
+++ b/copy/Makefile.am
@@ -53,8 +53,7 @@ EXTRA_DIST = \
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
EXPECTED_VERSION=$(VERSION) \
PSKTOOL=$(PSKTOOL) \
QEMU_NBD=$(QEMU_NBD) \
diff --git a/fuse/Makefile.am b/fuse/Makefile.am
index d8691862..26ea0b0f 100644
--- a/fuse/Makefile.am
+++ b/fuse/Makefile.am
@@ -37,8 +37,7 @@ EXTRA_DIST = \
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
EXPECTED_VERSION=$(VERSION) \
$(NULL)
LOG_COMPILER = $(top_builddir)/run
diff --git a/golang/Makefile.am b/golang/Makefile.am
index a8771190..77c0e0cf 100644
--- a/golang/Makefile.am
+++ b/golang/Makefile.am
@@ -89,8 +89,7 @@ all-local: $(source_files)
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
pkg=$(pkg) \
abs_top_srcdir=$(abs_top_srcdir) \
$(NULL)
diff --git a/info/Makefile.am b/info/Makefile.am
index a5708ec5..332ef80d 100644
--- a/info/Makefile.am
+++ b/info/Makefile.am
@@ -58,8 +58,7 @@ EXTRA_DIST = \
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
EXPECTED_VERSION=$(VERSION) \
QEMU_NBD=$(QEMU_NBD) \
$(NULL)
diff --git a/ocaml/tests/Makefile.am b/ocaml/tests/Makefile.am
index e0e42e72..6fac8b7c 100644
--- a/ocaml/tests/Makefile.am
+++ b/ocaml/tests/Makefile.am
@@ -121,8 +121,7 @@ endif
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
OCAMLRUNPARAM=b \
$(NULL)
LOG_COMPILER = $(top_builddir)/run
diff --git a/python/Makefile.am b/python/Makefile.am
index a05c016a..f51d40e1 100644
--- a/python/Makefile.am
+++ b/python/Makefile.am
@@ -80,8 +80,7 @@ if HAVE_NBDKIT
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
PYTHON="$(PYTHON)" \
$(NULL)
LOG_COMPILER = $(top_builddir)/run
diff --git a/sh/Makefile.am b/sh/Makefile.am
index 4bf0e1a4..1e732d4d 100644
--- a/sh/Makefile.am
+++ b/sh/Makefile.am
@@ -50,8 +50,7 @@ endif HAVE_POD
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
NBDKIT_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
EXPECTED_VERSION=$(VERSION) \
$(NULL)
LOG_COMPILER = $(top_builddir)/run
diff --git a/subdir-rules.mk b/subdir-rules.mk
index afb3e022..6d382c6d 100644
--- a/subdir-rules.mk
+++ b/subdir-rules.mk
@@ -31,3 +31,19 @@ endif
$(top_builddir)/podwrapper.pl: $(top_srcdir)/podwrapper.pl.in
$(MAKE) -C $(top_builddir) podwrapper.pl
+
+# In tests, include $(MALLOC_CHECKS) in TESTS_ENVIRONMENT to find some
+# use-after-free and uninitialized read problems when using glibc.
+# This doesn't affect other libc.
+random = $(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))')
+if HAVE_GLIBC_234
+MALLOC_CHECKS = \
+ LD_PRELOAD="$${LD_PRELOAD:+"$$LD_PRELOAD:"}libc_malloc_debug.so.0"
\
+ GLIBC_TUNABLES=glibc.malloc.check=1:glibc.malloc.perturb=$(random) \
+ $(NULL)
+else
+MALLOC_CHECKS = \
+ MALLOC_CHECK_=1 \
+ MALLOC_PERTURB_=$(random) \
+ $(NULL)
+endif
diff --git a/tests/Makefile.am b/tests/Makefile.am
index aad55130..f2e89081 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -51,8 +51,7 @@ TESTS =
# Enable debug in all tests.
TESTS_ENVIRONMENT = \
LIBNBD_DEBUG=1 \
- MALLOC_CHECK_=1 \
- MALLOC_PERTURB_=$(shell bash -c 'echo $$(( 1 + (RANDOM & 255) ))') \
+ $(MALLOC_CHECKS) \
srcdir=$(srcdir) \
$(NULL)
# Use the ./run script so we're always using the local library and tools.
--
2.32.0