#40758 [Fbk->Opn]: Test fcgi_is_fastcgi() is wrong on windows

2007-03-13 Thread jostb2345 at yahoo dot com
 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:

> 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


Previous Comments:


[2007-03-12 17:21:32] [EMAIL PROTECTED]

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-09 17:06:35] 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-09 17:01:01] jostb2345 at yahoo dot de

# include 
# include 
# 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


#40758 [Fbk->Opn]: Test fcgi_is_fastcgi() is wrong on windows

2007-03-09 Thread jostb2345 at yahoo dot com
 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 
# include 
# 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


#40758 [NEW]: Test fcgi_is_fastcgi() is wrong on windows

2007-03-08 Thread jostb2345 at yahoo dot com
From: jostb2345 at yahoo dot com
Operating system: Windows (all versions)
PHP version:  5.2.1
PHP Bug Type: Reproducible crash
Bug description:  Test fcgi_is_fastcgi() is wrong on windows

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 bug report at http://bugs.php.net/?id=40758&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=40758&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=40758&r=trysnapshot52
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=40758&r=trysnapshot60
Fixed in CVS: http://bugs.php.net/fix.php?id=40758&r=fixedcvs
Fixed in release: 
http://bugs.php.net/fix.php?id=40758&r=alreadyfixed
Need backtrace:   http://bugs.php.net/fix.php?id=40758&r=needtrace
Need Reproduce Script:http://bugs.php.net/fix.php?id=40758&r=needscript
Try newer version:http://bugs.php.net/fix.php?id=40758&r=oldversion
Not developer issue:  http://bugs.php.net/fix.php?id=40758&r=support
Expected behavior:http://bugs.php.net/fix.php?id=40758&r=notwrong
Not enough info:  
http://bugs.php.net/fix.php?id=40758&r=notenoughinfo
Submitted twice:  
http://bugs.php.net/fix.php?id=40758&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=40758&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=40758&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=40758&r=dst
IIS Stability:http://bugs.php.net/fix.php?id=40758&r=isapi
Install GNU Sed:  http://bugs.php.net/fix.php?id=40758&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=40758&r=float
No Zend Extensions:   http://bugs.php.net/fix.php?id=40758&r=nozend
MySQL Configuration Error:http://bugs.php.net/fix.php?id=40758&r=mysqlcfg