use explicit_bzero() instead of memset_explicit()
authorDebian Samba Maintainers <pkg-samba-maint@lists.alioth.debian.org>
Fri, 17 Apr 2026 08:02:47 +0000 (11:02 +0300)
committerMichael Tokarev <mjt@tls.msk.ru>
Fri, 17 Apr 2026 08:02:47 +0000 (11:02 +0300)
lib/replace/replace.h header defines ZERO_STRUCT macro
which uses memset_explicit() function (which is similar to
memset() but can not be optimized out by the compiler).
Glibc has explicit_bzero() with similar property, while
memset_explicit() is implemented in lib/replace/replace.c, -
this way, some binaries needlessly link to libreplace
just to get rep_memset_explicit() symbol.  By using
explicit_bzero() instead, this endless linkage is eliminated,
so we can package, for example, libldb (which uses ZERO_STRUCT)
without it linking to libreplace-samba4.

Unfortunately there are just insane amount of similar
but non-standard functions, and upstream don't want
to stay on something simple and robust in this context.

Gbp-Pq: Name use-explicit_bzero-to-zero-memory.diff

lib/replace/replace.h

index 051583cecc71bed0241b91b7b4b1fabd4b140d9b..4f4d7e6b818d13f0b38061de6e7f6cf480c581ff 100644 (file)
@@ -999,7 +999,10 @@ void rep_setproctitle_init(int argc, char *argv[], char *envp[]);
 #endif
 
 #ifndef HAVE_MEMSET_EXPLICIT
-#define memset_explicit rep_memset_explicit
+#include <assert.h>
+#define memset_explicit(ptr, ch, len) \
+  do { static_assert((ch)==0, "memset is called with ch!=0"); \
+       explicit_bzero((ptr), (len)); } while (0)
 void *rep_memset_explicit(void *block, int c, size_t size);
 #endif