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