Merge branch '1.0' into 2.0

* 1.0:
  SSH2: rm unused $connectionTimeout variable
  SSH2: rm redundant code and make php4 compatable
  SSH2: timeout improvements

Conflicts:
	phpseclib/Net/SSH2.php
This commit is contained in:
Andreas Fischer 2015-03-30 12:46:54 +02:00
commit 8101772ab4

View File

@ -799,21 +799,6 @@ class SSH2
*/ */
var $port; var $port;
/**
* Timeout for initial connection
*
* Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like
* exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor,
* however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be
* 10 seconds. It is used by fsockopen() and the initial stream_select in that function.
*
* @see \phpseclib\Net\SSH2::__construct()
* @see \phpseclib\Net\SSH2::_connect()
* @var Integer
* @access private
*/
var $connectionTimeout;
/** /**
* Number of columns for terminal window size * Number of columns for terminal window size
* *
@ -928,7 +913,7 @@ class SSH2
$this->host = $host; $this->host = $host;
$this->port = $port; $this->port = $port;
$this->connectionTimeout = $timeout; $this->timeout = $timeout;
} }
/** /**
@ -945,36 +930,24 @@ class SSH2
$this->bitmap |= self::MASK_CONSTRUCTOR; $this->bitmap |= self::MASK_CONSTRUCTOR;
$timeout = $this->connectionTimeout; $this->curTimeout = $this->timeout;
$host = $this->host . ':' . $this->port; $host = $this->host . ':' . $this->port;
$this->last_packet = microtime(true); $this->last_packet = microtime(true);
$start = microtime(true); $start = microtime(true);
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $timeout); $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout);
if (!$this->fsock) { if (!$this->fsock) {
user_error(rtrim("Cannot connect to $host. Error $errno. $errstr")); user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
return false; return false;
} }
$elapsed = microtime(true) - $start; $elapsed = microtime(true) - $start;
$timeout-= $elapsed; $this->curTimeout-= $elapsed;
if ($timeout <= 0) { if ($this->curTimeout <= 0) {
user_error("Cannot connect to $host. Timeout error"); $this->is_timeout = true;
return false;
}
$read = array($this->fsock);
$write = $except = null;
$sec = floor($timeout);
$usec = 1000000 * ($timeout - $sec);
// on windows this returns a "Warning: Invalid CRT parameters detected" error
// the !count() is done as a workaround for <https://bugs.php.net/42682>
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
user_error("Cannot connect to $host. Banner timeout");
return false; return false;
} }
@ -992,6 +965,27 @@ class SSH2
$extra.= $temp; $extra.= $temp;
$temp = ''; $temp = '';
} }
if ($this->curTimeout) {
if ($this->curTimeout < 0) {
$this->is_timeout = true;
return false;
}
$read = array($this->fsock);
$write = $except = null;
$start = microtime(true);
$sec = floor($this->curTimeout);
$usec = 1000000 * ($this->curTimeout - $sec);
// on windows this returns a "Warning: Invalid CRT parameters detected" error
// the !count() is done as a workaround for <https://bugs.php.net/42682>
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
$this->is_timeout = true;
return false;
}
$elapsed = microtime(true) - $start;
$this->curTimeout-= $elapsed;
}
$temp.= fgets($this->fsock, 255); $temp.= fgets($this->fsock, 255);
} }