[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Fix ssh_event_add_session() when session socket has two pollhandlers
[Thread Prev] | [Thread Next]
- Subject: [PATCH] Fix ssh_event_add_session() when session socket has two pollhandlers
- From: Meng Hourk Tan <mtan@xxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Thu, 29 Mar 2018 09:57:21 +0000
- To: "libssh@xxxxxxxxxx" <libssh@xxxxxxxxxx>
Hello, Here's a patch to fix an issue when moving pollhandlers from a session to a ssh_event object. The issue occurs when session socket has two different pollhandler (for poll_in and poll_out, when using proxycommand in my case), only the poll_in was moved and poll_out was still in session poll context due to a side effect in ssh_poll_ctx_remove(). This patch fix the loop in ssh_event_add_session(). Regards, Meng
From 0d584e2453d0f9f296545e5b303413afb4bcb2f1 Mon Sep 17 00:00:00 2001
From: Meng Tan <mtan@xxxxxxxxxx>
Date: Thu, 29 Mar 2018 11:34:54 +0200
Subject: [PATCH] Fix ssh_event_add_session() when session socket has two
pollhandlers
Signed-off-by: Meng Tan <mtan@xxxxxxxxxx>
---
src/poll.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/poll.c b/src/poll.c
index c698c13f..134b5e3d 100644
--- a/src/poll.c
+++ b/src/poll.c
@@ -812,7 +812,6 @@ 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;
@@ -824,8 +823,11 @@ int ssh_event_add_session(ssh_event event, ssh_session session) {
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 +963,19 @@ 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
--
2.11.0
Archive administrator: postmaster@lists.cynapses.org