@@ -4,103 +4,109 @@ Bug #74159: Writing a large buffer to non-blocking encrypted streams fails
4
4
<?php
5
5
if (!extension_loaded ("openssl " )) die ("skip openssl not loaded " );
6
6
if (!function_exists ("proc_open " )) die ("skip no proc_open " );
7
+ if (OPENSSL_VERSION_NUMBER < 0x10001001 ) die ("skip OpenSSLv1.0.1 required " );
8
+ ?>
7
9
--FILE--
8
10
<?php
11
+ // the server code is doing many readings in a short interval which is
12
+ // not really reliable on more powerful machine but cover different
13
+ // scenarios which might be useful. More reliable test is bug72333.phpt
9
14
$ serverCode = <<<'CODE'
10
- $ serverUri = "ssl://127.0.0.1:64321 " ;
11
- $ serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN ;
12
- $ serverCtx = stream_context_create (['ssl ' => [
13
- 'local_cert ' => __DIR__ . '/bug54992.pem ' ,
14
- 'crypto_method ' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
15
- ]]);
15
+ $serverUri = "ssl://127.0.0.1:10012 ";
16
+ $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
17
+ $serverCtx = stream_context_create(['ssl' => [
18
+ 'local_cert' => __DIR__ . '/bug54992.pem',
19
+ 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
20
+ ]]);
16
21
17
22
$server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
18
- phpt_notify ();
23
+ phpt_notify();
19
24
20
25
$client = stream_socket_accept($server, 1);
21
26
22
27
if (!$client) {
23
- exit ();
24
- }
28
+ exit();
29
+ }
25
30
26
31
$data = '';
27
- while (strlen ($ data ) < 0xfffff ) {
28
- $ buffer = fread ($ client , 8192 );
29
- if (empty ($ buffer )) {
30
- exit ();
31
- }
32
- $ data .= $ buffer ;
33
- usleep (100 );
34
- }
35
-
32
+ while (strlen($data) < 0xfffff) {
33
+ $buffer = fread($client, 8192);
34
+ if (empty($buffer)) {
35
+ exit();
36
+ }
37
+ $data .= $buffer;
38
+ usleep(100);
39
+ }
40
+
36
41
fclose($client);
37
42
CODE;
38
43
39
44
$ clientCode = <<<'CODE'
40
45
function streamRead($stream) : int {
41
- return strlen(fread($stream, 8192));
42
- }
46
+ return strlen(fread($stream, 8192));
47
+ }
43
48
44
49
function streamWrite($stream, $data) : int {
45
- return fwrite($stream, $data);
46
- }
50
+ return fwrite($stream, $data);
51
+ }
47
52
48
53
function waitForWrite(...$streams) : bool {
49
- $read = null;
50
- $except = null;
51
- while($streams && !($n = stream_select($read, $streams, $except, 1)));
52
- return $n > 0;
53
- }
54
+ $read = null;
55
+ $except = null;
56
+ while($streams && !($n = stream_select($read, $streams, $except, 1)));
57
+ return $n > 0;
58
+ }
54
59
55
60
function waitForRead(...$streams) : bool {
56
- $write = null;
57
- $except = null;
58
- while ($streams && !($n = stream_select($streams, $write, $except, 1)));
59
- return $n > 0;
60
- }
61
+ $write = null;
62
+ $except = null;
63
+ while ($streams && !($n = stream_select($streams, $write, $except, 1)));
64
+ return $n > 0;
65
+ }
61
66
62
67
set_error_handler(function ($errno, $errstr) {
63
- exit("$errstr\n");
64
- });
68
+ exit("$errstr\n");
69
+ });
65
70
66
- $serverUri = "tcp://127.0.0.1:64321 ";
67
- $clientFlags = STREAM_CLIENT_CONNECT;
68
- $clientCtx = stream_context_create(['ssl' => [
69
- 'verify_peer' => true,
70
- 'cafile' => __DIR__ . '/bug54992-ca.pem',
71
- 'peer_name' => 'bug54992.local',
72
- ]]);
71
+ $serverUri = "tcp://127.0.0.1:10012 ";
72
+ $clientFlags = STREAM_CLIENT_CONNECT;
73
+ $clientCtx = stream_context_create(['ssl' => [
74
+ 'verify_peer' => true,
75
+ 'cafile' => __DIR__ . '/bug54992-ca.pem',
76
+ 'peer_name' => 'bug54992.local',
77
+ ]]);
73
78
74
79
phpt_wait();
75
80
76
81
$fp = stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
77
82
78
83
stream_set_blocking($fp, false);
79
- while (0 === ($n = stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT)));
84
+ while (0 === ($n = stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT)));
80
85
81
86
$data = str_repeat("a", 0xfffff);
82
- $written = 0;
83
- $total = $written;
84
- while(!empty($data)) {
85
- $written = streamWrite($fp, $data);
86
- $total += $written;
87
- $data = substr($data, $written);
88
- waitForWrite($fp);
89
- }
90
- printf("Written %d bytes\n", $total);
87
+ $written = 0;
88
+ $total = $written;
89
+ while(!empty($data)) {
90
+ $written = streamWrite($fp, $data);
91
+ $total += $written;
92
+ $data = substr($data, $written);
93
+ waitForWrite($fp);
94
+ }
95
+ printf("Written %d bytes\n", $total);
91
96
92
97
while(waitForRead($fp)) {
93
- streamRead($fp);
94
- if (feof($fp)) {
95
- break;
96
- }
97
- }
98
+ streamRead($fp);
99
+ if (feof($fp)) {
100
+ break;
101
+ }
102
+ }
98
103
99
104
exit("DONE\n");
100
105
CODE;
101
106
102
107
include 'ServerClientTestCase.inc ' ;
103
108
ServerClientTestCase::getInstance ()->run ($ clientCode , $ serverCode );
109
+ ?>
104
110
--EXPECTF--
105
111
Written 1048575 bytes
106
112
DONE
0 commit comments