Annotation of embedaddon/php/ext/xml/tests/bug32001.phpt, revision 1.1.1.1
1.1 misho 1: --TEST--
2: Bug #32001 (xml_parse*() goes into infinite loop when autodetection in effect), using UTF-*
3: --SKIPIF--
4: <?php
5: require_once("skipif.inc");
6: if (!extension_loaded('iconv')) die ("skip iconv extension not available");
7: ?>
8: --FILE--
9: <?php
10: class testcase {
11: private $encoding;
12: private $bom;
13: private $prologue;
14: private $tags;
15: private $chunk_size;
16:
17: function testcase($enc, $chunk_size = 0, $bom = 0, $omit_prologue = 0) {
18: $this->encoding = $enc;
19: $this->chunk_size = $chunk_size;
20: $this->bom = $bom;
21: $this->prologue = !$omit_prologue;
22: $this->tags = array();
23: }
24:
25: function start_element($parser, $name, $attrs) {
26: $attrs = array_map('bin2hex', $attrs);
27: $this->tags[] = bin2hex($name).": ".implode(', ', $attrs);
28: }
29:
30: function end_element($parser, $name) {
31: }
32:
33: function run() {
34: $data = '';
35:
36: if ($this->prologue) {
37: $canonical_name = preg_replace('/BE|LE/i', '', $this->encoding);
38: $data .= "<?xml version=\"1.0\" encoding=\"$canonical_name\" ?>\n";
39: }
40:
41: $data .= <<<HERE
42: <テスト:テスト1 xmlns:テスト="http://www.example.com/テスト/" テスト="テスト">
43: <テスト:テスト2 テスト="テスト">
44: <テスト:テスト3>
45: test!
46: </テスト:テスト3>
47: </テスト:テスト2>
48: </テスト:テスト1>
49: HERE;
50:
51: $data = iconv("UTF-8", $this->encoding, $data);
52:
53: if ($this->bom) {
54: switch (strtoupper($this->encoding)) {
55: case 'UTF-8':
56: case 'UTF8':
57: $data = "\xef\xbb\xbf".$data;
58: break;
59:
60: case 'UTF-16':
61: case 'UTF16':
62: case 'UTF-16BE':
63: case 'UTF16BE':
64: case 'UCS-2':
65: case 'UCS2':
66: case 'UCS-2BE':
67: case 'UCS2BE':
68: $data = "\xfe\xff".$data;
69: break;
70:
71: case 'UTF-16LE':
72: case 'UTF16LE':
73: case 'UCS-2LE':
74: case 'UCS2LE':
75: $data = "\xff\xfe".$data;
76: break;
77:
78: case 'UTF-32':
79: case 'UTF32':
80: case 'UTF-32BE':
81: case 'UTF32BE':
82: case 'UCS-4':
83: case 'UCS4':
84: case 'UCS-4BE':
85: case 'UCS4BE':
86: $data = "\x00\x00\xfe\xff".$data;
87: break;
88:
89: case 'UTF-32LE':
90: case 'UTF32LE':
91: case 'UCS-4LE':
92: case 'UCS4LE':
93: $data = "\xff\xfe\x00\x00".$data;
94: break;
95: }
96: }
97:
98: $parser = xml_parser_create(NULL);
99: xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
100: xml_set_element_handler($parser, "start_element", "end_element");
101: xml_set_object($parser, $this);
102:
103: if ($this->chunk_size == 0) {
104: $success = @xml_parse($parser, $data, true);
105: } else {
106: for ($offset = 0; $offset < strlen($data);
107: $offset += $this->chunk_size) {
108: $success = @xml_parse($parser, substr($data, $offset, $this->chunk_size), false);
109: if (!$success) {
110: break;
111: }
112: }
113: if ($success) {
114: $success = @xml_parse($parser, "", true);
115: }
116: }
117:
118: echo "Encoding: $this->encoding\n";
119: echo "XML Prologue: ".($this->prologue ? 'present': 'not present'), "\n";
120: echo "Chunk size: ".($this->chunk_size ? "$this->chunk_size byte(s)\n": "all data at once\n");
121: echo "BOM: ".($this->bom ? 'prepended': 'not prepended'), "\n";
122:
123: if ($success) {
124: var_dump($this->tags);
125: } else {
126: echo "[Error] ", xml_error_string(xml_get_error_code($parser)), "\n";
127: }
128: }
129: }
130: $suite = array(
131: new testcase("UTF-8", 0, 0, 0),
132: new testcase("UTF-8", 0, 0, 1),
133: new testcase("UTF-8", 0, 1, 0),
134: new testcase("UTF-8", 0, 1, 1),
135: new testcase("UTF-16BE", 0, 0, 0),
136: new testcase("UTF-16BE", 0, 1, 0),
137: new testcase("UTF-16BE", 0, 1, 1),
138: new testcase("UTF-16LE", 0, 0, 0),
139: new testcase("UTF-16LE", 0, 1, 0),
140: new testcase("UTF-16LE", 0, 1, 1),
141: new testcase("UTF-8", 1, 0, 0),
142: new testcase("UTF-8", 1, 0, 1),
143: new testcase("UTF-8", 1, 1, 0),
144: new testcase("UTF-8", 1, 1, 1),
145: new testcase("UTF-16BE", 1, 0, 0),
146: new testcase("UTF-16BE", 1, 1, 0),
147: new testcase("UTF-16BE", 1, 1, 1),
148: new testcase("UTF-16LE", 1, 0, 0),
149: new testcase("UTF-16LE", 1, 1, 0),
150: new testcase("UTF-16LE", 1, 1, 1),
151: );
152:
153: if (XML_SAX_IMPL == 'libxml') {
154: echo "libxml2 Version => " . LIBXML_DOTTED_VERSION. "\n";
155: } else {
156: echo "libxml2 Version => NONE\n";
157: }
158:
159: foreach ($suite as $testcase) {
160: $testcase->run();
161: }
162:
163: // vim600: sts=4 sw=4 ts=4 encoding=UTF-8
164: ?>
165: --EXPECTF--
166: libxml2 Version => %s
167: Encoding: UTF-8
168: XML Prologue: present
169: Chunk size: all data at once
170: BOM: not prepended
171: array(3) {
172: [0]=>
173: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
174: [1]=>
175: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
176: [2]=>
177: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
178: }
179: Encoding: UTF-8
180: XML Prologue: not present
181: Chunk size: all data at once
182: BOM: not prepended
183: array(3) {
184: [0]=>
185: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
186: [1]=>
187: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
188: [2]=>
189: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
190: }
191: Encoding: UTF-8
192: XML Prologue: present
193: Chunk size: all data at once
194: BOM: prepended
195: array(3) {
196: [0]=>
197: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
198: [1]=>
199: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
200: [2]=>
201: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
202: }
203: Encoding: UTF-8
204: XML Prologue: not present
205: Chunk size: all data at once
206: BOM: prepended
207: array(3) {
208: [0]=>
209: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
210: [1]=>
211: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
212: [2]=>
213: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
214: }
215: Encoding: UTF-16BE
216: XML Prologue: present
217: Chunk size: all data at once
218: BOM: not prepended
219: array(3) {
220: [0]=>
221: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
222: [1]=>
223: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
224: [2]=>
225: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
226: }
227: Encoding: UTF-16BE
228: XML Prologue: present
229: Chunk size: all data at once
230: BOM: prepended
231: array(3) {
232: [0]=>
233: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
234: [1]=>
235: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
236: [2]=>
237: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
238: }
239: Encoding: UTF-16BE
240: XML Prologue: not present
241: Chunk size: all data at once
242: BOM: prepended
243: array(3) {
244: [0]=>
245: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
246: [1]=>
247: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
248: [2]=>
249: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
250: }
251: Encoding: UTF-16LE
252: XML Prologue: present
253: Chunk size: all data at once
254: BOM: not prepended
255: array(3) {
256: [0]=>
257: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
258: [1]=>
259: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
260: [2]=>
261: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
262: }
263: Encoding: UTF-16LE
264: XML Prologue: present
265: Chunk size: all data at once
266: BOM: prepended
267: array(3) {
268: [0]=>
269: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
270: [1]=>
271: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
272: [2]=>
273: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
274: }
275: Encoding: UTF-16LE
276: XML Prologue: not present
277: Chunk size: all data at once
278: BOM: prepended
279: array(3) {
280: [0]=>
281: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
282: [1]=>
283: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
284: [2]=>
285: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
286: }
287: Encoding: UTF-8
288: XML Prologue: present
289: Chunk size: 1 byte(s)
290: BOM: not prepended
291: array(3) {
292: [0]=>
293: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
294: [1]=>
295: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
296: [2]=>
297: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
298: }
299: Encoding: UTF-8
300: XML Prologue: not present
301: Chunk size: 1 byte(s)
302: BOM: not prepended
303: array(3) {
304: [0]=>
305: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
306: [1]=>
307: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
308: [2]=>
309: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
310: }
311: Encoding: UTF-8
312: XML Prologue: present
313: Chunk size: 1 byte(s)
314: BOM: prepended
315: array(3) {
316: [0]=>
317: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
318: [1]=>
319: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
320: [2]=>
321: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
322: }
323: Encoding: UTF-8
324: XML Prologue: not present
325: Chunk size: 1 byte(s)
326: BOM: prepended
327: array(3) {
328: [0]=>
329: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
330: [1]=>
331: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
332: [2]=>
333: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
334: }
335: Encoding: UTF-16BE
336: XML Prologue: present
337: Chunk size: 1 byte(s)
338: BOM: not prepended
339: array(3) {
340: [0]=>
341: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
342: [1]=>
343: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
344: [2]=>
345: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
346: }
347: Encoding: UTF-16BE
348: XML Prologue: present
349: Chunk size: 1 byte(s)
350: BOM: prepended
351: array(3) {
352: [0]=>
353: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
354: [1]=>
355: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
356: [2]=>
357: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
358: }
359: Encoding: UTF-16BE
360: XML Prologue: not present
361: Chunk size: 1 byte(s)
362: BOM: prepended
363: array(3) {
364: [0]=>
365: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
366: [1]=>
367: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
368: [2]=>
369: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
370: }
371: Encoding: UTF-16LE
372: XML Prologue: present
373: Chunk size: 1 byte(s)
374: BOM: not prepended
375: array(3) {
376: [0]=>
377: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
378: [1]=>
379: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
380: [2]=>
381: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
382: }
383: Encoding: UTF-16LE
384: XML Prologue: present
385: Chunk size: 1 byte(s)
386: BOM: prepended
387: array(3) {
388: [0]=>
389: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
390: [1]=>
391: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
392: [2]=>
393: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
394: }
395: Encoding: UTF-16LE
396: XML Prologue: not present
397: Chunk size: 1 byte(s)
398: BOM: prepended
399: array(3) {
400: [0]=>
401: string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
402: [1]=>
403: string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
404: [2]=>
405: string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
406: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>