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: sav-api~28 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=d019e8a29d7963a926837d46ae3592c5731f02e3 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 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 */