i18n: Properly restart conversion when output buffer overflows.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 21 Sep 2010 05:15:38 +0000 (22:15 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 22 Sep 2010 05:11:14 +0000 (22:11 -0700)
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

index 06c67d947928122ec8e75f665a4e6f9b62d9df45..fa9f29c5835e561354f92877581f0a7ab6f10705 100644 (file)
@@ -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 */