summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passwd/getgr_r.c1
-rw-r--r--src/passwd/getpw_r.c1
-rw-r--r--src/passwd/getspnam_r.c8
3 files changed, 7 insertions, 3 deletions
diff --git a/src/passwd/getgr_r.c b/src/passwd/getgr_r.c
index 7246e8a4..f3e8f603 100644
--- a/src/passwd/getgr_r.c
+++ b/src/passwd/getgr_r.c
@@ -34,6 +34,7 @@ static int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, siz
free(mem);
free(line);
pthread_setcancelstate(cs, 0);
+ if (rv) errno = rv;
return rv;
}
diff --git a/src/passwd/getpw_r.c b/src/passwd/getpw_r.c
index e8cc811e..0c87ab05 100644
--- a/src/passwd/getpw_r.c
+++ b/src/passwd/getpw_r.c
@@ -27,6 +27,7 @@ static int getpw_r(const char *name, uid_t uid, struct passwd *pw, char *buf, si
}
free(line);
pthread_setcancelstate(cs, 0);
+ if (rv) errno = rv;
return rv;
}
diff --git a/src/passwd/getspnam_r.c b/src/passwd/getspnam_r.c
index 92339528..e488b67f 100644
--- a/src/passwd/getspnam_r.c
+++ b/src/passwd/getspnam_r.c
@@ -72,14 +72,15 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct
/* Disallow potentially-malicious user names */
if (*name=='.' || strchr(name, '/') || !l)
- return EINVAL;
+ return errno = EINVAL;
/* Buffer size must at least be able to hold name, plus some.. */
- if (size < l+100) return ERANGE;
+ if (size < l+100)
+ return errno = EINVAL;
/* Protect against truncation */
if (snprintf(path, sizeof path, "/etc/tcb/%s/shadow", name) >= sizeof path)
- return EINVAL;
+ return errno = EINVAL;
fd = open(path, O_RDONLY|O_NOFOLLOW|O_NONBLOCK|O_CLOEXEC);
if (fd >= 0) {
@@ -112,5 +113,6 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct
break;
}
pthread_cleanup_pop(1);
+ if (rv) errno = rv;
return rv;
}