summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/getgrent.c
diff options
context:
space:
mode:
authormaxim <maxim@FreeBSD.org>2006-07-14 17:45:33 +0000
committermaxim <maxim@FreeBSD.org>2006-07-14 17:45:33 +0000
commite03f872cade2e316e6b08a0916890bfbba303f8e (patch)
tree28e390affbaf7a466cac58349dfcec1d72d197f6 /lib/libc/gen/getgrent.c
parentdf5064de2318ece3fcb5441c260bd90a69112eae (diff)
downloadFreeBSD-src-e03f872cade2e316e6b08a0916890bfbba303f8e.zip
FreeBSD-src-e03f872cade2e316e6b08a0916890bfbba303f8e.tar.gz
o compat_group() and files_group() are more complicated than I thought
in rev. 1.34. Mainly I missed the fact that the buffer is used for two purposes: 1) storing a group line from the group file; 2) __gr_parse_entry() parses the buffer and tries to put the group members to the remaining part of the buffer and can fail if there is no enough room for them. Re-arrange the buffer size checks to account the latter case. Submitted by: Kirk R Webb MFC after: 2 weeks
Diffstat (limited to 'lib/libc/gen/getgrent.c')
-rw-r--r--lib/libc/gen/getgrent.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/libc/gen/getgrent.c b/lib/libc/gen/getgrent.c
index 511eddd..714433e 100644
--- a/lib/libc/gen/getgrent.c
+++ b/lib/libc/gen/getgrent.c
@@ -770,18 +770,17 @@ files_group(void *retval, void *mdata, va_list ap)
* pointer for the member list terminator.
*/
if (bufsize <= linesize + _ALIGNBYTES + sizeof(char *)) {
- fseeko(st->fp, pos, SEEK_SET);
*errnop = ERANGE;
rv = NS_RETURN;
break;
}
- pos = ftello(st->fp);
memcpy(buffer, line, linesize);
buffer[linesize] = '\0';
rv = __gr_parse_entry(buffer, linesize, grp,
&buffer[linesize + 1], bufsize - linesize - 1, errnop);
if (rv & NS_TERMINATE)
break;
+ pos = ftello(st->fp);
}
if (!stayopen && st->fp != NULL) {
fclose(st->fp);
@@ -789,6 +788,8 @@ files_group(void *retval, void *mdata, va_list ap)
}
if (rv == NS_SUCCESS && retval != NULL)
*(struct group **)retval = grp;
+ else if (*errnop == ERANGE)
+ fseeko(st->fp, pos, SEEK_SET);
return (rv);
}
@@ -1322,18 +1323,17 @@ docompat:
* pointer for the member list terminator.
*/
if (bufsize <= linesize + _ALIGNBYTES + sizeof(char *)) {
- fseeko(st->fp, pos, SEEK_SET);
*errnop = ERANGE;
rv = NS_RETURN;
break;
}
- pos = ftello(st->fp);
memcpy(buffer, line, linesize);
buffer[linesize] = '\0';
rv = __gr_parse_entry(buffer, linesize, grp,
&buffer[linesize + 1], bufsize - linesize - 1, errnop);
if (rv & NS_TERMINATE)
break;
+ pos = ftello(st->fp);
}
fin:
if (!stayopen && st->fp != NULL) {
@@ -1342,6 +1342,8 @@ fin:
}
if (rv == NS_SUCCESS && retval != NULL)
*(struct group **)retval = grp;
+ else if (*errnop == ERANGE)
+ fseeko(st->fp, pos, SEEK_SET);
return (rv);
#undef set_lookup_type
}
OpenPOWER on IntegriCloud