Re: fprintf() crashes on wide-oriented stream.

Brian Inglis <[email protected]>
Newsgroups gmane.comp.lib.newlib
Organization Inglis
Message-ID <[email protected]>
On 2023-11-02 12:53, Corinna Vinschen wrote:
> On Oct  4 16:16, Jeff Johnston wrote:
>> I finally took a look at this.  The issue is whether POSIX compliance is 
>> desired.   Corinna would have strong opinions that it is desired and thus,
>> I think she should have her say when she gets back.  I personally believe
>> that newlib should have behaved like glibc.

> I took a look into the POSIX docs.  POSIX aligns with ISO/IEC 9899:1999.
> The description is slightly vague, in that it only has to say this:
>    "Byte input/output functions cannot be applied to a wide-oriented
>     stream, and wide-character input/output functions cannot be applied to
>     a byte-oriented stream."
> It does not explicitely outline what "cannot be applied" means in this
> context.

That seems to me to imply that the compiler /could/ diagnose if oriented stream 
functions are used consistently, and that those explicitly byte- or 
wide-oriented stream I/O functions should check the orientation and fail, or do 
nothing, unless they are required to be flexible like the perror/psig... 
functions mentioned below, to adapt and not change the stream orientation.

> IIUC, this *could* mean that in case of the testcase a crash is as much
> standards-compliant as the GLibC behaviour. Not that a crash is desired,
> of course...
> In how far the BSD behaviour is covered by this description, I really
> can't tell.
> I wonder if the Austin group could clarify, or if a clarification
> already exists and I just missed it.  CC Eric, in case he wants to
> follow up on this.
> Either way, I think that the safe way forward is actually to behave
> as GLibC does.

As far as I could see, the only obvious changes are tweaks for exceptions about 
open_wmemstream.

It also looks like errno should be set to EBADF to indicate that the operation 
is invalid for the stream.

>> I also think the test snippet is invalid and should have performed an fwide
>> call on stdout to reset the wide-orientation and have the code work
>> properly in all cases.
That should not be necessary, as the first byte- or wide-oriented stream I/O 
function called against the stream after fopen or freopen sets the orientation 
from unoriented; that includes fwide() if called with a non-zero argument; 
otherwise fwide() may query the stream orientation but not change it after it is 
set.

> In terms of ISO/IEC 9899:1999 I agree. However, it also shows the
> flaw that newlib crashes with a buffer overflow, which we should
> avoid if possible.

Also note from Takashi's issue raised by Eric 5 years ago, perror(), psignal(), 
and psiginfo() "shall not change the orientation of the standard error stream":

https://collaboration.opengroup.org/operational/mailarch.php?soph=N&action=show&archive=austin-group-l&num=27231&limit=100&offset=9400&sid=

https://www.mail-archive.com/[email protected]/msg02582.html

-- 
Take care. Thanks, Brian Inglis              Calgary, Alberta, Canada

La perfection est atteinte                   Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter  not when there is no more to add
mais lorsqu'il n'y a plus rien à retirer     but when there is no more to cut
                                 -- Antoine de Saint-Exupéry
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.