From e005fd310f614fdedc1f5ac69843d5d41acf0b42 Mon Sep 17 00:00:00 2001 From: Meng Tan Date: Thu, 29 Mar 2018 11:34:54 +0200 Subject: Fix ssh_event_add_session() when session socket has two pollhandlers Signed-off-by: Meng Tan Reviewed-by: Andreas Schneider --- src/poll.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/poll.c b/src/poll.c index c698c13f..8872aa3c 100644 --- a/src/poll.c +++ b/src/poll.c @@ -812,20 +812,23 @@ void ssh_event_remove_poll(ssh_event event, ssh_poll_handle p) * SSH_ERROR on failure */ int ssh_event_add_session(ssh_event event, ssh_session session) { - unsigned int i; ssh_poll_handle p; #ifdef WITH_SERVER struct ssh_iterator *iterator; #endif - + if(event == NULL || event->ctx == NULL || session == NULL) { return SSH_ERROR; } if(session->default_poll_ctx == NULL) { return SSH_ERROR; } - for(i = 0; i < session->default_poll_ctx->polls_used; i++) { - p = session->default_poll_ctx->pollptrs[i]; + while (session->default_poll_ctx->polls_used > 0) { + p = session->default_poll_ctx->pollptrs[0]; + /* + * ssh_poll_ctx_remove() decrements + * session->default_poll_ctx->polls_used + */ ssh_poll_ctx_remove(session->default_poll_ctx, p); ssh_poll_ctx_add(event->ctx, p); /* associate the pollhandler with a session so we can put it back @@ -961,11 +964,21 @@ int ssh_event_remove_session(ssh_event event, ssh_session session) { for(i = 0; i < used; i++) { p = event->ctx->pollptrs[i]; if(p->session == session){ + /* + * ssh_poll_ctx_remove() decrements + * event->ctx->polls_used + */ ssh_poll_ctx_remove(event->ctx, p); p->session = NULL; ssh_poll_ctx_add(session->default_poll_ctx, p); rc = SSH_OK; - used = 0; + /* + * Restart the loop! + * A session can initially have two pollhandlers. + */ + used = event->ctx->polls_used; + i = 0; + } } #ifdef WITH_SERVER -- cgit v1.2.3