|
From: <ssm...@us...> - 2007-09-28 13:38:21
|
Revision: 2621
http://selinux.svn.sourceforge.net/selinux/?rev=2621&view=rev
Author: ssmalley
Date: 2007-09-28 06:38:20 -0700 (Fri, 28 Sep 2007)
Log Message:
-----------
Author: "Todd C. Miller"
Email: tm...@tr...
Subject: libsemanage: fix getpw*_r usage
Date: Thu, 27 Sep 2007 16:07:14 -0400
getpwnam_r() returns 0 when a user doesn't exist and just zeroes the
struct passwd pointer. However, getpwent_r() returns ENOENT when there
are no more users. This diff deals with both possible behaviors so that
if the two functions are brought in line nothing will break. We can
also remove the errno check and use the return value directly.
Acked-by: Stephen Smalley <sd...@ty...>
Modified Paths:
--------------
trunk/libsemanage/src/genhomedircon.c
Modified: trunk/libsemanage/src/genhomedircon.c
===================================================================
--- trunk/libsemanage/src/genhomedircon.c 2007-09-28 13:02:44 UTC (rev 2620)
+++ trunk/libsemanage/src/genhomedircon.c 2007-09-28 13:38:20 UTC (rev 2621)
@@ -154,6 +154,7 @@
size_t temp;
struct passwd pwstorage, *pwbuf;
struct stat buf;
+ int retval;
shells = get_shell_list();
assert(shells);
@@ -225,7 +226,7 @@
if (rbuf == NULL)
goto fail;
setpwent();
- for (errno = 0; getpwent_r(&pwstorage, rbuf, rbuflen, &pwbuf) == 0; errno = 0) {
+ while ((retval = getpwent_r(&pwstorage, rbuf, rbuflen, &pwbuf)) == 0) {
if (pwbuf->pw_uid < minuid)
continue;
if (!semanage_list_find(shells, pwbuf->pw_shell))
@@ -248,7 +249,7 @@
free(path);
}
- if (errno) {
+ if (retval && retval != ENOENT) {
WARN(s->h_semanage, "Error while fetching users. "
"Returning list so far.");
}
@@ -557,12 +558,13 @@
prefix = name;
}
- errno = 0;
- if (getpwnam_r(name, &pwstorage, rbuf, rbuflen, &pwent) != 0) {
- if (errno != 0) {
+ retval = getpwnam_r(name, &pwstorage, rbuf, rbuflen, &pwent);
+ if (retval != 0 || pwent == NULL) {
+ if (retval != 0 && retval != ENOENT) {
*errors = STATUS_ERR;
goto cleanup;
}
+
WARN(s->h_semanage,
"user %s not in password file", name);
continue;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|