libc/vis: Use thread-safe mbrtoc() and wcrtomb().
authorSascha Wildner <saw@online.de>
Fri, 2 Nov 2018 16:26:59 +0000 (17:26 +0100)
committerSascha Wildner <saw@online.de>
Fri, 2 Nov 2018 16:26:59 +0000 (17:26 +0100)
Taken-from: FreeBSD

lib/libc/gen/vis.c

index 0e85d5f..d24ac3e 100644 (file)
@@ -1,4 +1,5 @@
 /*     $NetBSD: vis.c,v 1.74 2017/11/27 16:37:21 christos Exp $        */
+/*     $FreeBSD: head/contrib/libc-vis/vis.c 326307 2017-11-28 01:35:28Z brooks $      */
 
 /*-
  * Copyright (c) 1989, 1993
@@ -350,12 +351,14 @@ makeextralist(int flags, const char *src)
        wchar_t *dst, *d;
        size_t len;
        const wchar_t *s;
+       mbstate_t mbstate;
 
+       bzero(&mbstate, sizeof(mbstate));
        len = strlen(src);
        if ((dst = calloc(len + MAXEXTRAS, sizeof(*dst))) == NULL)
                return NULL;
 
-       if ((flags & VIS_NOLOCALE) || mbstowcs(dst, src, len) == (size_t)-1) {
+       if ((flags & VIS_NOLOCALE) || mbsrtowcs(dst, &src, len, &mbstate) == (size_t)-1) {
                size_t i;
                for (i = 0; i < len; i++)
                        dst[i] = (wchar_t)(u_char)src[i];
@@ -398,6 +401,7 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
        int clen = 0, cerr, error = -1, i, shft;
        char *mbdst, *mdst;
        ssize_t mbslength, maxolen;
+       mbstate_t mbstate;
 
        _DIAGASSERT(mbdstp != NULL);
        _DIAGASSERT(mbsrc != NULL || mblength == 0);
@@ -455,10 +459,11 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
         * stop at NULs because we may be processing a block of data
         * that includes NULs.
         */
+       bzero(&mbstate, sizeof(mbstate));
        while (mbslength > 0) {
                /* Convert one multibyte character to wchar_t. */
                if (!cerr)
-                       clen = mbtowc(src, mbsrc, MB_LEN_MAX);
+                       clen = mbrtowc(src, mbsrc, MB_LEN_MAX, &mbstate);
                if (cerr || clen < 0) {
                        /* Conversion error, process as a byte instead. */
                        *src = (wint_t)(u_char)*mbsrc;
@@ -531,9 +536,10 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
        len = wcslen(start);
        maxolen = dlen ? *dlen : (wcslen(start) * MB_LEN_MAX + 1);
        olen = 0;
+       bzero(&mbstate, sizeof(mbstate));
        for (dst = start; len > 0; len--) {
                if (!cerr)
-                       clen = wctomb(mbdst, *dst);
+                       clen = wcrtomb(mbdst, *dst, &mbstate);
                if (cerr || clen < 0) {
                        /*
                         * Conversion error, process as a byte(s) instead.