mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Fix GHSA-p99j-rfp4-xqvq
It's no use trying to work around whatever the operating system and Apache do because we'll be fighting that until eternity. Change the skip_getopt condition such that when we're running in CGI or FastCGI mode we always skip the argument parsing. This is a BC break, but this seems to be the only way to get rid of this class of issues.
This commit is contained in:
committed by
Jakub Zelenka
parent
d65a1e6f91
commit
4b9cd27ff5
@@ -1748,7 +1748,6 @@ int main(int argc, char *argv[])
|
||||
int status = 0;
|
||||
#endif
|
||||
char *query_string;
|
||||
char *decoded_query_string;
|
||||
int skip_getopt = 0;
|
||||
|
||||
#if defined(SIGPIPE) && defined(SIG_IGN)
|
||||
@@ -1803,10 +1802,15 @@ int main(int argc, char *argv[])
|
||||
* the executable. Ideally we skip argument parsing when we're in cgi or fastcgi mode,
|
||||
* but that breaks PHP scripts on Linux with a hashbang: `#!/php-cgi -d option=value`.
|
||||
* Therefore, this code only prevents passing arguments if the query string starts with a '-'.
|
||||
* Similarly, scripts spawned in subprocesses on Windows may have the same issue. */
|
||||
* Similarly, scripts spawned in subprocesses on Windows may have the same issue.
|
||||
* However, Windows has lots of conversion rules and command line parsing rules that
|
||||
* are too difficult and dangerous to reliably emulate. */
|
||||
if((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string, '=') == NULL) {
|
||||
#ifdef PHP_WIN32
|
||||
skip_getopt = cgi || fastcgi;
|
||||
#else
|
||||
unsigned char *p;
|
||||
decoded_query_string = strdup(query_string);
|
||||
char *decoded_query_string = strdup(query_string);
|
||||
php_url_decode(decoded_query_string, strlen(decoded_query_string));
|
||||
for (p = (unsigned char *)decoded_query_string; *p && *p <= ' '; p++) {
|
||||
/* skip all leading spaces */
|
||||
@@ -1815,22 +1819,8 @@ int main(int argc, char *argv[])
|
||||
skip_getopt = 1;
|
||||
}
|
||||
|
||||
/* On Windows we have to take into account the "best fit" mapping behaviour. */
|
||||
#ifdef PHP_WIN32
|
||||
if (*p >= 0x80) {
|
||||
wchar_t wide_buf[1];
|
||||
wide_buf[0] = *p;
|
||||
char char_buf[4];
|
||||
size_t wide_buf_len = sizeof(wide_buf) / sizeof(wide_buf[0]);
|
||||
size_t char_buf_len = sizeof(char_buf) / sizeof(char_buf[0]);
|
||||
if (WideCharToMultiByte(CP_ACP, 0, wide_buf, wide_buf_len, char_buf, char_buf_len, NULL, NULL) == 0
|
||||
|| char_buf[0] == '-') {
|
||||
skip_getopt = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
free(decoded_query_string);
|
||||
#endif
|
||||
}
|
||||
|
||||
while (!skip_getopt && (c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) {
|
||||
|
||||
Reference in New Issue
Block a user