changeset 8830:d6acde4e9fe0 HEAD

auth: Improved getpwnam() and getgrnam() error handling.
author Timo Sirainen <tss@iki.fi>
date Fri, 13 Mar 2009 18:36:50 -0400
parents f67a966f2792
children 116ca52dfcb5
files src/auth/main.c
diffstat 1 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/main.c	Fri Mar 13 18:05:10 2009 -0400
+++ b/src/auth/main.c	Fri Mar 13 18:36:50 2009 -0400
@@ -80,8 +80,19 @@
 	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 @@
 	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;
 }