xref: /PHP-7.4/ext/zlib/tests/bug71417.phpt (revision ced5bb7d)
1--TEST--
2Bug #71417: fread() does not detect decoding errors from filter zlib.inflate
3--SKIPIF--
4<?php if (!extension_loaded('zlib')) die ('skip zlib extension not available in this build'); ?>
5--FILE--
6<?php
7
8function test($case) {
9	$plain = "The quick brown fox jumps over the lazy dog.";
10	$fn = "bug71417.gz";
11	$compressed = (string) gzencode($plain);
12
13    if ($case == 1) {
14        // 1. Set a random byte in the middle of the compressed data.
15        // $ php test-zlib-inflate.php
16        // --> read: string(0) ""
17        // --> read: string(44) "The quick brown fox jumps over the lazx8dog."
18        // $ gzip test-zlib-inflate.gz
19        // gzip: test-zlib-inflate.gz: invalid compressed data--crc error
20        $compressed[strlen($compressed) - 15] = 'X';
21    } else if ($case == 2) {
22        // 2. Truncate the compressed data.
23        // $ php test-zlib-inflate.php
24        // --> read: string(32) "The quick brown fox jumps over t"
25        // $ gzip test-zlib-inflate.gz
26        // gzip: test-zlib-inflate.gz: unexpected end of file
27        $compressed = substr($compressed, 0, strlen($compressed) - 20);
28    } else if ($case == 3) {
29        // 3. Corrupted final CRC.
30        // $ php test-zlib-inflate.php
31        // --> read: string(0) ""
32        // --> read: string(44) "The quick brown fox jumps over the lazy dog."
33        // $ gzip test-zlib-inflate.gz
34        // gzip: test-zlib-inflate.gz: invalid compressed data--crc error
35        $compressed[strlen($compressed)-5] = 'X';
36    } else if ($case == 4) {
37        // 4. Corrupted final length.
38        // $ php test-zlib-inflate.phpread: string(0) ""
39        // read: string(44) "The quick brown fox jumps over the lazy dog."
40        // $ gunzip test-zlib-inflate.gz
41        // gzip: test-zlib-inflate.gz: invalid compressed data--length error
42        $compressed[strlen($compressed)-2] = 'X';
43    }
44
45	// The gzdecode() function applied to the corrupted compressed data always
46	// detects the error:
47	// --> gzdecode(): PHP Fatal error:  Uncaught ErrorException: gzdecode(): data error in ...
48	echo "gzdecode(): ", rawurldecode(gzdecode($compressed)), "\n";
49
50	file_put_contents($fn, $compressed);
51
52	$r = fopen($fn, "r");
53	stream_filter_append($r, 'zlib.inflate', STREAM_FILTER_READ, array('window' => 15+16));
54	while (!feof($r)) {
55		$s = fread($r, 100);
56		echo "read: "; var_dump($s);
57	}
58	fclose($r);
59	unlink($fn);
60}
61
62test(1);
63test(2);
64test(3);
65test(4);
66
67?>
68--EXPECTF--
69gzdecode():
70Warning: gzdecode(): data error in %s on line %d
71
72read: bool(false)
73gzdecode():
74Warning: gzdecode(): data error in %s on line %d
75
76read: string(32) "The quick brown fox jumps over t"
77gzdecode():
78Warning: gzdecode(): data error in %s on line %d
79
80read: bool(false)
81gzdecode():
82Warning: gzdecode(): data error in %s on line %d
83
84read: bool(false)
85