php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #40758 Test fcgi_is_fastcgi() is wrong on windows
Submitted: 2007-03-08 13:45 UTC Modified: 2007-03-28 15:40 UTC
From: jostb2345 at yahoo dot com Assigned: dmitry
Status: Closed Package: CGI/CLI related
PHP Version: 5.2.1 OS: Windows (all versions)
Private report: No CVE-ID:
 [2007-03-08 13:45 UTC] 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.



Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-03-09 13:36 UTC] dmitry@php.net
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-09 17:01 UTC] 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 17:06 UTC] jostb2345 at yahoo dot com
> 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
 [2007-03-12 17:21 UTC] dmitry@php.net
yes. PHP expects pipe but not a socket.

In C you may even try to pass window HANDLE :)

May be older PHP versions were able to support sockets on win32, but I have never seen any FastCGI plugin implmentation that passes sockets. Also I don't see any sockets advantages (only disadvantages).

 [2007-03-13 16:29 UTC] jostb2345 at yahoo dot com
> May be older PHP versions were able to support sockets on win32, but I
> have never seen any FastCGI plugin implmentation that passes sockets.

PHPIntKitForWindows.zip

=> http://www.alphaworks.ibm.com/tech/phpintwasce/download


> Also I don't see any sockets advantages (only disadvantages).

I don't think named pipes work on all operating systems. Furthermore Java supports only TCP socket communication (well, it is possible to access Windows and Unix named pipes from Java. But one has to implement it twice. RandomAccessFile on Windows, a pair of normal Files on Unix). 

To be practical -- and for backward compatibility -- we need a working TCP socket implementation on both operating systems. tcp sockets worked in PHP versions < 5.2.0 and I don't see a good reason to drop this.


Regards,
Jost Boekemeier
 [2007-03-23 09:06 UTC] dmitry@php.net
ok. I'll add socket support for win32, but I am not sure when I'll have time for this work.
 [2007-03-28 15:40 UTC] dmitry@php.net
Fixed in CVS HEAD and PHP_5_2.
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Sat Apr 19 22:02:16 2014 UTC