[PATCH] Allow fseek optimization also for cookied files.

Corinna Vinschen vinschen@redhat.com
Mon Feb 20 10:41:48 GMT 2023

On Feb 19 02:40, Giovanni Bajo wrote:
> Currently, fseek allows for a seek optimization where it does not
> actually seek if the target is within the current buffer. This
> optimization, though, is disabled in case of files with custom seek
> functions, such as those created by funopen / fopencookie. 
> This prevents a useful use case of those functions: creating a transparent
> streaming decompressor (eg: gzopen). In fact, it is customary to
> allow streaming decompressors to be able to seek forward (by skipping
> bytes), but because of the missing seek optimization, even a simple
> one-byte seek forward might become a backward seek (that is, a seek
> that moves from the end of the current buffer backward to the seek
> destination within the buffer).
> Since the check was explicit, there might be good reasons for it that
> elude me. It looks to me that if buffering is allowed by files
> returned by funopen, then the seek optimization cannot be a violation
> of the funopen protocol, because otherwise it should also be invalid
> to call the underlying readfn callback with size BUFSIZ when the user
> requested a different size. People that want an absolute 1:1 match
> between user-level calls and callbacks can obtain that by disabling
> buffering.

I'm not entirely sure about the reasing behind this, but the code in
newlib in terms of the seek optimization is still equivalent to the
upstream code in OpenBSD as well as FreeBSD.

Changing such a crucial piece of code and deviating from upstream
sounds like introducing subtil problems...


More information about the Newlib mailing list