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?a=commitdiff_plain;h=d019e8a29d7963a926837d46ae3592c5731f02e3;hp=fb1c27ed0cbc16d151d182dd3f2be5eb3189a045;p=pspp 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 */