From fd466889b49dfe528567587183c2aedd27836f27 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Fri, 7 Jun 2024 14:50:18 -0400 Subject: split formatted I/O header, unify undefined behavior reporting with UNDEFINED_FMT() macro --- src/stdio/fgetpos.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/stdio/fgetpos.c') 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; } -- cgit v1.2.1