[PATCH] bug when requesting a non existing file
| From: | Jérôme Loyet | Date: | Wed, 16 Dec 2009 17:13:09 +0000 |
| Subject: | [PATCH] bug when requesting a non existing file | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-46450@lists.php.net to get a copy of this message | ||
There is a bug in fpm_main.c. After accepting a request, it's
initialized and SG(request_info).path_translated must be set. If it's
not set (NULL) nothing is done and the php_execute_script is called
without having php_fopen_primary_script() called. It causes segfault:
1- call several time a non existant page (/noexistent.php)
2- call several time an existant page (/test.php)
3- call a non existant page (/noexistent.php) --> the child handling
this request segfaults
The solution is to return a 404 when SG(request_info).path_translated is NULL.
By the way, it corrects a non desired feature (bug ?) as well. When
calling a non existent value, it returns a 404 with the following
message
<br />
<b>Warning</b>: Unknown: Filename cannot be empty in <b>Unknown</b>
on line <b>0</b><br />
<br />
<b>Fatal error</b>: Unknown: Failed opening required ''
(include_path='.:/usr/local/lib/php') in <b>Unknown</b> on line
<b>0</b><br />
++ Jerome
Index: sapi/fpm/fpm/fpm_main.c =================================================================== --- sapi/fpm/fpm/fpm_main.c (révision 292212) +++ sapi/fpm/fpm/fpm_main.c (copie de travail) @@ -1783,24 +1783,32 @@ return FAILURE; } - if (SG(request_info).path_translated) { - if (php_fopen_primary_script(&file_handle TSRMLS_CC) == FAILURE) { - zend_try { - if (errno == EACCES) { - SG(sapi_headers).http_response_code = 403; - PUTS("Access denied.\n"); - } else { - SG(sapi_headers).http_response_code = 404; - PUTS("No input file specified.\n"); - } - } zend_catch { - } zend_end_try(); - /* we want to serve more requests if this is fastcgi - * so cleanup and continue, request shutdown is - * handled later */ + /* If path_translated is NULL, terminate here with a 404 */ + if (!SG(request_info).path_translated) { + zend_try { + SG(sapi_headers).http_response_code = 404; + } zend_catch { + } zend_end_try(); + goto fastcgi_request_done; + } - goto fastcgi_request_done; - } + /* path_translated exists, we can continue ! */ + if (php_fopen_primary_script(&file_handle TSRMLS_CC) == FAILURE) { + zend_try { + if (errno == EACCES) { + SG(sapi_headers).http_response_code = 403; + PUTS("Access denied.\n"); + } else { + SG(sapi_headers).http_response_code = 404; + PUTS("No input file specified.\n"); + } + } zend_catch { + } zend_end_try(); + /* we want to serve more requests if this is fastcgi + * so cleanup and continue, request shutdown is + * handled later */ + + goto fastcgi_request_done; } fpm_request_executing();
Index: sapi/fpm/fpm/fpm_main.c =================================================================== --- sapi/fpm/fpm/fpm_main.c (révision 292212) +++ sapi/fpm/fpm/fpm_main.c (copie de travail) @@ -1783,24 +1783,32 @@ return FAILURE; } - if (SG(request_info).path_translated) { - if (php_fopen_primary_script(&file_handle TSRMLS_CC) == FAILURE) { - zend_try { - if (errno == EACCES) { - SG(sapi_headers).http_response_code = 403; - PUTS("Access denied.\n"); - } else { - SG(sapi_headers).http_response_code = 404; - PUTS("No input file specified.\n"); - } - } zend_catch { - } zend_end_try(); - /* we want to serve more requests if this is fastcgi - * so cleanup and continue, request shutdown is - * handled later */ + /* If path_translated is NULL, terminate here with a 404 */ + if (!SG(request_info).path_translated) { + zend_try { + SG(sapi_headers).http_response_code = 404; + } zend_catch { + } zend_end_try(); + goto fastcgi_request_done; + } - goto fastcgi_request_done; - } + /* path_translated exists, we can continue ! */ + if (php_fopen_primary_script(&file_handle TSRMLS_CC) == FAILURE) { + zend_try { + if (errno == EACCES) { + SG(sapi_headers).http_response_code = 403; + PUTS("Access denied.\n"); + } else { + SG(sapi_headers).http_response_code = 404; + PUTS("No input file specified.\n"); + } + } zend_catch { + } zend_end_try(); + /* we want to serve more requests if this is fastcgi + * so cleanup and continue, request shutdown is + * handled later */ + + goto fastcgi_request_done; } fpm_request_executing();