From d019e8a29d7963a926837d46ae3592c5731f02e3 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 20 Sep 2010 22:15:38 -0700 Subject: [PATCH] i18n: Properly restart conversion when output buffer overflows. The E2BIG case tries to restart the whole conversion, by reinitializing all variables to their initial states. However the value of 'text' might already have been advanced somewhat if there was a previous loop for e.g. an invalid character. This commit fixes the problem by keeping the original 'text' around and using a moving input pointer instead. --- src/libpspp/i18n.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index 06c67d9479..fa9f29c583 100644 --- a/src/libpspp/i18n.c +++ b/src/libpspp/i18n.c @@ -117,6 +117,7 @@ recode_string_pool (const char *to, const char *from, char *outbuf = 0; size_t outbufferlength; size_t result; + char *ip; char *op ; size_t inbytes = 0; size_t outbytes ; @@ -150,6 +151,8 @@ recode_string_pool (const char *to, const char *from, if ( outbufferlength > length) break; + ip = text; + outbuf = pool_malloc (pool, outbufferlength); op = outbuf; @@ -158,8 +161,7 @@ recode_string_pool (const char *to, const char *from, do { - const char *ip = text; - result = iconv (conv, (ICONV_CONST char **) &text, &inbytes, + result = iconv (conv, (ICONV_CONST char **) &ip, &inbytes, &op, &outbytes); if ( -1 == result ) @@ -187,7 +189,7 @@ recode_string_pool (const char *to, const char *from, op = outbuf; outbytes = outbufferlength; inbytes = length; - text = ip; + ip = text; break; default: /* should never happen */ -- 2.30.2