bug77390.phpt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. --TEST--
  2. Bug #76705: feof might hang on TLS streams in case of fragmented TLS records
  3. --EXTENSIONS--
  4. openssl
  5. --SKIPIF--
  6. <?php
  7. if (!function_exists("proc_open")) die("skip no proc_open");
  8. ?>
  9. --FILE--
  10. <?php
  11. $certFile = __DIR__ . DIRECTORY_SEPARATOR . 'bug77390.pem.tmp';
  12. $cacertFile = __DIR__ . DIRECTORY_SEPARATOR . 'bug77390-ca.pem.tmp';
  13. $peerName = 'bug77390';
  14. $clientCode = <<<'CODE'
  15. $context = stream_context_create(['ssl' => ['verify_peer' => false, 'peer_name' => '%s']]);
  16. phpt_wait('server');
  17. phpt_notify('proxy');
  18. phpt_wait('proxy');
  19. $fp = stream_socket_client("ssl://127.0.0.1:10012", $errornum, $errorstr, 3000, STREAM_CLIENT_CONNECT, $context);
  20. stream_set_blocking($fp, false);
  21. $read = [$fp];
  22. $buf = '';
  23. $emptyChunkPrinted = false;
  24. $warmedUp = false;
  25. while (stream_select($read, $write, $except, 1000)) {
  26. $chunk = stream_get_contents($fp, 4096);
  27. $buf .= $chunk;
  28. phpt_notify('proxy');
  29. if (!$warmedUp) {
  30. if ($buf !== 'warmup') {
  31. continue;
  32. }
  33. $warmedUp = true;
  34. $buf = '';
  35. phpt_notify('server');
  36. continue;
  37. }
  38. if ($chunk !== '' || !$emptyChunkPrinted) {
  39. $emptyChunkPrinted = true;
  40. var_dump($chunk);
  41. }
  42. if ($buf === 'hello, world') {
  43. break;
  44. }
  45. }
  46. phpt_notify('server');
  47. phpt_notify('proxy');
  48. CODE;
  49. $clientCode = sprintf($clientCode, $peerName);
  50. $serverCode = <<<'CODE'
  51. $context = stream_context_create(['ssl' => ['local_cert' => '%s']]);
  52. $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
  53. $fp = stream_socket_server("ssl://127.0.0.1:10011", $errornum, $errorstr, $flags, $context);
  54. phpt_notify();
  55. $conn = stream_socket_accept($fp);
  56. fwrite($conn, 'warmup');
  57. phpt_wait();
  58. fwrite($conn, 'hello, world');
  59. phpt_wait();
  60. fclose($conn);
  61. CODE;
  62. $serverCode = sprintf($serverCode, $certFile);
  63. $proxyCode = <<<'CODE'
  64. phpt_wait();
  65. $upstream = stream_socket_client("tcp://127.0.0.1:10011", $errornum, $errorstr, 3000, STREAM_CLIENT_CONNECT);
  66. stream_set_blocking($upstream, false);
  67. $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
  68. $server = stream_socket_server("tcp://127.0.0.1:10012", $errornum, $errorstr, $flags);
  69. phpt_notify();
  70. $conn = stream_socket_accept($server);
  71. stream_set_blocking($conn, false);
  72. $read = [$upstream, $conn];
  73. while (stream_select($read, $write, $except, 1)) {
  74. foreach ($read as $fp) {
  75. $data = stream_get_contents($fp);
  76. if ($fp === $conn) {
  77. fwrite($upstream, $data);
  78. } else {
  79. if ($data !== '' && $data[0] === chr(23)) {
  80. $parts = str_split($data, (int) ceil(strlen($data) / 3));
  81. foreach ($parts as $part) {
  82. fwrite($conn, $part);
  83. phpt_wait(null, 1);
  84. }
  85. } else {
  86. fwrite($conn, $data);
  87. }
  88. }
  89. }
  90. if (feof($upstream)) {
  91. break;
  92. }
  93. $read = [$upstream, $conn];
  94. }
  95. phpt_wait();
  96. CODE;
  97. include 'CertificateGenerator.inc';
  98. $certificateGenerator = new CertificateGenerator();
  99. $certificateGenerator->saveCaCert($cacertFile);
  100. $certificateGenerator->saveNewCertAsFileWithKey($peerName, $certFile);
  101. include 'ServerClientTestCase.inc';
  102. ServerClientTestCase::getInstance()->run($clientCode, [
  103. 'server' => $serverCode,
  104. 'proxy' => $proxyCode,
  105. ]);
  106. ?>
  107. --CLEAN--
  108. <?php
  109. @unlink(__DIR__ . DIRECTORY_SEPARATOR . 'bug77390.pem.tmp');
  110. @unlink(__DIR__ . DIRECTORY_SEPARATOR . 'bug77390-ca.pem.tmp');
  111. ?>
  112. --EXPECT--
  113. string(0) ""
  114. string(12) "hello, world"