[PATCH v2] libio: Ignore setbuf for open_memstream [BZ #34019]

Alex Gao gaoxiang@kylinos.cn
Mon May 4 16:54:14 GMT 2026


On 2026/5/4 20:04, Adhemerval Zanella Netto wrote:
> 
> 
> On 01/05/26 13:24, Rocket Ma wrote:
>>> Wouldn't this change the behavior or setbuf (NULL, ..) and setbuf (..., 0)
>>> to not be _IO_UNBUFFERED?
>>>
>>> I think it does not seems to matter though, since the resulting buffer operated
>>> by open_memstream can only be accessible after a fflush/fclose.  The
>>> setbuf/setvbuf would only be a way to optimize the stdio buffer flush to
>>> final one, which I am also not fully sure it would matter here.
>>>
>>
>> Referencing POSIX standard[1], fflush and fclose are explicitly
>> mentioned when describing `bufp` and `sizep`, which may indicate that
>> user shall always flush the stream. But the standard does not mention
>> the behavior of setbuf. I'm also not sure if we should allow user to
>> setbuf.
>>
>> [1]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/open_memstream.html
> 
> I think ignoring set{v}buf makes sense here, we can make it orthogonal to other
> stream by the current POSIX description makes invisible to user anyway.

Thanks, that makes sense.

I will treat setbuf/setvbuf as orthogonal to the memory-stream result 
buffer.The backing buffer of open_memstream/open_wmemstream is the 
growable result object itself, not discardable. Therefore the generic 
buffering operation is not appropriate here: it must not reset the 
get/put areas.

While adding setvbuf coverage, I confirmed that the current hook change 
covers the setvbuf paths that reach _IO_SETBUF, but I also found one 
related case:

setvbuf(fp, NULL, _IOFBF, 0)

This can bypass the setbuf hook and go through doallocate instead. In 
that path default wide buffering code may still disturb the wide result 
buffer. I will send a separate patch(v3) for wmemstream doallocate path.


More information about the Libc-alpha mailing list