aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2014-12-04 10:43:32 +0200
committerTimo Teräs <timo.teras@iki.fi>2014-12-04 10:44:14 +0200
commit8f2469e413757e12582b651b24f49b0fb0072a34 (patch)
treefa5a536a6d34dbce3b62881ec6041d5c48a5ef7a /main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch
parent7086cc9b981d724f4b530ba21a844b602d947d7c (diff)
downloadaports-8f2469e413757e12582b651b24f49b0fb0072a34.tar.bz2
aports-8f2469e413757e12582b651b24f49b0fb0072a34.tar.xz
main/musl: cherry-pick fixes and compatibility improvements from upstream
Diffstat (limited to 'main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch')
-rw-r--r--main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch b/main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch
new file mode 100644
index 0000000000..5dfdae2044
--- /dev/null
+++ b/main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch
@@ -0,0 +1,72 @@
+From 941644e98c3d05761b4639a8ae5afacd8586d1b9 Mon Sep 17 00:00:00 2001
+From: Jens Gustedt <Jens.Gustedt@inria.fr>
+Date: Sun, 9 Nov 2014 11:18:08 +0100
+Subject: [PATCH] implement a private state for the uchar.h functions
+
+The C standard is imperative on that:
+
+ 7.28.1 ... If ps is a null pointer, each function uses its own internal
+ mbstate_t object instead, which is initialized at program startup to
+ the initial conversion state;
+
+and these functions are also not supposed to implicitly use the state of
+the wchar.h functions:
+
+ 7.29.6.3 ... The implementation behaves as if no library function calls
+ these functions with a null pointer for ps.
+
+Previously this resulted in two bugs.
+
+ - The functions c16rtomb and mbrtoc16 would crash when called with ps
+ set to null.
+
+ - The function mbrtoc32 used the private state of mbrtowc, which it
+ is not allowed to do.
+---
+ src/multibyte/c16rtomb.c | 2 ++
+ src/multibyte/mbrtoc16.c | 2 ++
+ src/multibyte/mbrtoc32.c | 2 ++
+ 3 files changed, 6 insertions(+)
+
+diff --git a/src/multibyte/c16rtomb.c b/src/multibyte/c16rtomb.c
+index 2e8ec97..39ca375 100644
+--- a/src/multibyte/c16rtomb.c
++++ b/src/multibyte/c16rtomb.c
+@@ -4,6 +4,8 @@
+
+ size_t c16rtomb(char *restrict s, char16_t c16, mbstate_t *restrict ps)
+ {
++ static unsigned internal_state;
++ if (!ps) ps = (void *)&internal_state;
+ unsigned *x = (unsigned *)ps;
+ wchar_t wc;
+
+diff --git a/src/multibyte/mbrtoc16.c b/src/multibyte/mbrtoc16.c
+index 74b7d77..765ff90 100644
+--- a/src/multibyte/mbrtoc16.c
++++ b/src/multibyte/mbrtoc16.c
+@@ -3,6 +3,8 @@
+
+ size_t mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n, mbstate_t *restrict ps)
+ {
++ static unsigned internal_state;
++ if (!ps) ps = (void *)&internal_state;
+ unsigned *pending = (unsigned *)ps;
+
+ if (!s) return mbrtoc16(0, "", 1, ps);
+diff --git a/src/multibyte/mbrtoc32.c b/src/multibyte/mbrtoc32.c
+index c6d2082..9b6b236 100644
+--- a/src/multibyte/mbrtoc32.c
++++ b/src/multibyte/mbrtoc32.c
+@@ -3,6 +3,8 @@
+
+ size_t mbrtoc32(char32_t *restrict pc32, const char *restrict s, size_t n, mbstate_t *restrict ps)
+ {
++ static unsigned internal_state;
++ if (!ps) ps = (void *)&internal_state;
+ if (!s) return mbrtoc32(0, "", 1, ps);
+ wchar_t wc;
+ size_t ret = mbrtowc(&wc, s, n, ps);
+--
+2.2.0
+