ID: 40758
User updated by: jostb2345 at yahoo dot com
Reported By: jostb2345 at yahoo dot com
-Status: Feedback
+Status: Open
Bug Type: CGI related
Operating System: Windows (all versions)
PHP Version: 5.2.1
Assigned To: dmitry
New Comment:
> I don't understand for what reason some program passes stdout to
> PHP
Because I thought you need to distinguish sockets from named pipes.
I have attached code which crashes php since 5.2.0.
Regards,
Jost Boekemeier
Previous Comments:
------------------------------------------------------------------------
[2007-03-09 17:01:01] jostb2345 at yahoo dot de
# include <windows.h>
# include <winsock2.h>
# define close closesocket
term() {
printf("err:%d", (GetLastError()));
exit(1);
}
struct sockaddr_in saddr;
main() {
SOCKET listen_handle;
SOCKADDR_IN saServer;
char *cmd = "php-cgi.exe";
STARTUPINFO su_info;
SECURITY_ATTRIBUTES sa = { 0 };
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int n = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested) term();
listen_handle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY;
saServer.sin_port = htons(9667);
n = bind(listen_handle, (LPSOCKADDR)&saServer, sizeof(struct
sockaddr));
if (n == SOCKET_ERROR) term();
n = listen(listen_handle, 20);
if (n == SOCKET_ERROR) term();
ZeroMemory(&su_info, sizeof(STARTUPINFO));
su_info.cb = sizeof(STARTUPINFO);
su_info.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
su_info.wShowWindow = SW_HIDE;
su_info.hStdInput = listen_handle;
su_info.hStdError = INVALID_HANDLE_VALUE;
su_info.hStdOutput = INVALID_HANDLE_VALUE;
SetHandleInformation(su_info.hStdInput, HANDLE_FLAG_INHERIT, TRUE);
PROCESS_INFORMATION p;
if(CreateProcess(NULL, cmd, NULL, NULL, 1, 0, NULL, NULL, &su_info,
&p)) {
CloseHandle(p.hThread); closesocket(listen_handle);
} else {
term();
}
if( WaitForSingleObject(p.hProcess, INFINITE) == WAIT_FAILED ){
term();
}
WSACleanup();
}
------------------------------------------------------------------------
[2007-03-09 13:36:15] [EMAIL PROTECTED]
I don't see any difference with old code. See OS_IsFcgi() and
OS_LibInit().
Also I don't understand for what reason some program passes stdout to
PHP.
------------------------------------------------------------------------
[2007-03-08 13:45:33] jostb2345 at yahoo dot com
Description:
------------
On windows, php 5.2.0 and above the following code (written in
pseudo-code) doesn't work anymore:
socket = socket(AF_INET, ...);
bind(socket, ...);
listen(socket, ...);
outputHandle=GetStdHandle(...);
inputHandle=socket;
CreateProcess(...,"php-cgi.exe", ..., IOHandles);
The problem is that "is_fastcgi" is only set if the OutputHandle and
ErrorHandle are invalid. If both are invalid, InputHandle is assumed to
be a named pipe.
The Unix version still uses the old (correct) code.
To correct this problem either the old FCGI_isfcgi() should be used or
the test must be dublicated. See procedures:
int fcgi_init(void);
int fcgi_is_fastcgi(void);
Regards,
Jost Boekemeier
Reproduce code:
---------------
See above. If necessary I can provide a test program.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=40758&edit=1