php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #23837 pfsockopen() returning bad connection when host restarts
Submitted: 2003-05-27 12:52 UTC Modified: 2003-09-18 13:29 UTC
From: dietrich dot ayala at foundstone dot com Assigned: wez (profile)
Status: Closed Package: Sockets related
PHP Version: 4.3.2RC4 OS: windows 2000
Private report: No CVE-ID: None
 [2003-05-27 12:52 UTC] dietrich dot ayala at foundstone dot com
If I make a persistent connection to a host, then cycle the host, subsequent requests to pfsockopen return a connection (no error), but any subsequent calls to fgets() (and any socket-accessing kin) using the pointer fail w/ bad connection errors.

Previously, I reported this problem when the host *never* comes back up, and Wez fixed that. But it appears this also happens when the host is cycled as well.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-05-27 14:47 UTC] wez@php.net
Assigning to myself; it would be good if some other people could verify if this problem exists on other platforms, and if this is a critical issue.

 [2003-05-27 17:16 UTC] sniper@php.net
No example script here either. Can not reproduce.

 [2003-05-27 17:40 UTC] dietrich dot ayala at foundstone dot com
Repro script is below. i tested w/ w2k+FastCGI and w2k+isapi, and could repro the behaviour w/ both.

steps:
1. run the script
2. take host down and back up, or even just cycle the listening app on the specified port. either one will repro the bug.
3. run the script again. if you're using isapi or fastcgi, it'll attempt to reuse the connection, but won't reconnect, and will display the behaviour described.

<?php

$host = 'd-w2kserv';
$port = 80;

// open connection
if(!$fp = pfsockopen($host, $port, $errno, $error_str)){
	die('error: '.$error_str.$phperrormsg);
} else {

	// write data
	$requestMsg = "GET / HTTP/1.1\r\nHost: $host\r\n\r\n";
	if(!@fwrite($fp, $requestMsg)) {
		die('error: '.$phperrormsg);
	}
	
	// read data
	do {
		
		// array of connections
		$read = array($fp);
		
		// use stream_select() for non-busy wait
		if (false === ($num_changed_streams = stream_select($read, $write = NULL, $except = NULL, 0))) {
		   
		   die('Stream_select returned error: '.$phperrormsg);
			
		// At least on one of the streams something interesting happened 
		} elseif ($num_changed_streams > 0) {
			
			if( !$data = @fgets($fp, 8192) ){
				
				die('couldnt get data from socket, or socket returned no data');
				
			}
			print $data;
			
			// no more data
			if (feof($fp) || $data === false || strlen($data) == 0) {
				break;
			}

		}
		
	} while(true);
}
?>
 [2003-09-18 13:29 UTC] iliaa@php.net
This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.

User reports that the problem was in fact fixed in the CVS.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Jul 14 15:01:28 2024 UTC