mirror of
https://github.com/phpseclib/phpseclib.git
synced 2025-03-19 16:52:23 +00:00
SSH2: simplify _send_channel_packet
the last _send_channel_packet was unnecessarily complex. this lead to a number of problems. for example, the window size was checked for adjustments in two places. in the second place it receives a window adjustment packet and just assumes that the window adjustment packet was big enough for the rest of the data. (thanks, pixall!)
This commit is contained in:
parent
1698880660
commit
96eb1f3797
@ -3275,27 +3275,23 @@ class Net_SSH2
|
|||||||
*/
|
*/
|
||||||
function _send_channel_packet($client_channel, $data)
|
function _send_channel_packet($client_channel, $data)
|
||||||
{
|
{
|
||||||
/* The maximum amount of data allowed is determined by the maximum
|
while (strlen($data)) {
|
||||||
packet size for the channel, and the current window size, whichever
|
|
||||||
is smaller.
|
|
||||||
|
|
||||||
-- http://tools.ietf.org/html/rfc4254#section-5.2 */
|
|
||||||
$max_size = min(
|
|
||||||
$this->packet_size_client_to_server[$client_channel],
|
|
||||||
$this->window_size_client_to_server[$client_channel]
|
|
||||||
);
|
|
||||||
while (strlen($data) > $max_size) {
|
|
||||||
if (!$this->window_size_client_to_server[$client_channel]) {
|
if (!$this->window_size_client_to_server[$client_channel]) {
|
||||||
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
||||||
// using an invalid channel will let the buffers be built up for the valid channels
|
// using an invalid channel will let the buffers be built up for the valid channels
|
||||||
$output = $this->_get_channel_packet(-1);
|
$this->_get_channel_packet(-1);
|
||||||
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
||||||
$max_size = min(
|
|
||||||
$this->packet_size_client_to_server[$client_channel],
|
|
||||||
$this->window_size_client_to_server[$client_channel]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The maximum amount of data allowed is determined by the maximum
|
||||||
|
packet size for the channel, and the current window size, whichever
|
||||||
|
is smaller.
|
||||||
|
-- http://tools.ietf.org/html/rfc4254#section-5.2 */
|
||||||
|
$max_size = min(
|
||||||
|
$this->packet_size_client_to_server[$client_channel],
|
||||||
|
$this->window_size_client_to_server[$client_channel]
|
||||||
|
);
|
||||||
|
|
||||||
$temp = $this->_string_shift($data, $max_size);
|
$temp = $this->_string_shift($data, $max_size);
|
||||||
$packet = pack('CN2a*',
|
$packet = pack('CN2a*',
|
||||||
NET_SSH2_MSG_CHANNEL_DATA,
|
NET_SSH2_MSG_CHANNEL_DATA,
|
||||||
@ -3303,27 +3299,13 @@ class Net_SSH2
|
|||||||
strlen($temp),
|
strlen($temp),
|
||||||
$temp
|
$temp
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->window_size_client_to_server[$client_channel]-= strlen($temp);
|
$this->window_size_client_to_server[$client_channel]-= strlen($temp);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen($data) >= $this->window_size_client_to_server[$client_channel]) {
|
return true;
|
||||||
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
|
||||||
$this->_get_channel_packet(-1);
|
|
||||||
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->window_size_client_to_server[$client_channel]-= strlen($data);
|
|
||||||
|
|
||||||
return $this->_send_binary_packet(pack('CN2a*',
|
|
||||||
NET_SSH2_MSG_CHANNEL_DATA,
|
|
||||||
$this->server_channels[$client_channel],
|
|
||||||
strlen($data),
|
|
||||||
$data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user