aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/locale
diff options
context:
space:
mode:
authorPedro F. Giffuni <pfg@FreeBSD.org>2016-03-01 19:15:34 +0000
committerPedro F. Giffuni <pfg@FreeBSD.org>2016-03-01 19:15:34 +0000
commit45256214ebe3f45cbd4046f6f0eea56ca9ba2faf (patch)
tree25a88eba0936ff91becb349dd9558dbca7ac70c5 /lib/libc/locale
parentf3215338ef82c7798bebca17a7d502cc5ef8bc18 (diff)
downloadsrc-45256214ebe3f45cbd4046f6f0eea56ca9ba2faf.tar.gz
src-45256214ebe3f45cbd4046f6f0eea56ca9ba2faf.zip
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
Notes
Notes: svn path=/head/; revision=296278
Diffstat (limited to 'lib/libc/locale')
-rw-r--r--lib/libc/locale/mbtowc.c11
1 files 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 <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)