Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions sapi/cli/php_cli_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1970,9 +1970,13 @@ static void php_cli_server_client_ctor(php_cli_server_client *client, php_cli_se
// Create a new php_network_populate_name_from_sockaddr_ex() API with a persistent flag?
zend_string *tmp_addr = NULL;
php_network_populate_name_from_sockaddr(addr, addr_len, &tmp_addr, NULL, 0);
client->addr_str = zend_string_dup(tmp_addr, /* persistent */ true);
if (EXPECTED(tmp_addr != NULL)) {
client->addr_str = zend_string_dup(tmp_addr, /* persistent */ true);
zend_string_release_ex(tmp_addr, /* persistent */ false);
} else {
client->addr_str = zend_string_init(ZEND_STRL("-"), /* persistent */ true);
}
GC_MAKE_PERSISTENT_LOCAL(client->addr_str);
zend_string_release_ex(tmp_addr, /* persistent */ false);

php_http_parser_init(&client->parser, PHP_HTTP_REQUEST);
client->request_read = false;
Expand Down Expand Up @@ -2712,7 +2716,7 @@ static zend_result php_cli_server_do_event_for_each_fd_callback(void *_params, p
php_cli_server_client *client = NULL;
php_socket_t client_sock;
socklen_t socklen = server->socklen;
struct sockaddr *sa = pemalloc(server->socklen, 1);
struct sockaddr *sa = pecalloc(1, server->socklen, 1);
client_sock = accept(server->server_sock, sa, &socklen);
if (!ZEND_VALID_SOCKET(client_sock)) {
pefree(sa, 1);
Expand Down
26 changes: 26 additions & 0 deletions sapi/cli/tests/php_cli_server_reset_before_accept.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
--TEST--
Connection reset before it is accepted does not take the server down
--EXTENSIONS--
sockets
--SKIPIF--
<?php
include "skipif.inc";
if (PHP_OS_FAMILY === "Windows") die("skip SO_LINGER reset behaviour differs on Windows");
?>
--FILE--
<?php
include "php_cli_server.inc";
php_cli_server_start();

$fp = php_cli_server_connect();
socket_set_option(socket_import_stream($fp), SOL_SOCKET, SO_LINGER, ['l_onoff' => 1, 'l_linger' => 0]);
stream_socket_shutdown($fp, STREAM_SHUT_RD);
fclose($fp);

$fp = php_cli_server_connect();
fwrite($fp, "GET / HTTP/1.1\r\nConnection: close\r\n\r\n");
echo fgets($fp);
fclose($fp);
?>
--EXPECT--
HTTP/1.1 200 OK
Loading