fix undefined left-shift of negative values in utf-8 state table
[musl] / src / multibyte / wcrtomb.c
index 59f733d..ddc37a5 100644 (file)
@@ -4,8 +4,10 @@
  * unnecessary.
  */
 
+#include <stdlib.h>
 #include <wchar.h>
 #include <errno.h>
+#include "internal.h"
 
 size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st)
 {
@@ -13,6 +15,13 @@ size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st)
        if ((unsigned)wc < 0x80) {
                *s = wc;
                return 1;
+       } else if (MB_CUR_MAX == 1) {
+               if (!IS_CODEUNIT(wc)) {
+                       errno = EILSEQ;
+                       return -1;
+               }
+               *s = wc;
+               return 1;
        } else if ((unsigned)wc < 0x800) {
                *s++ = 0xc0 | (wc>>6);
                *s = 0x80 | (wc&0x3f);