Annotation of embedaddon/php/ext/xml/tests/bug32001b.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: Bug #32001 (xml_parse*() goes into infinite loop when autodetection in effect), using EUC-JP, Shift_JIS, GB2312
! 3: --SKIPIF--
! 4: <?php
! 5: require_once("skipif.inc");
! 6: if (!extension_loaded('iconv')) die ("skip iconv extension not available");
! 7: foreach(array('EUC-JP', 'Shift_JISP', 'GB2312') as $encoding) {
! 8: if (@xml_parser_create($encoding) === false) die("skip libxml2 does not support $encoding encoding");
! 9: }
! 10: ?>
! 11: --FILE--
! 12: <?php
! 13: class testcase {
! 14: private $encoding;
! 15: private $bom;
! 16: private $prologue;
! 17: private $tags;
! 18: private $chunk_size;
! 19:
! 20: function testcase($enc, $chunk_size = 0, $bom = 0, $omit_prologue = 0) {
! 21: $this->encoding = $enc;
! 22: $this->chunk_size = $chunk_size;
! 23: $this->bom = $bom;
! 24: $this->prologue = !$omit_prologue;
! 25: $this->tags = array();
! 26: }
! 27:
! 28: function start_element($parser, $name, $attrs) {
! 29: $attrs = array_map('bin2hex', $attrs);
! 30: $this->tags[] = bin2hex($name).": ".implode(', ', $attrs);
! 31: }
! 32:
! 33: function end_element($parser, $name) {
! 34: }
! 35:
! 36: function run() {
! 37: $data = '';
! 38:
! 39: if ($this->prologue) {
! 40: $canonical_name = preg_replace('/BE|LE/i', '', $this->encoding);
! 41: $data .= "<?xml version=\"1.0\" encoding=\"$canonical_name\" ?>\n";
! 42: }
! 43:
! 44: $data .= <<<HERE
! 45: <テスト:テスト1 xmlns:テスト="http://www.example.com/テスト/" テスト="テスト">
! 46: <テスト:テスト2 テスト="テスト">
! 47: <テスト:テスト3>
! 48: test!
! 49: </テスト:テスト3>
! 50: </テスト:テスト2>
! 51: </テスト:テスト1>
! 52: HERE;
! 53:
! 54: $data = iconv("UTF-8", $this->encoding, $data);
! 55:
! 56: $parser = xml_parser_create(NULL);
! 57: xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
! 58: xml_set_element_handler($parser, "start_element", "end_element");
! 59: xml_set_object($parser, $this);
! 60:
! 61: if ($this->chunk_size == 0) {
! 62: $success = @xml_parse($parser, $data, true);
! 63: } else {
! 64: for ($offset = 0; $offset < strlen($data);
! 65: $offset += $this->chunk_size) {
! 66: $success = @xml_parse($parser, substr($data, $offset, $this->chunk_size), false);
! 67: if (!$success) {
! 68: break;
! 69: }
! 70: }
! 71: if ($success) {
! 72: $success = @xml_parse($parser, "", true);
! 73: }
! 74: }
! 75:
! 76: echo "Encoding: $this->encoding\n";
! 77: echo "XML Prologue: ".($this->prologue ? 'present': 'not present'), "\n";
! 78: echo "Chunk size: ".($this->chunk_size ? "$this->chunk_size byte(s)\n": "all data at once\n");
! 79: echo "BOM: ".($this->bom ? 'prepended': 'not prepended'), "\n";
! 80:
! 81: if ($success) {
! 82: var_dump($this->tags);
! 83: } else {
! 84: echo "[Error] ", xml_error_string(xml_get_error_code($parser)), "\n";
! 85: }
! 86: }
! 87: }
! 88: $suite = array(
! 89: new testcase("EUC-JP" , 0),
! 90: new testcase("EUC-JP" , 1),
! 91: new testcase("Shift_JIS", 0),
! 92: new testcase("Shift_JIS", 1),
! 93: new testcase("GB2312", 0),
! 94: new testcase("GB2312", 1),
! 95: );
! 96:
! 97: if (XML_SAX_IMPL == 'libxml') {
! 98: echo "libxml2 Version => " . LIBXML_DOTTED_VERSION. "\n";
! 99: } else {
! 100: echo "libxml2 Version => NONE\n";
! 101: }
! 102:
! 103: foreach ($suite as $testcase) {
! 104: $testcase->run();
! 105: }
! 106:
! 107: // vim600: sts=4 sw=4 ts=4 encoding=UTF-8
! 108: ?>
! 109: --EXPECTF--
! 110: libxml2 Version => %s
! 111: Encoding: EUC-JP
! 112: XML Prologue: present
! 113: Chunk size: all data at once
! 114: BOM: not prepended
! 115: array(3) {
! 116: [0]=>
! 117: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
! 118: [1]=>
! 119: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
! 120: [2]=>
! 121: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
! 122: }
! 123: Encoding: EUC-JP
! 124: XML Prologue: present
! 125: Chunk size: 1 byte(s)
! 126: BOM: not prepended
! 127: array(3) {
! 128: [0]=>
! 129: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
! 130: [1]=>
! 131: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
! 132: [2]=>
! 133: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
! 134: }
! 135: Encoding: Shift_JIS
! 136: XML Prologue: present
! 137: Chunk size: all data at once
! 138: BOM: not prepended
! 139: array(3) {
! 140: [0]=>
! 141: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
! 142: [1]=>
! 143: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
! 144: [2]=>
! 145: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
! 146: }
! 147: Encoding: Shift_JIS
! 148: XML Prologue: present
! 149: Chunk size: 1 byte(s)
! 150: BOM: not prepended
! 151: array(3) {
! 152: [0]=>
! 153: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
! 154: [1]=>
! 155: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
! 156: [2]=>
! 157: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
! 158: }
! 159: Encoding: GB2312
! 160: XML Prologue: present
! 161: Chunk size: all data at once
! 162: BOM: not prepended
! 163: array(3) {
! 164: [0]=>
! 165: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
! 166: [1]=>
! 167: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
! 168: [2]=>
! 169: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
! 170: }
! 171: Encoding: GB2312
! 172: XML Prologue: present
! 173: Chunk size: 1 byte(s)
! 174: BOM: not prepended
! 175: array(3) {
! 176: [0]=>
! 177: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
! 178: [1]=>
! 179: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
! 180: [2]=>
! 181: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
! 182: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>