moriyoshi Fri Jan 3 00:14:34 2003 EDT
Modified files:
/php4/ext/iconv iconv.c
Log:
MFB: fixed shift-out sequence unawareness issue
Index: php4/ext/iconv/iconv.c
diff -u php4/ext/iconv/iconv.c:1.68 php4/ext/iconv/iconv.c:1.69
--- php4/ext/iconv/iconv.c:1.68 Tue Dec 31 14:13:16 2002
+++ php4/ext/iconv/iconv.c Fri Jan 3 00:14:34 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: iconv.c,v 1.68 2002/12/31 19:13:16 moriyoshi Exp $ */
+/* $Id: iconv.c,v 1.69 2003/01/03 05:14:34 moriyoshi Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -240,7 +240,7 @@
size_t decoded_len;
unsigned char *retval;
- unsigned int hexval_tbl[256] = {
+ static unsigned int hexval_tbl[256] = {
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
@@ -402,7 +402,19 @@
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';
*out = out_buffer;
@@ -460,6 +472,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)) {
@@ -471,6 +511,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