summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/getgrent.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/libc/gen/getgrent.c b/lib/libc/gen/getgrent.c
index d9ea5bd..511eddd 100644
--- a/lib/libc/gen/getgrent.c
+++ b/lib/libc/gen/getgrent.c
@@ -721,6 +721,7 @@ files_group(void *retval, void *mdata, va_list ap)
gid_t gid;
char *buffer;
size_t bufsize, linesize;
+ off_t pos;
int rv, stayopen, *errnop;
name = NULL;
@@ -757,6 +758,7 @@ files_group(void *retval, void *mdata, va_list ap)
stayopen = st->stayopen;
}
rv = NS_NOTFOUND;
+ pos = ftello(st->fp);
while ((line = fgetln(st->fp, &linesize)) != NULL) {
if (line[linesize-1] == '\n')
linesize--;
@@ -768,10 +770,12 @@ 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,
@@ -1183,6 +1187,7 @@ compat_group(void *retval, void *mdata, va_list ap)
char *buffer, *p;
void *discard;
size_t bufsize, linesize;
+ off_t pos;
int rv, stayopen, *errnop;
#define set_lookup_type(x, y) do { \
@@ -1286,6 +1291,7 @@ docompat:
break;
}
rv = NS_NOTFOUND;
+ pos = ftello(st->fp);
while ((line = fgetln(st->fp, &linesize)) != NULL) {
if (line[linesize-1] == '\n')
linesize--;
@@ -1316,10 +1322,12 @@ 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,
OpenPOWER on IntegriCloud