diff options
author | Bill Paul <wpaul@FreeBSD.org> | 1997-11-16 03:02:39 +0000 |
---|---|---|
committer | Bill Paul <wpaul@FreeBSD.org> | 1997-11-16 03:02:39 +0000 |
commit | d9cc92f584084e320bc8e1f437fd46843924762f (patch) | |
tree | 60dcea468964a1e542f2ccca2088f712947cf055 /lib | |
parent | 40b8c3d00880b882bc21d05af8dedf907bb8c8eb (diff) | |
download | src-d9cc92f584084e320bc8e1f437fd46843924762f.tar.gz src-d9cc92f584084e320bc8e1f437fd46843924762f.zip |
Close PR #4867: improve _listmatch() to avoid returning false positives.
PR: 4867
Notes
Notes:
svn path=/head/; revision=31180
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/gen/getnetgrent.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/libc/gen/getnetgrent.c b/lib/libc/gen/getnetgrent.c index 605dd500e422..cc04f2f0d7bb 100644 --- a/lib/libc/gen/getnetgrent.c +++ b/lib/libc/gen/getnetgrent.c @@ -276,17 +276,24 @@ endnetgrent() #ifdef YP static int _listmatch(list, group, len) -char *list, *group; -int len; + char *list, *group; + int len; { - char *ptr = list; - - while ( (ptr = strstr(ptr, group)) ) { - - ptr += strlen(group); - - if (*ptr == ',' || *ptr == '\0') + char *ptr = list, *cptr; + int glen = strlen(group); + + /* skip possible leading whitespace */ + while(isspace(*ptr)) + ptr++; + + while (ptr < list + len) { + cptr = ptr; + while(*ptr != ',' && !isspace(*ptr)) + ptr++; + if (strncmp(cptr, group, glen) == 0 && glen == (ptr - cptr)) return(1); + while(*ptr == ',' || isspace(*ptr)) + ptr++; } return(0); |