]> granicus.if.org Git - linux-pam/commitdiff
Relevant BUGIDs:
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 21 Oct 2010 15:00:12 +0000 (15:00 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 21 Oct 2010 15:00:12 +0000 (15:00 +0000)
Purpose of commit: cleanup

Commit summary:
---------------
2010-10-21  Dmitry V. Levin  <ldv@altlinux.org>

* modules/pam_mkhomedir/mkhomedir_helper.c (rec_mkdir): Remove.
(create_homedir): Use mkdir() instead of rec_mkdir().
(make_parent_dirs): New function.
(main): Use make_parent_dirs() to create parent directories only
for the home directory itself.

ChangeLog
modules/pam_mkhomedir/mkhomedir_helper.c

index cfa1a1ac27e69562a01553bf284e5475ad60c891..caf10304f2ea9bfdd29b32e4c73287ff39c2cfa2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-10-21  Dmitry V. Levin  <ldv@altlinux.org>
+
+       * modules/pam_mkhomedir/mkhomedir_helper.c (rec_mkdir): Remove.
+       (create_homedir): Use mkdir() instead of rec_mkdir().
+       (make_parent_dirs): New function.
+       (main): Use make_parent_dirs() to create parent directories only
+       for the home directory itself.
+
 2010-10-21  Thorsten Kukuk  <kukuk@thkukuk.de>
 
        * modules/pam_unix/support.c (_unix_getpwnam): Don't allocate
index 0ed41d6654627ecb7f6e58c218cf34b812e94f4f..2a47de3ab22d9cdd745f985e1fc644ca44162ce1 100644 (file)
 static unsigned long u_mask = 0022;
 static char skeldir[BUFSIZ] = "/etc/skel";
 
-static int
-rec_mkdir(const char *dir, mode_t mode)
-{
-  char *cp;
-  char *parent = strdup(dir);
-
-  if (parent == NULL)
-    return 1;
-
-  cp = strrchr(parent, '/');
-
-  if (cp != NULL && cp != parent)
-    {
-      struct stat st;
-
-      *cp++ = '\0';
-      if (stat(parent, &st) == -1 && errno == ENOENT)
-        if (rec_mkdir(parent, 0755) != 0)
-         {
-           free(parent);
-           return 1;
-         }
-    }
-
-  free(parent);
-
-  if (mkdir(dir, mode) != 0 && errno != EEXIST)
-    return 1;
-
-  return 0;
-}
-
 /* Do the actual work of creating a home dir */
 static int
 create_homedir(const struct passwd *pwd,
@@ -72,7 +40,7 @@ create_homedir(const struct passwd *pwd,
    int retval = PAM_SESSION_ERR;
 
    /* Create the new directory */
-   if (rec_mkdir(dest, 0700) != 0)
+   if (mkdir(dest, 0700) && errno != EEXIST)
    {
       pam_syslog(NULL, LOG_ERR, "unable to create directory %s: %m", dest);
       return PAM_PERM_DENIED;
@@ -377,10 +345,36 @@ create_homedir(const struct passwd *pwd,
    return retval;
 }
 
+static int
+make_parent_dirs(char *dir, int make)
+{
+  int rc = PAM_SUCCESS;
+  char *cp = strrchr(dir, '/');
+  struct stat st;
+
+  if (!cp || cp == dir)
+    return rc;
+
+  *cp = '\0';
+  if (stat(dir, &st) && errno == ENOENT)
+    rc = make_parent_dirs(dir, 1);
+  *cp = '/';
+
+  if (rc != PAM_SUCCESS)
+    return rc;
+
+  if (make && mkdir(dir, 0755) && errno != EEXIST) {
+    pam_syslog(NULL, LOG_ERR, "unable to create directory %s: %m", dir);
+    return PAM_PERM_DENIED;
+  }
+
+  return rc;
+}
+
 int
 main(int argc, char *argv[])
 {
-   const struct passwd *pwd;
+   struct passwd *pwd;
    struct stat st;
 
    if (argc < 2) {
@@ -417,5 +411,8 @@ main(int argc, char *argv[])
    if (stat(pwd->pw_dir, &st) == 0)
        return PAM_SUCCESS;
 
+   if (make_parent_dirs(pwd->pw_dir, 0) != PAM_SUCCESS)
+       return PAM_PERM_DENIED;
+
    return create_homedir(pwd, skeldir, pwd->pw_dir);
 }