fix erroneous return of partial username matches by getspnam[_r]
authorRich Felker <dalias@aerifal.cx>
Wed, 21 Jan 2015 19:26:05 +0000 (14:26 -0500)
committerRich Felker <dalias@aerifal.cx>
Wed, 21 Jan 2015 19:26:05 +0000 (14:26 -0500)
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.

src/passwd/getspnam_r.c

index 15f8c87b7dfbaba74c984b08b729fd68f2170c26..92339528ad170f2ed76d3bc3ba03a14b8e98c30e 100644 (file)
@@ -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;
                }