diff options
author | Andrew Bartlett <abartlet@samba.org> | 2011-04-11 21:34:21 +1000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2011-04-13 14:47:08 +1000 |
commit | 93463829afaa4768183b62f20146ef903da8cf8b (patch) | |
tree | 1e5445fc89213c480fd3ab2fe35862561782faaa | |
parent | 1efa6001441413c29e4b85c1222a84aff7e00ae8 (diff) | |
download | samba-93463829afaa4768183b62f20146ef903da8cf8b.tar.gz samba-93463829afaa4768183b62f20146ef903da8cf8b.tar.bz2 samba-93463829afaa4768183b62f20146ef903da8cf8b.zip |
lib/util/charset Preserve 'pull' errors even when converting via UTF16
When we do not have a direct iconv handle between any two charsets, we
must go iva UTF16. However, we should still return the same buffer
and error code as if we were able to go direct - including the partial
conversion and the error code.
This is important for locating the invalid multibyte character in the
stream, for example.
Andrew Bartlett
Signed-off-by: Andrew Tridgell <tridge@samba.org>
-rw-r--r-- | lib/util/charset/iconv.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/util/charset/iconv.c b/lib/util/charset/iconv.c index 045fd1329b..16ce92ea82 100644 --- a/lib/util/charset/iconv.c +++ b/lib/util/charset/iconv.c @@ -193,14 +193,15 @@ _PUBLIC_ size_t smb_iconv(smb_iconv_t cd, while (*inbytesleft > 0) { char *bufp1 = cvtbuf; const char *bufp2 = cvtbuf; - + int saved_errno = errno; + bool pull_failed = false; bufsize = SMB_ICONV_BUFSIZE; if (cd->pull(cd->cd_pull, inbuf, inbytesleft, &bufp1, &bufsize) == -1 && errno != E2BIG) { - talloc_free(cvtbuf); - return -1; + saved_errno = errno; + pull_failed = true; } bufsize = SMB_ICONV_BUFSIZE - bufsize; @@ -210,6 +211,10 @@ _PUBLIC_ size_t smb_iconv(smb_iconv_t cd, outbuf, outbytesleft) == -1) { talloc_free(cvtbuf); return -1; + } else if (pull_failed) { + /* We want the pull errno if possible */ + errno = saved_errno; + return -1; } } talloc_free(cvtbuf); |