]> granicus.if.org Git - libass/commitdiff
Clear iconv conversion state also in libass.
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Thu, 29 May 2008 18:35:21 +0000 (18:35 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Thu, 29 May 2008 18:35:21 +0000 (18:35 +0000)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26923 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass.c

index 4b803db95d54f7060aa99247b3a78488345bbafe..c5323289a71839819f1fe57b118594ee6a9ba4a9 100644 (file)
@@ -846,13 +846,19 @@ static char* sub_recode(char* data, size_t size, char* codepage)
                char* ip;
                char* op;
                size_t rc;
+               int clear = 0;
                
                outbuf = malloc(size);
                ip = data;
                op = outbuf;
                
-               while (ileft) {
-                       rc = iconv(icdsc, &ip, &ileft, &op, &oleft);
+               while (1) {
+                       if (ileft)
+                               rc = iconv(icdsc, &ip, &ileft, &op, &oleft);
+                       else {// clear the conversion state and leave
+                               clear = 1;
+                               rc = iconv(icdsc, NULL, NULL, &op, &oleft);
+                       }
                        if (rc == (size_t)(-1)) {
                                if (errno == E2BIG) {
                                        size_t offset = op - outbuf;
@@ -864,7 +870,9 @@ static char* sub_recode(char* data, size_t size, char* codepage)
                                        mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorRecodingFile);
                                        return NULL;
                                }
-                       }
+                       } else
+                               if (clear)
+                                       break;
                }
                outbuf[osize - oleft - 1] = 0;
        }