From 45256214ebe3f45cbd4046f6f0eea56ca9ba2faf Mon Sep 17 00:00:00 2001 From: "Pedro F. Giffuni" Date: Tue, 1 Mar 2016 19:15:34 +0000 Subject: [PATCH] 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 --- lib/libc/locale/mbtowc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/libc/locale/mbtowc.c b/lib/libc/locale/mbtowc.c index 70fc19ea3500..376d6cfa5d6d 100644 --- a/lib/libc/locale/mbtowc.c +++ b/lib/libc/locale/mbtowc.c @@ -32,6 +32,7 @@ #include __FBSDID("$FreeBSD$"); +#include #include #include #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)