File useradd-mkdirs.patch of Package shadow.8622

Index: src/useradd.c
===================================================================
--- src/useradd.c.orig
+++ src/useradd.c
@@ -1943,6 +1943,13 @@ static void usr_update (void)
 static void create_home (void)
 {
 	if (access (user_home, F_OK) != 0) {
+		char path[strlen (user_home) + 2];
+		char *bhome, *cp;
+
+		path[0] = '\0';
+		bhome = strdup (user_home);
+		++bhome;
+
 #ifdef WITH_SELINUX
 		if (set_selinux_file_context (user_home) != 0) {
 			fprintf (stderr,
@@ -1951,19 +1958,42 @@ static void create_home (void)
 			fail_exit (E_HOMEDIR);
 		}
 #endif
-		/* XXX - create missing parent directories.  --marekm */
-		if (mkdir (user_home, 0) != 0) {
-			fprintf (stderr,
-			         _("%s: cannot create directory %s\n"),
-			         Prog, user_home);
+
+		/* Check for every part of the path, if the directory
+		   exists. If not, create it with permissions 755 and
+		   owner root:root.
+		 */
+		cp = strtok (bhome, "/");
+		while (cp) {
+			strcat (path, "/");
+			strcat (path, cp);
+			if (access (path, F_OK) != 0) {
+				if (mkdir (path, 0) != 0) {
+					fprintf (stderr,
+					         _("%s: cannot create directory %s\n"),
+					         Prog, path);
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_ADD_USER, Prog,
-			              "adding home directory",
-			              user_name, (unsigned int) user_id,
-			              SHADOW_AUDIT_FAILURE);
+					audit_logger (AUDIT_ADD_USER, Prog,
+								  "adding home directory",
+								  user_name, (unsigned int) user_id,
+								  SHADOW_AUDIT_FAILURE);
 #endif
-			fail_exit (E_HOMEDIR);
+					fail_exit (E_HOMEDIR);
+				}
+				if (chown (path, 0, 0) < 0) {
+					fprintf (stderr,
+					         _("%s: warning: chown on `%s' failed: %m\n"),
+					         Prog, path);
+				}
+				if (chmod (path, 0755) < 0) {
+					fprintf (stderr,
+					         _("%s: warning: chmod on `%s' failed: %m\n"),
+					         Prog, path);
+				}
+			}
+			cp = strtok (NULL, "/");
 		}
+
 		chown (user_home, user_id, user_gid);
 		chmod (user_home,
 		       0777 & ~getdef_num ("UMASK", GETDEF_DEFAULT_UMASK));