@@ -1569,6 +1569,9 @@ static int php_cli_server_client_read_request_on_path(php_http_parser *parser, c
1569
1569
{
1570
1570
char * vpath ;
1571
1571
size_t vpath_len ;
1572
+ if (UNEXPECTED (client -> request .vpath != NULL )) {
1573
+ return 1 ;
1574
+ }
1572
1575
normalize_vpath (& vpath , & vpath_len , at , length , 1 );
1573
1576
client -> request .vpath = vpath ;
1574
1577
client -> request .vpath_len = vpath_len ;
@@ -1579,17 +1582,34 @@ static int php_cli_server_client_read_request_on_path(php_http_parser *parser, c
1579
1582
static int php_cli_server_client_read_request_on_query_string (php_http_parser * parser , const char * at , size_t length )
1580
1583
{
1581
1584
php_cli_server_client * client = parser -> data ;
1582
- client -> request .query_string = pestrndup (at , length , 1 );
1583
- client -> request .query_string_len = length ;
1585
+ if (EXPECTED (client -> request .query_string == NULL )) {
1586
+ client -> request .query_string = pestrndup (at , length , 1 );
1587
+ client -> request .query_string_len = length ;
1588
+ } else {
1589
+ ZEND_ASSERT (length <= PHP_HTTP_MAX_HEADER_SIZE && PHP_HTTP_MAX_HEADER_SIZE - length >= client -> request .query_string_len );
1590
+ client -> request .query_string = perealloc (client -> request .query_string , client -> request .query_string_len + length + 1 , 1 );
1591
+ memcpy (client -> request .query_string + client -> request .query_string_len , at , length );
1592
+ client -> request .query_string_len += length ;
1593
+ client -> request .query_string [client -> request .query_string_len ] = '\0' ;
1594
+ }
1584
1595
return 0 ;
1585
1596
}
1586
1597
1587
1598
static int php_cli_server_client_read_request_on_url (php_http_parser * parser , const char * at , size_t length )
1588
1599
{
1589
1600
php_cli_server_client * client = parser -> data ;
1590
- client -> request .request_method = parser -> method ;
1591
- client -> request .request_uri = pestrndup (at , length , 1 );
1592
- client -> request .request_uri_len = length ;
1601
+ if (EXPECTED (client -> request .request_uri == NULL )) {
1602
+ client -> request .request_method = parser -> method ;
1603
+ client -> request .request_uri = pestrndup (at , length , 1 );
1604
+ client -> request .request_uri_len = length ;
1605
+ } else {
1606
+ ZEND_ASSERT (client -> request .request_method == parser -> method );
1607
+ ZEND_ASSERT (length <= PHP_HTTP_MAX_HEADER_SIZE && PHP_HTTP_MAX_HEADER_SIZE - length >= client -> request .query_string_len );
1608
+ client -> request .request_uri = perealloc (client -> request .request_uri , client -> request .request_uri_len + length + 1 , 1 );
1609
+ memcpy (client -> request .request_uri + client -> request .request_uri_len , at , length );
1610
+ client -> request .request_uri_len += length ;
1611
+ client -> request .request_uri [client -> request .request_uri_len ] = '\0' ;
1612
+ }
1593
1613
return 0 ;
1594
1614
}
1595
1615
0 commit comments