summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2011-04-11 21:34:21 +1000
committerAndrew Tridgell <tridge@samba.org>2011-04-13 14:47:08 +1000
commit93463829afaa4768183b62f20146ef903da8cf8b (patch)
tree1e5445fc89213c480fd3ab2fe35862561782faaa /lib
parent1efa6001441413c29e4b85c1222a84aff7e00ae8 (diff)
downloadsamba-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>
Diffstat (limited to 'lib')
-rw-r--r--lib/util/charset/iconv.c11
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);