musl: backport patch to fix fgetws
See the patch description. The issue has revealed itself when running the test suite of aerc which ships a program for wrapping emails and tests it among others with CJK and Unicode inputs, both of which fail without this.
This commit is contained in:
parent
65e05bc71b
commit
2991ed7a16
|
@ -0,0 +1,61 @@
|
||||||
|
From f8bdc3048216f41eaaf655524fa286cfb1184a70 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rich Felker <dalias@aerifal.cx>
|
||||||
|
Date: Sun, 20 Feb 2022 20:11:14 -0500
|
||||||
|
Subject: [PATCH] fix spurious failures by fgetws when buffer ends with partial
|
||||||
|
character
|
||||||
|
|
||||||
|
commit a90d9da1d1b14d81c4f93e1a6d1a686c3312e4ba made fgetws look for
|
||||||
|
changes to errno by fgetwc to detect encoding errors, since ISO C did
|
||||||
|
not allow the implementation to set the stream's error flag in this
|
||||||
|
case, and the fgetwc interface did not admit any other way to detect
|
||||||
|
the error. however, the possibility of fgetwc setting errno to EILSEQ
|
||||||
|
in the success path was overlooked, and in fact this can happen if the
|
||||||
|
buffer ends with a partial character, causing mbtowc to be called with
|
||||||
|
only part of the character available.
|
||||||
|
|
||||||
|
since that change was made, the C standard was amended to specify that
|
||||||
|
fgetwc set the stream error flag on encoding errors, and commit
|
||||||
|
511d70738bce11a67219d0132ce725c323d00e4e made it do so. thus, there is
|
||||||
|
no longer any need for fgetws to poke at errno to handle encoding
|
||||||
|
errors.
|
||||||
|
|
||||||
|
this commit reverts commit a90d9da1d1b14d81c4f93e1a6d1a686c3312e4ba
|
||||||
|
and thereby fixes the problem.
|
||||||
|
---
|
||||||
|
src/stdio/fgetws.c | 7 +------
|
||||||
|
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c
|
||||||
|
index b08b3049..195cb435 100644
|
||||||
|
--- a/src/stdio/fgetws.c
|
||||||
|
+++ b/src/stdio/fgetws.c
|
||||||
|
@@ -1,6 +1,5 @@
|
||||||
|
#include "stdio_impl.h"
|
||||||
|
#include <wchar.h>
|
||||||
|
-#include <errno.h>
|
||||||
|
|
||||||
|
wint_t __fgetwc_unlocked(FILE *);
|
||||||
|
|
||||||
|
@@ -12,10 +11,6 @@ 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;
|
||||||
|
for (; n; n--) {
|
||||||
|
wint_t c = __fgetwc_unlocked(f);
|
||||||
|
if (c == WEOF) break;
|
||||||
|
@@ -23,7 +18,7 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
|
||||||
|
if (c == '\n') break;
|
||||||
|
}
|
||||||
|
*p = 0;
|
||||||
|
- if (ferror(f) || errno==EILSEQ) p = s;
|
||||||
|
+ if (ferror(f)) p = s;
|
||||||
|
|
||||||
|
FUNLOCK(f);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
pkgname=musl
|
pkgname=musl
|
||||||
reverts="1.2.0_1"
|
reverts="1.2.0_1"
|
||||||
version=1.1.24
|
version=1.1.24
|
||||||
revision=20
|
revision=21
|
||||||
archs="*-musl"
|
archs="*-musl"
|
||||||
bootstrap=yes
|
bootstrap=yes
|
||||||
build_style=gnu-configure
|
build_style=gnu-configure
|
||||||
|
|
Loading…
Reference in New Issue