X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fpasswd%2Fgetspnam_r.c;h=541e85314d56cc36d7b752ec9693563390ca07b2;hb=c87d75f2aa6fde49a99cf3287e535a14f354f781;hp=15f8c87b7dfbaba74c984b08b729fd68f2170c26;hpb=b3646b30d670ac5a38674ecc492c38f7d4e92682;p=musl diff --git a/src/passwd/getspnam_r.c b/src/passwd/getspnam_r.c index 15f8c87b..541e8531 100644 --- a/src/passwd/getspnam_r.c +++ b/src/passwd/getspnam_r.c @@ -67,19 +67,21 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct size_t k, l = strlen(name); int skip = 0; int cs; + int orig_errno = errno; *res = 0; /* 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 = ERANGE; /* 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) { @@ -92,13 +94,19 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct return errno; } } else { + if (errno != ENOENT && errno != ENOTDIR) + return errno; f = fopen("/etc/shadow", "rbe"); - if (!f) return errno; + if (!f) { + if (errno != ENOENT && errno != ENOTDIR) + return errno; + return 0; + } } pthread_cleanup_push(cleanup, f); while (fgets(buf, size, f) && (k=strlen(buf))>0) { - if (skip || strncmp(name, buf, l)) { + if (skip || strncmp(name, buf, l) || buf[l]!=':') { skip = buf[k-1] != '\n'; continue; } @@ -112,5 +120,6 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct break; } pthread_cleanup_pop(1); + errno = rv ? rv : orig_errno; return rv; }