From ccb8cf88c8e6078c536e7beb4f461ed19d197c31 Mon Sep 17 00:00:00 2001 From: Theo Buehler Date: Fri, 27 Jun 2025 23:21:32 +0200 Subject: [PATCH] Unbreak torture_config_make_absolute() on OpenBSD The torture_config_make_absolute() and its _no_sshdir() version both segfault on OpenBSD. The reason for this is that the storage returned by getpwuid() is backed by mmap and is unapped by the getpwnam() call in ssh_path_expand_tilde(), so a later access to home segfaults. The possibility of this happening (getpwnam() overwriting values returned by getpwuid()) is explicitly called out in POSIX. A simple fix is to work with copies of username and homedir. Signed-off-by: Theo Buehler Reviewed-by: Jakub Jelen --- tests/unittests/torture_config.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/unittests/torture_config.c b/tests/unittests/torture_config.c index dc8286e5..75249fe7 100644 --- a/tests/unittests/torture_config.c +++ b/tests/unittests/torture_config.c @@ -2468,9 +2468,9 @@ static void torture_config_make_absolute_int(void **state, bool no_sshdir_fails) char *home = NULL; struct passwd *pw = getpwuid(getuid()); assert_non_null(pw); - user = pw->pw_name; + user = strdup(pw->pw_name); assert_non_null(user); - home = pw->pw_dir; + home = strdup(pw->pw_dir); assert_non_null(home); #endif @@ -2528,6 +2528,8 @@ static void torture_config_make_absolute_int(void **state, bool no_sshdir_fails) snprintf(h, 256 - 1, "/etc/ssh/~%s/.ssh/config.d/*.conf", user); assert_string_equal(result, h); free(result); + free(home); + free(user); #endif }