[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[patch] ssh_handle_packets_termination() ignores timeout=0
[Thread Prev] | [Thread Next]
- Subject: [patch] ssh_handle_packets_termination() ignores timeout=0
- From: g4-lisz@xxxxxxxxxxxx
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 29 Jan 2019 13:44:20 +0100
- To: libssh@xxxxxxxxxx
Hi there,
I found some logic in ssh_handle_packets_termination() which probably
should be a different:
int ssh_handle_packets_termination(ssh_session session,
long timeout,
ssh_termination_function fct,
void *user)
{
struct ssh_timestamp ts;
long timeout_ms = SSH_TIMEOUT_INFINITE;
long tm;
int ret = SSH_OK;
/* If a timeout has been provided, use it */
if (timeout > 0) {
timeout_ms = timeout;
} else {
if (ssh_is_blocking(session)) {
if (timeout == SSH_TIMEOUT_USER || timeout == SSH_TIMEOUT_DEFAULT) {
if (session->opts.timeout > 0 ||
session->opts.timeout_usec > 0) {
timeout_ms =
ssh_make_milliseconds(session->opts.timeout,
session->opts.timeout_usec);
}
}
} else {
timeout_ms = SSH_TIMEOUT_NONBLOCKING;
}
}
When timout is set to 0, this should actually make the poll return
immediately. But with the logic above this is only granted when the
session is non-blocking. If it's blocking, 0 as timout parameter is
simply ignored and the default SSH_TIMEOUT_INFINITE is used instead.
IMHO it should always return immediately for 0. Its called from within
ssh_channel_poll_timeout(). No one expects here that the functions
blocks for timeout = 0.
For example in connector.c: ssh_connector_set_event() makes use of this:
if (ssh_channel_poll_timeout(connector->in_channel, 0, 0) > 0){
connector->in_available = 1;
}
Under certain circumstances, this blockes for a long time, if there is
no traffic on the channel.
A simple fix is attached: if (timeout >= 0) { timeout_ms = timeout; }
Another fix could be that whenever ssh_channel_poll_timeout() should not
block, we simply use ssh_channel_poll() and set the session to non-blocking:
blocking = ssh_is_blocking(session);
ssh_set_blocking(session, 0);
rc = ssh_channel_poll(...);
ssh_set_blocking(session,blocking);
Then we needed a patch for ssh_connector_set_event() ...
Regards,
Till
From d8a676878b566c7ee81a3bffdbc50680ab89bdca Mon Sep 17 00:00:00 2001
From: Till Wimmer <g4-lisz@xxxxxxxxxxxx>
Date: Tue, 29 Jan 2019 13:03:35 +0100
Subject: [PATCH] ssh_handle_packets_termination() also respects timeout=0 on
blocking sessions
Signed-off-by: Till Wimmer <g4-lisz@xxxxxxxxxxxx>
---
src/session.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/session.c b/src/session.c
index af9201f..3b151bf 100644
--- a/src/session.c
+++ b/src/session.c
@@ -684,7 +684,7 @@ int ssh_handle_packets_termination(ssh_session session,
int ret = SSH_OK;
/* If a timeout has been provided, use it */
- if (timeout > 0) {
+ if (timeout >= 0) {
timeout_ms = timeout;
} else {
if (ssh_is_blocking(session)) {
--
2.7.4
Archive administrator: postmaster@lists.cynapses.org