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