diff options
author | pfg <pfg@FreeBSD.org> | 2016-03-01 19:15:34 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2016-03-01 19:15:34 +0000 |
commit | 0e774f6016f1dfb6a8f55462cc815c3b4da580b2 (patch) | |
tree | 25a88eba0936ff91becb349dd9558dbca7ac70c5 | |
parent | be47bc68fb065fc834ff51fea7df108abeae031c (diff) | |
download | FreeBSD-src-0e774f6016f1dfb6a8f55462cc815c3b4da580b2.zip FreeBSD-src-0e774f6016f1dfb6a8f55462cc815c3b4da580b2.tar.gz |
mbtowc(3): set errno to EILSEQ if an incomplete character is passed.
According to POSIX, The mbtowc() function shall fail if:
[EILSEQ] An invalid character sequence is detected.
Reviewed by: bapt
Differential Revision: https://reviews.freebsd.org/D5496
Obtained from: OpenBSD (Ingo Schwarze)
MFC after: 1 month
-rw-r--r-- | lib/libc/locale/mbtowc.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/libc/locale/mbtowc.c b/lib/libc/locale/mbtowc.c index 70fc19e..376d6cf 100644 --- a/lib/libc/locale/mbtowc.c +++ b/lib/libc/locale/mbtowc.c @@ -32,6 +32,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include <errno.h> #include <stdlib.h> #include <wchar.h> #include "mblocal.h" @@ -49,9 +50,15 @@ mbtowc_l(wchar_t * __restrict pwc, const char * __restrict s, size_t n, locale_t return (0); } rval = XLOCALE_CTYPE(locale)->__mbrtowc(pwc, s, n, &locale->mbtowc); - if (rval == (size_t)-1 || rval == (size_t)-2) + switch (rval) { + case (size_t)-2: + errno = EILSEQ; + /* FALLTHROUGH */ + case (size_t)-1: return (-1); - return ((int)rval); + default: + return ((int)rval); + } } int mbtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n) |