Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5efd60e

Browse files
committed
Merge branch 'PHP-8.2'
2 parents 2ec0134 + 2b0d29b commit 5efd60e

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

‎sapi/fpm/fpm/fpm_main.c‎

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,12 +1162,32 @@ static void init_request_info(void)
11621162
* As we can extract PATH_INFO from PATH_TRANSLATED
11631163
* it is probably also in SCRIPT_NAME and need to be removed
11641164
*/
1165-
int snlen = strlen(env_script_name);
1166-
if (snlen>slen && !strcmp(env_script_name+snlen-slen, path_info)) {
1165+
char *decoded_path_info = NULL;
1166+
size_t decoded_path_info_len = 0;
1167+
if (strchr(path_info, '%')) {
1168+
decoded_path_info = estrdup(path_info);
1169+
decoded_path_info_len = php_url_decode(decoded_path_info, strlen(path_info));
1170+
}
1171+
size_t snlen = strlen(env_script_name);
1172+
size_t env_script_file_info_start = 0;
1173+
if (
1174+
(
1175+
snlen > slen &&
1176+
!strcmp(env_script_name + (env_script_file_info_start = snlen - slen), path_info)
1177+
) ||
1178+
(
1179+
decoded_path_info &&
1180+
snlen > decoded_path_info_len &&
1181+
!strcmp(env_script_name + (env_script_file_info_start = snlen - decoded_path_info_len), decoded_path_info)
1182+
)
1183+
) {
11671184
FCGI_PUTENV(request, "ORIG_SCRIPT_NAME", orig_script_name);
1168-
env_script_name[snlen-slen] = 0;
1185+
env_script_name[env_script_file_info_start] = 0;
11691186
SG(request_info).request_uri = FCGI_PUTENV(request, "SCRIPT_NAME", env_script_name);
11701187
}
1188+
if (decoded_path_info) {
1189+
efree(decoded_path_info);
1190+
}
11711191
}
11721192
env_path_info = FCGI_PUTENV(request, "PATH_INFO", path_info);
11731193
}
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)

AltStyle によって変換されたページ (->オリジナル) /