From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/6473 Path: news.gmane.org!not-for-mail From: Jens Gustedt Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH] implement a private state for the uchar.h functions Date: Sun, 09 Nov 2014 11:18:08 +0100 Message-ID: <1415528228.2457.1188.camel@eris.loria.fr> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1415528309 30362 80.91.229.3 (9 Nov 2014 10:18:29 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 9 Nov 2014 10:18:29 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-6486-gllmg-musl=m.gmane.org@lists.openwall.com Sun Nov 09 11:18:23 2014 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1XnPZe-0002yG-RU for gllmg-musl@m.gmane.org; Sun, 09 Nov 2014 11:18:22 +0100 Original-Received: (qmail 1982 invoked by uid 550); 9 Nov 2014 10:18:20 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 1973 invoked from network); 9 Nov 2014 10:18:20 -0000 X-IronPort-AV: E=Sophos;i="5.07,345,1413237600"; d="scan'208";a="105811148" Resent-From: Jens Gustedt Resent-To: musl@lists.openwall.com X-Mailer: Evolution 3.4.4-3 Xref: news.gmane.org gmane.linux.lib.musl.general:6473 Archived-At: 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 functions c32rtomb and mbrtoc32 used the private states of wcrtomb and mbrtowc, respectively, which they are not allowed to do. --- src/multibyte/c16rtomb.c | 2 ++ src/multibyte/c32rtomb.c | 2 ++ src/multibyte/mbrtoc16.c | 2 ++ src/multibyte/mbrtoc32.c | 2 ++ 4 files changed, 8 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/c32rtomb.c b/src/multibyte/c32rtomb.c index 6785132..a5d49ff 100644 --- a/src/multibyte/c32rtomb.c +++ b/src/multibyte/c32rtomb.c @@ -3,5 +3,7 @@ size_t c32rtomb(char *restrict s, char32_t c32, mbstate_t *restrict ps) { + static unsigned internal_state; + if (!ps) ps = (void *)&internal_state; return wcrtomb(s, c32, ps); } 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); -- 1.9.1