diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2009-03-02 23:20:28 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2009-03-02 23:20:28 +0000 |
commit | 49b09e5afa22995997518beca6bdb71408b0f479 (patch) | |
tree | 097fa9a502bacff5dec134ef4e3c592395e20e02 /newlib/libc/stdlib/wctomb_r.c | |
parent | 17a12c5065295a4f6c87cd7cb7bbeac0f5e4b10e (diff) | |
download | cygnal-49b09e5afa22995997518beca6bdb71408b0f479.tar.gz cygnal-49b09e5afa22995997518beca6bdb71408b0f479.tar.bz2 cygnal-49b09e5afa22995997518beca6bdb71408b0f479.zip |
2009-03-02 Corinna Vinschen <corinna@vinschen.de>
* libc/stdlib/wctomb_r.c (_wctomb_r): Return EILSEQ in case of an
invalid wchar. Return -1 if wchar doesn't fit into singlebyte
value in case of using a singlebyte charset.
Diffstat (limited to 'newlib/libc/stdlib/wctomb_r.c')
-rw-r--r-- | newlib/libc/stdlib/wctomb_r.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/newlib/libc/stdlib/wctomb_r.c b/newlib/libc/stdlib/wctomb_r.c index c96d954a1..11418b564 100644 --- a/newlib/libc/stdlib/wctomb_r.c +++ b/newlib/libc/stdlib/wctomb_r.c @@ -1,3 +1,4 @@ +#include <errno.h> #include <stdlib.h> #include <string.h> #include <wchar.h> @@ -31,6 +32,7 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), if (state->__count == -4 && (wchar < 0xdc00 || wchar >= 0xdfff)) { /* At this point only the second half of a surrogate pair is valid. */ + r->_errno = EILSEQ; return -1; } if (wchar <= 0x7f) @@ -51,14 +53,20 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), wint_t tmp; /* UTF-16 surrogates -- must not occur in normal UCS-4 data */ if (sizeof (wchar_t) != 2) - return -1; + { + r->_errno = EILSEQ; + return -1; + } if (wchar >= 0xdc00) { /* Second half of a surrogate pair. It's not valid if we don't have already read a first half of a surrogate before. */ if (state->__count != -4) - return -1; + { + r->_errno = EILSEQ; + return -1; + } /* If it's valid, reconstruct the full Unicode value and return the trailing three bytes of the UTF-8 char. */ tmp = (state->__value.__wchb[0] << 16) @@ -93,7 +101,10 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), return 4; } else - return -1; + { + r->_errno = EILSEQ; + return -1; + } } else if (!strcmp (__lc_ctype, "C-SJIS")) { @@ -113,7 +124,10 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), return 2; } else - return -1; + { + r->_errno = EILSEQ; + return -1; + } } } else if (!strcmp (__lc_ctype, "C-EUCJP")) @@ -134,7 +148,10 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), return 2; } else - return -1; + { + r->_errno = EILSEQ; + return -1; + } } } else if (!strcmp (__lc_ctype, "C-JIS")) @@ -165,7 +182,10 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), return cnt + 2; } else - return -1; + { + r->_errno = EILSEQ; + return -1; + } } else { @@ -187,6 +207,12 @@ _DEFUN (_wctomb_r, (r, s, wchar, state), return 0; /* otherwise we are dealing with a single byte character */ + if (wchar >= 0x100) + { + r->_errno = EILSEQ; + return -1; + } + *s = (char) wchar; return 1; } |