xref: /PHP-7.4/ext/curl/tests/bug76675.phpt (revision 32ae7160)
1--TEST--
2Bug #76675 (Segfault with H2 server push write/writeheader handlers)
3--SKIPIF--
4<?php
5include 'skipif.inc';
6if (getenv("SKIP_ONLINE_TESTS")) {
7	die("skip online test");
8}
9$curl_version = curl_version();
10if ($curl_version['version_number'] < 0x073d00) {
11	exit("skip: test may crash with curl < 7.61.0");
12}
13?>
14--FILE--
15<?php
16$transfers = 1;
17$callback = function($parent, $passed) use (&$transfers) {
18    curl_setopt($passed, CURLOPT_WRITEFUNCTION, function ($ch, $data) {
19        echo "Received ".strlen($data);
20        return strlen($data);
21    });
22	$transfers++;
23	return CURL_PUSH_OK;
24};
25$mh = curl_multi_init();
26curl_multi_setopt($mh, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
27curl_multi_setopt($mh, CURLMOPT_PUSHFUNCTION, $callback);
28$ch = curl_init();
29curl_setopt($ch, CURLOPT_URL, 'https://http2.golang.org/serverpush');
30curl_setopt($ch, CURLOPT_HTTP_VERSION, 3);
31curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
32curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
33curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
34curl_multi_add_handle($mh, $ch);
35$active = null;
36do {
37    $status = curl_multi_exec($mh, $active);
38    do {
39        $info = curl_multi_info_read($mh);
40        if (false !== $info && $info['msg'] == CURLMSG_DONE) {
41            $handle = $info['handle'];
42            if ($handle !== null) {
43                $transfers--;
44                curl_multi_remove_handle($mh, $handle);
45                curl_close($handle);
46            }
47        }
48    } while ($info);
49} while ($transfers);
50curl_multi_close($mh);
51?>
52--EXPECTREGEX--
53(Received \d+)+
54