diff --git a/src/passwd/getpw_r.c b/src/passwd/getpw_r.c index e8cc811..0c87ab0 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 9233952..47ce3d3 100644 --- a/src/passwd/getspnam_r.c +++ b/src/passwd/getspnam_r.c @@ -72,14 +72,24 @@ 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) + { + errno = EINVAL; return EINVAL; + } /* Buffer size must at least be able to hold name, plus some.. */ - if (size < l+100) return ERANGE; + if (size < l+100) + { + errno = EINVAL; + return ERANGE; + } /* Protect against truncation */ if (snprintf(path, sizeof path, "/etc/tcb/%s/shadow", name) >= sizeof path) + { + errno = EINVAL; return EINVAL; + } fd = open(path, O_RDONLY|O_NOFOLLOW|O_NONBLOCK|O_CLOEXEC); if (fd >= 0) { @@ -112,5 +122,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; }