From 2daa6cc65d51b8360517a896e7a06bfd46de8a6e Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sun, 30 Jul 2023 13:30:47 +0200 Subject: [PATCH] memzero.[ch]: Define memzero() and strzero() as inline functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit There's no need to have these as macros, so use functions, which are a lot safer: there's no need to worry about multiple evaluation of args, and there's also more type safety. Compiler warnings are also simpler, as they don't dump all the nested macros. Cc: Christian Göttsche Cc: Serge Hallyn Cc: Iker Pedrosa Signed-off-by: Alejandro Colomar --- lib/Makefile.am | 1 + lib/memzero.c | 17 +++++++++++++++++ lib/memzero.h | 27 +++++++++++++++++++-------- 3 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 lib/memzero.c diff --git a/lib/Makefile.am b/lib/Makefile.am index e778004e7..f58521515 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -85,6 +85,7 @@ libshadow_la_SOURCES = \ mail.c \ mempcpy.c \ mempcpy.h \ + memzero.c \ memzero.h \ motd.c \ myname.c \ diff --git a/lib/memzero.c b/lib/memzero.c new file mode 100644 index 000000000..8979e5f83 --- /dev/null +++ b/lib/memzero.c @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023, Alejandro Colomar + * SPDX-License-Identifier: BSD-3-Clause + */ + + +#include + +#ident "$Id$" + +#include + +#include "memzero.h" + + +extern inline void memzero(void *ptr, size_t size); +extern inline void strzero(char *s); diff --git a/lib/memzero.h b/lib/memzero.h index 49ddecbcd..c81cd0ce2 100644 --- a/lib/memzero.h +++ b/lib/memzero.h @@ -1,5 +1,6 @@ /* * SPDX-FileCopyrightText: 2022-2023, Christian Göttsche + * SPDX-FileCopyrightText: 2023, Alejandro Colomar * SPDX-License-Identifier: BSD-3-Clause */ @@ -15,19 +16,29 @@ #include -#ifdef HAVE_MEMSET_EXPLICIT -# define memzero(ptr, size) memset_explicit((ptr), 0, (size)) -#elif defined HAVE_EXPLICIT_BZERO -# define memzero(ptr, size) explicit_bzero((ptr), (size)) -#else -static inline void memzero(void *ptr, size_t size) +inline void memzero(void *ptr, size_t size); +inline void strzero(char *s); + + +inline void +memzero(void *ptr, size_t size) { +#if defined(HAVE_MEMSET_EXPLICIT) + memset_explicit(ptr, 0, size); +#elif defined(HAVE_EXPLICIT_BZERO) + explicit_bzero(ptr, size); +#else ptr = memset(ptr, '\0', size); __asm__ __volatile__ ("" : : "r"(ptr) : "memory"); -} #endif +} + -#define strzero(s) memzero(s, strlen(s)) /* warning: evaluates twice */ +inline void +strzero(char *s) +{ + memzero(s, strlen(s)); +} #endif // include guard -- 2.47.2