فهرست منبع

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.
Jens Gustedt 10 سال پیش
والد
کامیت
941644e98c
3فایلهای تغییر یافته به همراه6 افزوده شده و 0 حذف شده
  1. 2 0
      src/multibyte/c16rtomb.c
  2. 2 0
      src/multibyte/mbrtoc16.c
  3. 2 0
      src/multibyte/mbrtoc32.c

+ 2 - 0
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;
 

+ 2 - 0
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);

+ 2 - 0
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);