Edit report at https://bugs.php.net/bug.php?id=50979&edit=1

 ID:               50979
 Updated by:       php-bugs@lists.php.net
 Reported by:      php at linepoint dot com
 Summary:          FastCGI/CGI runtime selection error
-Status:           Feedback
+Status:           No Feedback
 Type:             Bug
 Package:          CGI/CLI related
 Operating System: Freebsd
 PHP Version:      5.3.1
 Assigned To:      dmitry

 New Comment:

No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.


Previous Comments:
------------------------------------------------------------------------
[2010-04-20 16:36:30] dmi...@php.net

The getpeername() check came from the reference libfcgi implementation.

The additional check for getenv("PHP_FCGI_CHILDREN") is not correct because 
PHP_FCGI_CHILDREN don't have to be set.

Really I can't find out a different check which will portable across different 
FastCGI managers.

Especially for Zeus (and any other web server which supports FastCGI) I would 
suggest to use FastCGI instead of CGI.

------------------------------------------------------------------------
[2010-02-09 20:53:47] php at linepoint dot com

Description:
------------
PHP v5.3+ now forces fastcgi support to be compiled into the executable, and 
upon execution of php-cgi, auto selects which mode (fastcgi/cgi) is to be used.

In some circumstances, it can guess incorrectly and use fastcgi mode when cgi 
mode should be used.

PHP's method of checking in sapi/cgi/fastcgi.c (line ~230) uses the errno 
returned (ENOTCONN) as an assumption that a local/unix socket connection must 
be a fastcgi call.

A alternative or secondary check should be implemented to verify that it's 
truly a fastcgi execution.

This problem was initially found when working with the Zeus Webserver 
(http://www.zeus.com), but can be reproduced with other systems that work the 
same way.

Reproduce code:
---------------
When php-cgi is called from a webserver, it checks stdin (fd 0) with a 
getpeername call to see if it's reading via a socket or not.  In some 
circumstances/webservers, php-cgi can be called using local sockets instead of 
file, but not be executed with fastcgi hooks.

Code in question:
--- sapi/cgi/fastcgi.c.orig     2010-02-09 12:25:49.000000000 -0500
                }
 #else
                errno = 0;
                if (getpeername(0, (struct sockaddr *)&sa, &len) != 0 && errno 
== ENOTCONN) {
                        fcgi_setup_signals();
                        return is_fastcgi = 1;
                } else {

---



Expected result:
----------------
Expected result is that fastcgi mode is used for fastcgi calls, and cgi mode is 
used for cgi calls.

A "proof of concept" patch which fixes the issue (this is not a final patch due 
to the fact the environmental variable checked is optional, not mandatory)

--- sapi/cgi/fastcgi.c.orig     2010-02-09 12:25:49.000000000 -0500
+++ sapi/cgi/fastcgi.c  2010-02-09 12:26:50.000000000 -0500
@@ -228,7 +228,7 @@
                }
 #else
                errno = 0;
-               if (getpeername(0, (struct sockaddr *)&sa, &len) != 0 && errno 
== ENOTCONN) {
+               if (getpeername(0, (struct sockaddr *)&sa, &len) != 0 && errno 
== ENOTCONN && getenv ("PHP_FCGI_CHILDREN") ) {
                        fcgi_setup_signals();
                        return is_fastcgi = 1;
                } else {


Actual result:
--------------
The current code auto selects fastcgi mode, when cgi mode is the desired result.


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=50979&edit=1

Reply via email to