]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - libutil/pw_util.c
make pw_init and gr_init fail if the specified master password or group file is
[pw-darwin.git] / libutil / pw_util.c
index 5cd27b155ff4c96bc96b11201a52019f239854e9..6013e6d0640fa8de0a9817f6439683d3c577a6d8 100644 (file)
@@ -96,6 +96,7 @@ pw_init(const char *dir, const char *master)
 #if 0
        struct rlimit rlim;
 #endif
+       struct stat st;
 
        if (dir == NULL) {
                strcpy(passwd_dir, _PATH_ETC);
@@ -123,6 +124,14 @@ pw_init(const char *dir, const char *master)
                strcpy(masterpasswd, master);
        }
 
+       if (stat(masterpasswd, &st) == -1)
+               return (-1);
+
+       if (S_ISDIR(st.st_mode)) {
+               errno = EISDIR;
+               return (-1);
+       }
+
        /*
         * The code that follows is extremely disruptive to the calling
         * process, and is therefore disabled until someone can conceive
@@ -347,7 +356,8 @@ pw_edit(int notsetuid)
        sigprocmask(SIG_SETMASK, &oldsigset, NULL);
        if (stat(tempname, &st2) == -1)
                return (-1);
-       return (st1.st_mtime != st2.st_mtime);
+       return (st1.st_mtim.tv_sec != st2.st_mtim.tv_sec ||
+           st1.st_mtim.tv_nsec != st2.st_mtim.tv_nsec);
 }
 
 /*
@@ -436,14 +446,21 @@ pw_copy(int ffd, int tfd, const struct passwd *pw, struct passwd *old_pw)
        size_t len;
        int eof, readlen;
 
-       spw = pw;
+       if (old_pw == NULL && pw == NULL)
+                       return (-1);
+
+       spw = old_pw;
+       /* deleting a user */
        if (pw == NULL) {
                line = NULL;
-               if (old_pw == NULL)
+       } else {
+               if ((line = pw_make(pw)) == NULL)
                        return (-1);
-               spw = old_pw;
-       } else if ((line = pw_make(pw)) == NULL)
-               return (-1);
+       }
+
+       /* adding a user */
+       if (spw == NULL)
+               spw = pw;
 
        eof = 0;
        len = 0;
@@ -510,7 +527,7 @@ pw_copy(int ffd, int tfd, const struct passwd *pw, struct passwd *old_pw)
                 */
 
                *q = t;
-               if (fpw == NULL || fpw->pw_uid != spw->pw_uid) {
+               if (fpw == NULL || strcmp(fpw->pw_name, spw->pw_name) != 0) {
                        /* nope */
                        if (fpw != NULL)
                                free(fpw);