]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Improved getpwnam() and getgrnam() error handling.
authorTimo Sirainen <tss@iki.fi>
Fri, 13 Mar 2009 22:36:50 +0000 (18:36 -0400)
committerTimo Sirainen <tss@iki.fi>
Fri, 13 Mar 2009 22:36:50 +0000 (18:36 -0400)
--HG--
branch : HEAD

src/auth/main.c

index 8a9704605875a7bc4a28e5bdf34379c18a9df360..0735c005c2ff230cc812da2c866c291cf66b094b 100644 (file)
@@ -80,8 +80,19 @@ static uid_t get_uid(const char *user)
        if (is_numeric(user, '\0'))
                return strtoul(user, NULL, 10);
 
-       if ((pw = getpwnam(user)) == NULL)
+       errno = 0;
+       if ((pw = getpwnam(user)) == NULL) {
+               if (errno != 0)
+                       i_fatal("User '%s' lookup failed: %m", user);
+               setpwent();
+               if (getpwent() == NULL) {
+                       if (errno != 0)
+                               i_fatal("getpwent() failed: %m");
+                       i_fatal("getpwnam() failed for some reason. "
+                               "Is auth_process_size set to too low?");
+               }
                i_fatal("User doesn't exist: %s", user);
+       }
        return pw->pw_uid;
 }
 
@@ -94,8 +105,13 @@ static gid_t get_gid(const char *group)
        if (is_numeric(group, '\0'))
                return strtoul(group, NULL, 10);
 
-       if ((gr = getgrnam(group)) == NULL)
-               i_fatal("Group doesn't exist: %s", group);
+       errno = 0;
+       if ((gr = getgrnam(group)) == NULL) {
+               if (errno != 0)
+                       i_fatal("Group '%s' lookup failed: %m", group);
+               else
+                       i_fatal("Group doesn't exist: %s", group);
+       }
        return gr->gr_gid;
 }