summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-01-21 14:26:05 -0500
committerRich Felker <dalias@aerifal.cx>2015-03-30 01:41:34 -0400
commit26049588946f9439359697a1effa68ea7b711e18 (patch)
treed8d6082dcb4336d3048f32117fbfa7e9bd25f762
parent5087ba67af3bef48ef8872e1b2ffda04623fc65b (diff)
downloadmusl-26049588946f9439359697a1effa68ea7b711e18.tar.gz
fix erroneous return of partial username matches by getspnam[_r]
when using /etc/shadow (rather than tcb) as its backend, getspnam_r matched any username starting with the caller-provided string rather than requiring an exact match. in practice this seems to have affected only systems where one valid username is a prefix for another valid username, and where the longer username appears first in the shadow file. (cherry picked from commit ecb608192a48d3688e1a0a21027bfd968d3301a1)
-rw-r--r--src/passwd/getspnam_r.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/passwd/getspnam_r.c b/src/passwd/getspnam_r.c
index 15f8c87b..92339528 100644
--- a/src/passwd/getspnam_r.c
+++ b/src/passwd/getspnam_r.c
@@ -98,7 +98,7 @@ int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct
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;
}