Submitted By:            Bruce Dubbs <bdubbs@linusfromscratch.org>
Date:                    2021-12-30
Initial Package Version: 4.10
Upstream Status:         Merged
Origin:                  Xi Ruoyao
Description:             Fix a segfault when doing a useradd -D operation.

From 6f266a30ffbcff7a14b4b7df91966550fd43c0b5 Mon Sep 17 00:00:00 2001
From: Xi Ruoyao <xry111@mengyan1223.wang>
Date: Wed, 29 Dec 2021 17:06:39 +0800
Subject: [PATCH] fix segfault running useradd -D

---
 src/useradd.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/useradd.c b/src/useradd.c
index 179e0898..a7558b5a 100644
--- a/src/useradd.c
+++ b/src/useradd.c
@@ -41,6 +41,7 @@
 #include <getopt.h>
 #include <grp.h>
 #include <lastlog.h>
+#include <libgen.h>
 #include <pwd.h>
 #ifdef ACCT_TOOLS_SETUID
 #ifdef USE_PAM
@@ -538,6 +539,7 @@ static int set_defaults (void)
 	FILE *ofp;
 	char buf[1024];
 	char *new_file = NULL;
+	char *new_file_dup = NULL;
 	char *default_file = USER_DEFAULTS_FILE;
 	char *cp;
 	int ofd;
@@ -578,13 +580,23 @@ static int set_defaults (void)
 		assert (wlen == (int) len -1);
 	}
 
-	ret = mkdir(dirname(NEW_USER_FILE), 0755);
+	new_file_dup = strdup(new_file);
+	if (new_file_dup == NULL) {
+		fprintf (stderr,
+			_("%s: cannot create directory for defaults file\n"),
+			Prog);
+		goto setdef_err;
+	}
+
+	ret = mkdir(dirname(new_file_dup), 0755);
 	if (-1 == ret && EEXIST != errno) {
 		fprintf (stderr,
 			_("%s: cannot create directory for defaults file\n"),
 			Prog);
+		free(new_file_dup);
 		goto setdef_err;
 	}
+	free(new_file_dup);
 
 	/*
 	 * Create a temporary file to copy the new output to.
