moriyoshi Fri Jan 3 00:13:11 2003 EDT
Modified files: (Branch: PHP_4_3)
/php4/ext/iconv iconv.c
Log:
Fixed shift-out sequence unawareness issue
Index: php4/ext/iconv/iconv.c
diff -u php4/ext/iconv/iconv.c:1.65.2.2 php4/ext/iconv/iconv.c:1.65.2.3
--- php4/ext/iconv/iconv.c:1.65.2.2 Tue Dec 31 11:34:43 2002
+++ php4/ext/iconv/iconv.c Fri Jan 3 00:13:11 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: iconv.c,v 1.65.2.2 2002/12/31 16:34:43 sebastian Exp $ */
+/* $Id: iconv.c,v 1.65.2.3 2003/01/03 05:13:11 moriyoshi Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -230,6 +230,18 @@
efree(out_buffer);
return PHP_ICONV_ERR_UNKNOWN;
}
+
+ if (out_left < 8) {
+ out_buffer = (char *) erealloc(out_buffer, out_size + 8);
+ }
+
+ /* flush the shift-out sequences */
+ result = icv(cd, NULL, NULL, &out_p, &out_left);
+
+ if (result == (size_t)(-1)) {
+ efree(out_buffer);
+ return PHP_ICONV_ERR_UNKNOWN;
+ }
*out_len = out_size - out_left;
out_buffer[*out_len] = '\0';
@@ -288,6 +300,34 @@
}
break;
}
+
+ if (result != (size_t)(-1)) {
+ /* flush the shift-out sequences */
+ for (;;) {
+ result = icv(cd, NULL, NULL, (char **) &out_p, &out_left);
+ out_size = bsz - out_left;
+
+ if (result != (size_t)(-1)) {
+ break;
+ }
+
+ if (errno == E2BIG) {
+ bsz += 16;
+ tmp_buf = (char *) erealloc(out_buf, bsz);
+
+ if (tmp_buf == NULL) {
+ break;
+ }
+
+ out_p = out_buf = tmp_buf;
+ out_p += out_size;
+ out_left = bsz - out_size;
+ } else {
+ break;
+ }
+ }
+ }
+
icv_close(cd);
if (result == (size_t)(-1)) {
@@ -299,6 +339,7 @@
case EILSEQ:
retval = PHP_ICONV_ERR_ILLEGAL_SEQ;
break;
+
case E2BIG:
/* should not happen */
retval = PHP_ICONV_ERR_TOO_BIG;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php