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. |