40 lines
1.4 KiB
Diff
40 lines
1.4 KiB
Diff
|
|
From 3da8c2850d6589b9fa387ab2a2c87355d1224b1e Mon Sep 17 00:00:00 2001
|
||
|
|
From: Sergey Poznyakoff <gray@gnu.org>
|
||
|
|
Date: Mon, 14 Jan 2019 13:59:39 +0200
|
||
|
|
Subject: [PATCH 49/58] Fix iconv usage.
|
||
|
|
|
||
|
|
Patch by Christian Weisgerber.
|
||
|
|
|
||
|
|
* src/utf8.c (utf8_convert): non-zero return from iconv means failure.
|
||
|
|
---
|
||
|
|
src/utf8.c | 13 ++++++++++++-
|
||
|
|
1 file changed, 12 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/src/utf8.c b/src/utf8.c
|
||
|
|
index 95a016d..91476aa 100644
|
||
|
|
--- a/src/utf8.c
|
||
|
|
+++ b/src/utf8.c
|
||
|
|
@@ -81,7 +81,18 @@ utf8_convert (bool to_utf, char const *input, char **output)
|
||
|
|
outlen = inlen * MB_LEN_MAX + 1;
|
||
|
|
ob = ret = xmalloc (outlen);
|
||
|
|
ib = (char ICONV_CONST *) input;
|
||
|
|
- if (iconv (cd, &ib, &inlen, &ob, &outlen) == -1)
|
||
|
|
+ /* According to POSIX, "if iconv() encounters a character in the input
|
||
|
|
+ buffer that is valid, but for which an identical character does not
|
||
|
|
+ exist in the target codeset, iconv() shall perform an
|
||
|
|
+ implementation-defined conversion on this character." It will "update
|
||
|
|
+ the variables pointed to by the arguments to reflect the extent of the
|
||
|
|
+ conversion and return the number of non-identical conversions performed".
|
||
|
|
+ On error, it returns -1.
|
||
|
|
+ In other words, non-zero return always indicates failure, either because
|
||
|
|
+ the input was not fully converted, or because it was converted in a
|
||
|
|
+ non-reversible way.
|
||
|
|
+ */
|
||
|
|
+ if (iconv (cd, &ib, &inlen, &ob, &outlen) != 0)
|
||
|
|
{
|
||
|
|
free (ret);
|
||
|
|
return false;
|
||
|
|
--
|
||
|
|
2.19.1
|
||
|
|
|