diff options
author | tjr <tjr@FreeBSD.org> | 2004-04-12 13:09:18 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2004-04-12 13:09:18 +0000 |
commit | 8f8a2ad1798a75c3b861b2592b934371f81e8fe8 (patch) | |
tree | f1d89115cdb1e299060d4ed9c0869147e5323912 /lib/libc/locale/gb18030.c | |
parent | 006bc4ac4c098febff8ef46213db4475f141fad1 (diff) | |
download | FreeBSD-src-8f8a2ad1798a75c3b861b2592b934371f81e8fe8.zip FreeBSD-src-8f8a2ad1798a75c3b861b2592b934371f81e8fe8.tar.gz |
Perform some basic validation of multibyte conversion state objects.
Diffstat (limited to 'lib/libc/locale/gb18030.c')
-rw-r--r-- | lib/libc/locale/gb18030.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/libc/locale/gb18030.c b/lib/libc/locale/gb18030.c index ee895d5..30d9e47 100644 --- a/lib/libc/locale/gb18030.c +++ b/lib/libc/locale/gb18030.c @@ -85,6 +85,11 @@ _GB18030_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, gs = (_GB18030State *)ps; + if (gs->count < 0 || gs->count > sizeof(gs->bytes)) { + errno = EINVAL; + return ((size_t)-1); + } + if (s == NULL) { s = ""; n = 1; @@ -154,12 +159,19 @@ ilseq: } size_t -_GB18030_wcrtomb(char * __restrict s, wchar_t wc, - mbstate_t * __restrict ps __unused) +_GB18030_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps) { + _GB18030State *gs; size_t len; int c; + gs = (_GB18030State *)ps; + + if (gs->count != 0) { + errno = EINVAL; + return ((size_t)-1); + } + if (s == NULL) /* Reset to initial shift state (no-op) */ return (1); |