Skip to content

Commit 2b0d29b

Browse files
committed
Merge branch 'PHP-8.1' into PHP-8.2
2 parents c0bb5b0 + 0d4d471 commit 2b0d29b

File tree

3 files changed

+79
-3
lines changed

3 files changed

+79
-3
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ PHP NEWS
2727
- FPM:
2828
. Fixed bug GH-10611 (fpm_env_init_main leaks environ). (nielsdos)
2929
. Destroy file_handle in fpm_main. (Jakub Zelenka, nielsdos)
30+
. Fixed bug #74129 (Incorrect SCRIPT_NAME with apache ProxyPassMatch when
31+
spaces are in path). (Jakub Zelenka)
3032

3133
- FTP:
3234
. Propagate success status of ftp_close(). (nielsdos)

sapi/fpm/fpm/fpm_main.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,12 +1161,32 @@ static void init_request_info(void)
11611161
* As we can extract PATH_INFO from PATH_TRANSLATED
11621162
* it is probably also in SCRIPT_NAME and need to be removed
11631163
*/
1164-
int snlen = strlen(env_script_name);
1165-
if (snlen>slen && !strcmp(env_script_name+snlen-slen, path_info)) {
1164+
char *decoded_path_info = NULL;
1165+
size_t decoded_path_info_len = 0;
1166+
if (strchr(path_info, '%')) {
1167+
decoded_path_info = estrdup(path_info);
1168+
decoded_path_info_len = php_url_decode(decoded_path_info, strlen(path_info));
1169+
}
1170+
size_t snlen = strlen(env_script_name);
1171+
size_t env_script_file_info_start = 0;
1172+
if (
1173+
(
1174+
snlen > slen &&
1175+
!strcmp(env_script_name + (env_script_file_info_start = snlen - slen), path_info)
1176+
) ||
1177+
(
1178+
decoded_path_info &&
1179+
snlen > decoded_path_info_len &&
1180+
!strcmp(env_script_name + (env_script_file_info_start = snlen - decoded_path_info_len), decoded_path_info)
1181+
)
1182+
) {
11661183
FCGI_PUTENV(request, "ORIG_SCRIPT_NAME", orig_script_name);
1167-
env_script_name[snlen-slen] = 0;
1184+
env_script_name[env_script_file_info_start] = 0;
11681185
SG(request_info).request_uri = FCGI_PUTENV(request, "SCRIPT_NAME", env_script_name);
11691186
}
1187+
if (decoded_path_info) {
1188+
efree(decoded_path_info);
1189+
}
11701190
}
11711191
env_path_info = FCGI_PUTENV(request, "PATH_INFO", path_info);
11721192
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
--TEST--
2+
FPM: FastCGI env var path info fix for Apache ProxyPass SCRIPT_NAME stripping with encoded path (bug #74129)
3+
--SKIPIF--
4+
<?php include "skipif.inc"; ?>
5+
--FILE--
6+
<?php
7+
8+
require_once "tester.inc";
9+
10+
$cfg = <<<EOT
11+
[global]
12+
error_log = {{FILE:LOG}}
13+
[unconfined]
14+
listen = {{ADDR}}
15+
pm = dynamic
16+
pm.max_children = 5
17+
pm.start_servers = 1
18+
pm.min_spare_servers = 1
19+
pm.max_spare_servers = 3
20+
php_admin_value[cgi.fix_pathinfo] = yes
21+
EOT;
22+
23+
$code = <<<EOT
24+
<?php
25+
echo \$_SERVER["SCRIPT_NAME"] . "\n";
26+
echo \$_SERVER["ORIG_SCRIPT_NAME"] . "\n";
27+
echo \$_SERVER["SCRIPT_FILENAME"] . "\n";
28+
echo \$_SERVER["PATH_INFO"] . "\n";
29+
echo \$_SERVER["PHP_SELF"];
30+
EOT;
31+
32+
$tester = new FPM\Tester($cfg, $code);
33+
[$sourceFilePath, $scriptName] = $tester->createSourceFileAndScriptName();
34+
$tester->start();
35+
$tester->expectLogStartNotices();
36+
$tester
37+
->request(
38+
uri: $scriptName . '/1%202',
39+
scriptFilename: "proxy:fcgi://" . $tester->getAddr() . $sourceFilePath . '/1%202',
40+
scriptName: $scriptName . '/1 2'
41+
)
42+
->expectBody([$scriptName, $scriptName . '/1 2', $sourceFilePath, '/1%202', $scriptName . '/1%202']);
43+
$tester->terminate();
44+
$tester->close();
45+
46+
?>
47+
Done
48+
--EXPECT--
49+
Done
50+
--CLEAN--
51+
<?php
52+
require_once "tester.inc";
53+
FPM\Tester::clean();
54+
?>

0 commit comments

Comments
 (0)