]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tools: add a secure implementation of memset 20251219-memset_s
authorMaxime Henrion <mhenrion@haproxy.com>
Fri, 19 Dec 2025 15:40:38 +0000 (10:40 -0500)
committerWilliam Lallemand <wlallemand@irq6.net>
Fri, 19 Dec 2025 16:42:57 +0000 (17:42 +0100)
This guarantees that the compiler will not optimize away the memset()
call if it detects a dead store.

Use this to clear SSL passphrases.

No backport needed.

include/haproxy/tools.h
src/ssl_sock.c
src/tools.c

index 89b297a56c2656210bc5b387325c266fcd17661d..f181a7601413b9f7486ac798f63c70cb037b0c03 100644 (file)
@@ -1490,4 +1490,6 @@ int path_base(const char *path, const char *base, char *dst, char **err);
 
 void ha_freearray(char ***array);
 
+void ha_memset_s(void *s, int c, size_t n);
+
 #endif /* _HAPROXY_TOOLS_H */
index aad4e56deb9490b14a26df0b2e53c4ce2eb43ca5..0f18132b197e7e01643d4f1fb7ff040c0406de29 100644 (file)
@@ -3756,7 +3756,7 @@ static int ssl_sock_clear_passphrase_cache(void)
 
                        /* Erase stored passphrases just in case some memory
                         * ends up leaking */
-                       memset(passphrase_cache[idx].ptr, 0, passphrase_cache[idx].len);
+                       ha_memset_s(passphrase_cache[idx].ptr, 0, passphrase_cache[idx].len);
                        istfree(&passphrase_cache[idx]);
                }
                ha_free(&passphrase_cache);
index e64c55ada166754877a779f17d044cb20fcb6f0b..f33800580df1e1e73cb5c7fbe453e0dd0aa88cbc 100644 (file)
@@ -7438,6 +7438,15 @@ void ha_freearray(char ***array)
        *array = NULL;
 }
 
+/*
+ * Secure implementation of memset that cannot be optimized away.
+ */
+void ha_memset_s(void *s, int c, size_t n)
+{
+       memset(s, c, n);
+       __asm__ __volatile__("" : : "r"(s) : "memory");
+}
+
 /*
  * Local variables:
  *  c-indent-level: 8