Terminate the output string if it hasn't been fully converted
authorJoey Schulze <joey@infodrom.org>
Wed, 8 Feb 2006 18:01:11 +0000 (18:01 +0000)
committerJoey Schulze <joey@infodrom.org>
Wed, 8 Feb 2006 18:01:11 +0000 (18:01 +0000)
charset.c

index b2278cb..1585683 100644 (file)
--- a/charset.c
+++ b/charset.c
@@ -44,6 +44,7 @@ char *convert_word(const char *encoding, char *inbuf, char *outbuf, size_t outby
   char *inptr, *outptr;
   size_t inbytesleft;
   size_t nconv;
   char *inptr, *outptr;
   size_t inbytesleft;
   size_t nconv;
+  size_t outsize;
 
   if (!charset || !strcasecmp (encoding, charset)) {
     memmove (outbuf, inbuf, strlen(inbuf)<outbytesleft?strlen(inbuf)+1:strlen(inbuf));
 
   if (!charset || !strcasecmp (encoding, charset)) {
     memmove (outbuf, inbuf, strlen(inbuf)<outbytesleft?strlen(inbuf)+1:strlen(inbuf));
@@ -51,6 +52,8 @@ char *convert_word(const char *encoding, char *inbuf, char *outbuf, size_t outby
     return outbuf;
   }
 
     return outbuf;
   }
 
+  outsize = outbytesleft;
+
   cd = iconv_open (charset, encoding);
 
   inbytesleft = strlen (inbuf)+1;
   cd = iconv_open (charset, encoding);
 
   inbytesleft = strlen (inbuf)+1;
@@ -60,6 +63,9 @@ char *convert_word(const char *encoding, char *inbuf, char *outbuf, size_t outby
   nconv = iconv (cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
   iconv_close(cd);
 
   nconv = iconv (cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
   iconv_close(cd);
 
+  if (nconv == -1 && outsize-outbytesleft >= 0)
+    outbuf[outsize-outbytesleft] = '\0';
+
   return outbuf;
 }
 
   return outbuf;
 }