From: Bruno Haible <bruno@clisp.org>
Date: Wed, 16 Aug 2023 21:44:57 +0000 (+0200)
Subject: mbrtoc32-regular: Make it work as expected on glibc 2.12.
X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=2e0f142944f18894a609171dc5d903cd18f5e228;p=gnulib.git

mbrtoc32-regular: Make it work as expected on glibc 2.12.

* lib/mbrtoc32.c (mbrtoc32): If necessary, clear the mbstate_t after
mbrtowc() returned.
---

diff --git a/ChangeLog b/ChangeLog
index f8645fcc96..a0ecbd7dee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2023-08-16  Bruno Haible  <bruno@clisp.org>
+
+	mbrtoc32-regular: Make it work as expected on glibc 2.12.
+	* lib/mbrtoc32.c (mbrtoc32): If necessary, clear the mbstate_t after
+	mbrtowc() returned.
+
 2023-08-16  Bruno Haible  <bruno@clisp.org>
 
 	fnmatch: Override fnmatch from glibc versions < 2.22.
diff --git a/lib/mbrtoc32.c b/lib/mbrtoc32.c
index 6a56d93a4b..b8d07ccb00 100644
--- a/lib/mbrtoc32.c
+++ b/lib/mbrtoc32.c
@@ -246,6 +246,14 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
   /* char32_t and wchar_t are equivalent.  Use mbrtowc().  */
   wchar_t wc;
   size_t ret = mbrtowc (&wc, s, n, ps);
+
+#  if GNULIB_MBRTOC32_REGULAR
+  /* Ensure that mbrtoc32 is regular.  */
+  if (ret < (size_t) -2 && ! mbsinit (ps))
+    /* This occurs on glibc 2.12.  */
+    mbszero (ps);
+#  endif
+
 #  if GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION
   if (ret < (size_t) -2 && wc != 0)
     {