From: Ben Pfaff Date: Tue, 21 Sep 2010 05:15:38 +0000 (-0700) Subject: i18n: Properly restart conversion when output buffer overflows. X-Git-Tag: v0.7.6~208 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d019e8a29d7963a926837d46ae3592c5731f02e3;p=pspp-builds.git 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. --- diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index 06c67d94..fa9f29c5 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 */