diff options
author | Timo Teräs <timo.teras@iki.fi> | 2014-12-04 10:43:32 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2014-12-04 10:44:14 +0200 |
commit | 8f2469e413757e12582b651b24f49b0fb0072a34 (patch) | |
tree | fa5a536a6d34dbce3b62881ec6041d5c48a5ef7a /main/musl/0008-implement-a-private-state-for-the-uchar.h-functions.patch | |
parent | 7086cc9b981d724f4b530ba21a844b602d947d7c (diff) | |
download | aports-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.patch | 72 |
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 + |