mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: Pinghao Wu <xdavidwuph@gmail.com>
Cc: musl@lists.openwall.com
Subject: Re: [musl] [PATCH v2] fgetws: fix checking for fgetwc errors
Date: Sat, 19 Feb 2022 19:57:50 -0500	[thread overview]
Message-ID: <20220220005749.GW7074@brightrain.aerifal.cx> (raw)
In-Reply-To: <20220210030813.1943-1-xdavidwuph@gmail.com>

On Thu, Feb 10, 2022 at 11:08:13AM +0800, Pinghao Wu wrote:
> This corrects checking for fgetwc errors by arming dummy errno before
> each invocation, and checking errors only if it returns WEOF.
> ---
> v2: move error checking into the loop.
> 
>  src/stdio/fgetws.c | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c
> index b08b3049..cffff84a 100644
> --- a/src/stdio/fgetws.c
> +++ b/src/stdio/fgetws.c
> @@ -12,18 +12,22 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
>  
>  	FLOCK(f);
>  
> -	/* Setup a dummy errno so we can detect EILSEQ. This is
> -	 * the only way to catch encoding errors in the form of a
> -	 * partial character just before EOF. */
> -	errno = EAGAIN;
> +	int err = 0;
>  	for (; n; n--) {
> +		/* Setup a dummy errno so we can detect EILSEQ. This is
> +		 * the only way to catch encoding errors in the form of a
> +		 * partial character just before EOF. */
> +		errno = EAGAIN;
>  		wint_t c = __fgetwc_unlocked(f);
> -		if (c == WEOF) break;
> +		if (c == WEOF) {
> +			if (ferror(f) || errno == EILSEQ) err = 1;
> +			break;
> +		}
>  		*p++ = c;
>  		if (c == '\n') break;
>  	}
>  	*p = 0;
> -	if (ferror(f) || errno==EILSEQ) p = s;
> +	if (err) p = s;
>  
>  	FUNLOCK(f);
>  
> -- 
> 2.35.1

Thanks, and sorry for taking a while to follow up on this. It turns
out there was information we were missing. The logic that's there in
fgetws, from commit a90d9da1d1b14d81c4f93e1a6d1a686c3312e4ba, predates
changes by commit 511d70738bce11a67219d0132ce725c323d00e4e to fgetwc.
As noted there (and also in Austin Group bug 1022, comment 4383), ISO
C has been amended to require the error indicator to be set for the
stream on encoding errors.

This makes the stuff fgetws is doing to try to disambiguate the result
of fgetwc obsolete. We no longer need to poke at errno, just check
ferror. I think that means we can just revert
a90d9da1d1b14d81c4f93e1a6d1a686c3312e4ba. Does that look right?

Rich

  reply	other threads:[~2022-02-20  0:58 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-10  3:08 Pinghao Wu
2022-02-20  0:57 ` Rich Felker [this message]
2022-02-20  3:54   ` xdavidwu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220220005749.GW7074@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    --cc=xdavidwuph@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).