POSIX doesn't specify behavior for wcsrtombs and mbsrtowcs when the source parameter is NULL. http://pubs.opengroup.org/onlinepubs/009695399/functions/mbsrtowcs.html http://pubs.opengroup.org/onlinepubs/009695399/functions/wcsrtombs.html
However segfaulting in such cases, as happens with this example, IMHO, is not desirable. ------- nullsrc.c #include <locale.h> #include <stdio.h> #include <string.h> #include <wchar.h> int main() { char *msrc = NULL; char mdst[100]; wchar_t *wsrc = NULL; wchar_t wdst[100]; size_t s; mbstate_t mbst; bzero(&mbst, sizeof(mbst)); mbsinit(&mbst); s = wcsrtombs(mdst, (const wchar_t **)&wsrc, 5, &mbst); printf("fixed wcsrtombs without encoding\n"); s = mbsrtowcs(wdst, (const char **)&msrc, 5, &mbst); printf("fixed mbsrtowcs without encoding\n"); setlocale(LC_ALL, "POSIX.UTF-8"); s = wcsrtombs(mdst, (const wchar_t **)&wsrc, 5, &mbst); printf("fixed wcsrtombs with UTF-8\n"); s = mbsrtowcs(wdst, (const char **)&msrc, 5, &mbst); printf("fixed mbsrtowcs with UTF-8\n"); return 0; } --- cc -g -o nullsrc nullsrc.c gdb nullsrc ... (gdb) run Starting program: /home/vtamara/tmp/nullsrc Program received signal SIGSEGV, Segmentation fault. _citrus_none_ctype_wcsnrtombs (dst=0x7f7ffffbee90 "", src=0x7f7ffffbee80, nwc=18446744073709551615, len=5, pspriv=0x7f7ffffbee00) at /usr/src/lib/libc/citrus/citrus_none.c:155 155 wchar_t wc = (*src)[i]; --- The attached patch solves this by setting errno in EINVAL and returning (size_t)-1 when the source parameter is NULL or points to NULL, also includes this information in the man page. -- Dios, gracias por tu amor infinito. -- Vladimir Támara Patiño. http://vtamara.pasosdeJesus.org/ http://www.pasosdejesus.org/dominio_publico_colombia.html
diff -u src56-orig/lib/libc/citrus/citrus_none.c src/lib/libc/citrus/citrus_none.c --- src56-orig/lib/libc/citrus/citrus_none.c Thu Mar 7 13:12:31 2013 +++ src/lib/libc/citrus/citrus_none.c Wed Oct 1 12:45:17 2014 @@ -93,6 +93,10 @@ /* dst may be NULL */ /* pspriv appears to be unused */ + if (src == NULL || *src == NULL) { + errno = EINVAL; + return ((size_t)-1); + } if (dst == NULL) return strnlen(*src, nmc); @@ -138,6 +142,10 @@ /* dst may be NULL */ /* pspriv appears to be unused */ + if (src == NULL || *src == NULL) { + errno = EINVAL; + return ((size_t)-1); + } if (dst == NULL) { for (i = 0; i < nwc; i++) { wchar_t wc = (*src)[i]; diff -u src56-orig/lib/libc/citrus/citrus_utf8.c src/lib/libc/citrus/citrus_utf8.c --- src56-orig/lib/libc/citrus/citrus_utf8.c Fri Sep 19 13:07:15 2014 +++ src/lib/libc/citrus/citrus_utf8.c Wed Oct 1 12:44:01 2014 @@ -194,6 +194,10 @@ us = (struct _utf8_state *)pspriv; + if (src == NULL || *src == NULL) { + errno = EINVAL; + return ((size_t)-1); + } if (dst == NULL) { /* * The fast path in the loop below is not safe if an ASCII @@ -346,6 +350,10 @@ return ((size_t)-1); } + if (src == NULL || *src == NULL) { + errno = EINVAL; + return ((size_t)-1); + } if (dst == NULL) { for (i = o = 0; i < nwc; i++, o += r) { wchar_t wc = (*src)[i]; diff -u src56-orig/lib/libc/locale/mbsrtowcs.3 src/lib/libc/locale/mbsrtowcs.3 --- src56-orig/lib/libc/locale/mbsrtowcs.3 Tue Jun 4 22:39:22 2013 +++ src/lib/libc/locale/mbsrtowcs.3 Wed Oct 1 13:34:47 2014 @@ -151,8 +151,8 @@ is a null pointer, the value returned is the number of elements to contain the whole string converted, except for a terminating null wide character. .It (size_t)-1 -The array indirectly pointed to by .Fa src +is NULL or points to NULL or to an array that contains a byte sequence forming invalid character. In this case, .Va errno @@ -167,9 +167,8 @@ functions may return the following errors: .Bl -tag -width Er .It Bq Er EILSEQ -The pointer pointed to by .Fa src -points to an invalid or incomplete multibyte character. +is NULL or points to NULL or to an invalid or incomplete multibyte character. .It Bq Er EINVAL .Fa ps points to an invalid or uninitialized mbstate_t object. diff -u src56-orig/lib/libc/locale/wcsrtombs.3 src/lib/libc/locale/wcsrtombs.3 --- src56-orig/lib/libc/locale/wcsrtombs.3 Tue Jun 4 22:39:22 2013 +++ src/lib/libc/locale/wcsrtombs.3 Wed Oct 1 13:37:31 2014 @@ -153,7 +153,7 @@ will not be null-terminated. .It (size_t)-1 .Fa src -points to the string containing invalid wide character. +is NULL or points to NULL or to a string containing invalid wide character. In this case, .Va errno is set to indicate the error. @@ -168,7 +168,7 @@ .Bl -tag -width Er .It Bq Er EILSEQ .Fa src -points to the string containing an invalid wide character. +is NULL or points to NULL or to a string containing an invalid wide character. .It Bq Er EINVAL .Fa ps points to an invalid or uninitialized mbstate_t object.