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