diff options
Diffstat (limited to 'src/stdio/fgetpos.c')
-rw-r--r-- | src/stdio/fgetpos.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/stdio/fgetpos.c b/src/stdio/fgetpos.c index 8e6d201e..2f105f6a 100644 --- a/src/stdio/fgetpos.c +++ b/src/stdio/fgetpos.c @@ -6,10 +6,21 @@ int fgetpos(FILE * restrict stream, fpos_t * restrict pos) { SIGNAL_SAFE(0); + ASSERT_STREAM(stream, 0, 0); + ASSERT_NONNULL(pos); ASSERT_NOOVERLAP(stream, sizeof(*stream), pos, sizeof(*pos)); flockfile(stream); - *pos = stream->pos; + if (!(pos->__impl >= stream->fpos && pos->__impl <= stream->fpos + stream->nfpos)) { + struct __fpos_t *tmp = realloc(stream->fpos, sizeof(*stream->fpos) * (stream->nfpos + 1)); + if (tmp == NULL) { + abort(); + } + stream->fpos = tmp; + pos->__impl = &(stream->fpos[stream->nfpos++]); + } + + pos->__impl->pos = ftell(stream); funlockfile(stream); return 0; } |