summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/getgrent.c
diff options
context:
space:
mode:
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