fix clobbering of errno in get(pw|gr)([ug]id|nam) by fclose
authorRich Felker <dalias@aerifal.cx>
Tue, 27 Sep 2011 20:45:29 +0000 (16:45 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 27 Sep 2011 20:45:29 +0000 (16:45 -0400)
src/passwd/getgrent.c
src/passwd/getpwent.c

index e9d25eba6397e4b819f0b3ecdb4e0d7b717ea75b..4cbe1ebfeaebe970592b327c0e36e643f2e7fa02 100644 (file)
@@ -23,17 +23,23 @@ struct group *getgrent()
 struct group *getgrgid(gid_t gid)
 {
        struct group *gr;
+       int errno_saved;
        setgrent();
        while ((gr=getgrent()) && gr->gr_gid != gid);
+       errno_saved = errno;
        endgrent();
+       errno = errno_saved;
        return gr;
 }
 
 struct group *getgrnam(const char *name)
 {
        struct group *gr;
+       int errno_saved;
        setgrent();
        while ((gr=getgrent()) && strcmp(gr->gr_name, name));
+       errno_saved = errno;
        endgrent();
+       errno = errno_saved;
        return gr;
 }
index dabd411ab987730b649ed765baead9bfb1c7d880..e8501461a794c90eb39610ab5c3b34727e79fd3a 100644 (file)
@@ -23,17 +23,23 @@ struct passwd *getpwent()
 struct passwd *getpwuid(uid_t uid)
 {
        struct passwd *pw;
+       int errno_saved;
        setpwent();
        while ((pw=getpwent()) && pw->pw_uid != uid);
+       errno_saved = errno;
        endpwent();
+       errno = errno_saved;
        return pw;
 }
 
 struct passwd *getpwnam(const char *name)
 {
        struct passwd *pw;
+       int errno_saved;
        setpwent();
        while ((pw=getpwent()) && strcmp(pw->pw_name, name));
+       errno_saved = errno;
        endpwent();
+       errno = errno_saved;
        return pw;
 }