diff options
Diffstat (limited to 'lib/libc/gen/getgrent.c')
-rw-r--r-- | lib/libc/gen/getgrent.c | 10 |
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 } |