]> andersk Git - nss_nonlocal.git/commitdiff
Fix errno saving and restoring
authorAnders Kaseorg <andersk@mit.edu>
Sat, 21 Aug 2010 23:28:11 +0000 (19:28 -0400)
committerAnders Kaseorg <andersk@mit.edu>
Mon, 23 Aug 2010 01:08:55 +0000 (21:08 -0400)
Previously, the errno from malloc and check_nonlocal_{uid,gid} was
getting lost when errnop == &errno.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
nonlocal-group.c
nonlocal-passwd.c

index c7903bd09a6b9ae0bc0724e5f92b095c06af4b3b..c75ecf70a9479f22a9acc1bb9cfab90d2da1ed81 100644 (file)
@@ -80,9 +80,9 @@ check_nonlocal_gid(const char *user, gid_t gid, int *errnop)
 
     size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
     char *buf = malloc(buflen);
 
     size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
     char *buf = malloc(buflen);
+    errno = old_errno;
     if (buf == NULL) {
        *errnop = ENOMEM;
     if (buf == NULL) {
        *errnop = ENOMEM;
-       errno = old_errno;
        return NSS_STATUS_TRYAGAIN;
     }
 
        return NSS_STATUS_TRYAGAIN;
     }
 
@@ -103,9 +103,9 @@ check_nonlocal_gid(const char *user, gid_t gid, int *errnop)
            free(buf);
            buflen *= 2;
            buf = malloc(buflen);
            free(buf);
            buflen *= 2;
            buf = malloc(buflen);
+           errno = old_errno;
            if (buf == NULL) {
                *errnop = ENOMEM;
            if (buf == NULL) {
                *errnop = ENOMEM;
-               errno = old_errno;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
@@ -133,9 +133,11 @@ check_nonlocal_group(const char *user, struct group *grp, int *errnop)
 
     errno = 0;
     gid = strtoul(grp->gr_name, &end, 10);
 
     errno = 0;
     gid = strtoul(grp->gr_name, &end, 10);
-    if (errno == 0 && *end == '\0' && (gid_t)gid == gid)
+    if (errno == 0 && *end == '\0' && (gid_t)gid == gid) {
+       errno = old_errno;
        status = check_nonlocal_gid(user, gid, errnop);
        status = check_nonlocal_gid(user, gid, errnop);
-    errno = old_errno;
+    } else
+       errno = old_errno;
     if (status != NSS_STATUS_SUCCESS)
        return status;
 
     if (status != NSS_STATUS_SUCCESS)
        return status;
 
@@ -160,9 +162,9 @@ get_local_group(const char *name, struct group *grp, char **buffer, int *errnop)
 
     buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
     *buffer = malloc(buflen);
 
     buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
     *buffer = malloc(buflen);
+    errno = old_errno;
     if (*buffer == NULL) {
        *errnop = ENOMEM;
     if (*buffer == NULL) {
        *errnop = ENOMEM;
-       errno = old_errno;
        return NSS_STATUS_TRYAGAIN;
     }
 
        return NSS_STATUS_TRYAGAIN;
     }
 
@@ -184,9 +186,9 @@ get_local_group(const char *name, struct group *grp, char **buffer, int *errnop)
            free(*buffer);
            buflen *= 2;
            *buffer = malloc(buflen);
            free(*buffer);
            buflen *= 2;
            *buffer = malloc(buflen);
+           errno = old_errno;
            if (*buffer == NULL) {
                *errnop = ENOMEM;
            if (*buffer == NULL) {
                *errnop = ENOMEM;
-               errno = old_errno;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
@@ -474,9 +476,9 @@ _nss_nonlocal_initgroups_dyn(const char *user, gid_t group, long int *start,
                        newsize = limit;
                }
                newgroups = realloc(*groupsp, newsize * sizeof((*groupsp)[0]));
                        newsize = limit;
                }
                newgroups = realloc(*groupsp, newsize * sizeof((*groupsp)[0]));
+               errno = old_errno;
                if (newgroups == NULL) {
                    *errnop = ENOMEM;
                if (newgroups == NULL) {
                    *errnop = ENOMEM;
-                   errno = old_errno;
                    return NSS_STATUS_TRYAGAIN;
                }
                *groupsp = newgroups;
                    return NSS_STATUS_TRYAGAIN;
                }
                *groupsp = newgroups;
index 474db13d93d77ff76fc52c50a6695e52b522ca73..bd9d9ad206e0b700b334fa2ca606c7e9ba9a5445 100644 (file)
@@ -78,9 +78,9 @@ check_nonlocal_uid(const char *user, uid_t uid, int *errnop)
 
     size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
     char *buf = malloc(buflen);
 
     size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
     char *buf = malloc(buflen);
+    errno = old_errno;
     if (buf == NULL) {
        *errnop = ENOMEM;
     if (buf == NULL) {
        *errnop = ENOMEM;
-       errno = old_errno;
        return NSS_STATUS_TRYAGAIN;
     }
 
        return NSS_STATUS_TRYAGAIN;
     }
 
@@ -101,9 +101,9 @@ check_nonlocal_uid(const char *user, uid_t uid, int *errnop)
            free(buf);
            buflen *= 2;
            buf = malloc(buflen);
            free(buf);
            buflen *= 2;
            buf = malloc(buflen);
+           errno = old_errno;
            if (buf == NULL) {
                *errnop = ENOMEM;
            if (buf == NULL) {
                *errnop = ENOMEM;
-               errno = old_errno;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
@@ -131,9 +131,12 @@ check_nonlocal_passwd(const char *user, struct passwd *pwd, int *errnop)
 
     errno = 0;
     uid = strtoul(pwd->pw_name, &end, 10);
 
     errno = 0;
     uid = strtoul(pwd->pw_name, &end, 10);
-    if (errno == 0 && *end == '\0' && (uid_t)uid == uid)
+    if (errno == 0 && *end == '\0' && (uid_t)uid == uid) {
+       errno = old_errno;
        status = check_nonlocal_uid(user, uid, errnop);
        status = check_nonlocal_uid(user, uid, errnop);
-    errno = old_errno;
+    } else {
+       errno = old_errno;
+    }
     if (status != NSS_STATUS_SUCCESS)
        return status;
 
     if (status != NSS_STATUS_SUCCESS)
        return status;
 
@@ -158,9 +161,9 @@ check_nonlocal_user(const char *user, int *errnop)
 
     size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
     char *buf = malloc(buflen);
 
     size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
     char *buf = malloc(buflen);
+    errno = old_errno;
     if (buf == NULL) {
        *errnop = ENOMEM;
     if (buf == NULL) {
        *errnop = ENOMEM;
-       errno = old_errno;
        return NSS_STATUS_TRYAGAIN;
     }
 
        return NSS_STATUS_TRYAGAIN;
     }
 
@@ -181,9 +184,9 @@ check_nonlocal_user(const char *user, int *errnop)
            free(buf);
            buflen *= 2;
            buf = malloc(buflen);
            free(buf);
            buflen *= 2;
            buf = malloc(buflen);
+           errno = old_errno;
            if (buf == NULL) {
                *errnop = ENOMEM;
            if (buf == NULL) {
                *errnop = ENOMEM;
-               errno = old_errno;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
                return NSS_STATUS_TRYAGAIN;
            }
            goto morebuf;
This page took 0.096186 seconds and 5 git commands to generate.