Skip to content

Commit 1efdcc6

Browse files
committed
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4: sapi/cli: Fix built-in server truncating responses after a partial write
2 parents e97d5f6 + 021acbe commit 1efdcc6

2 files changed

Lines changed: 10 additions & 6 deletions

File tree

‎NEWS‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ PHP NEWS
2424
request activation). (matyhtf)
2525
. Fixed bug GH-23764 (Built-in server leaks a file descriptor on every HEAD
2626
request for a static file). (jakubskopal)
27+
. Fixed the built-in server truncating an error page and leaking its
28+
unsent part after a partial socket write. (Ilia Alshanetsky)
2729

2830
- DOM:
2931
. Fixed use-after-free when re-constructing a DOMXPath whose php:function

‎sapi/cli/php_cli_server.c‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,8 @@ static void php_cli_server_content_sender_ctor(php_cli_server_content_sender *se
10671067
static int php_cli_server_content_sender_send(php_cli_server_content_sender *sender, php_socket_t fd, size_t *nbytes_sent_total) /* {{{ */
10681068
{
10691069
php_cli_server_chunk *chunk, *next;
1070-
size_t _nbytes_sent_total = 0;
1070+
1071+
*nbytes_sent_total = 0;
10711072

10721073
for (chunk = sender->buffer.first; chunk; chunk = next) {
10731074
#ifdef PHP_WIN32
@@ -1085,7 +1086,6 @@ static int php_cli_server_content_sender_send(php_cli_server_content_sender *sen
10851086
nbytes_sent = send(fd, chunk->data.heap.p, chunk->data.heap.len, 0);
10861087
#endif
10871088
if (nbytes_sent < 0) {
1088-
*nbytes_sent_total = _nbytes_sent_total;
10891089
return php_socket_errno();
10901090
#ifdef PHP_WIN32
10911091
} else if (nbytes_sent == chunk->data.heap.len) {
@@ -1101,8 +1101,10 @@ static int php_cli_server_content_sender_send(php_cli_server_content_sender *sen
11011101
} else {
11021102
chunk->data.heap.p += nbytes_sent;
11031103
chunk->data.heap.len -= nbytes_sent;
1104+
*nbytes_sent_total += nbytes_sent;
1105+
return 0;
11041106
}
1105-
_nbytes_sent_total += nbytes_sent;
1107+
*nbytes_sent_total += nbytes_sent;
11061108
break;
11071109

11081110
case PHP_CLI_SERVER_CHUNK_IMMORTAL:
@@ -1112,7 +1114,6 @@ static int php_cli_server_content_sender_send(php_cli_server_content_sender *sen
11121114
nbytes_sent = send(fd, chunk->data.immortal.p, chunk->data.immortal.len, 0);
11131115
#endif
11141116
if (nbytes_sent < 0) {
1115-
*nbytes_sent_total = _nbytes_sent_total;
11161117
return php_socket_errno();
11171118
#ifdef PHP_WIN32
11181119
} else if (nbytes_sent == chunk->data.immortal.len) {
@@ -1128,12 +1129,13 @@ static int php_cli_server_content_sender_send(php_cli_server_content_sender *sen
11281129
} else {
11291130
chunk->data.immortal.p += nbytes_sent;
11301131
chunk->data.immortal.len -= nbytes_sent;
1132+
*nbytes_sent_total += nbytes_sent;
1133+
return 0;
11311134
}
1132-
_nbytes_sent_total += nbytes_sent;
1135+
*nbytes_sent_total += nbytes_sent;
11331136
break;
11341137
}
11351138
}
1136-
*nbytes_sent_total = _nbytes_sent_total;
11371139
return 0;
11381140
} /* }}} */
11391141

0 commit comments

Comments
 (0)