diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 0e7b3009c602..7ca8d5e2552a 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -1285,9 +1285,9 @@ static void init_request_info(fcgi_request *request) */ size_t slen = len - strlen(pt); size_t pilen = env_path_info ? strlen(env_path_info) : 0; - char *path_info = env_path_info ? env_path_info + pilen - slen : NULL; + char *path_info = (env_path_info && pilen > slen) ? env_path_info + pilen - slen : NULL; - if (orig_path_info != path_info) { + if (path_info != NULL && orig_path_info != path_info) { if (orig_path_info) { char old; diff --git a/sapi/cgi/tests/fix_pathinfo_underflow.phpt b/sapi/cgi/tests/fix_pathinfo_underflow.phpt new file mode 100644 index 000000000000..e737fee1dc7c --- /dev/null +++ b/sapi/cgi/tests/fix_pathinfo_underflow.phpt @@ -0,0 +1,37 @@ +--TEST-- +cgi fix_pathinfo with PATH_INFO shorter than the stripped suffix +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +X-Powered-By: PHP/%s +Content-type: text/html%r; charset=.*|%r + +PI=[/] +Done