diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-04-24 22:46:19 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-04-24 22:46:19 +0200 |
commit | 6cdbc01208dad2113effda008be4f529b424a6d7 (patch) | |
tree | c8fec88adf742c1aad7d48ec194755eea403dcd8 | |
parent | 833903e8ec23977ff8dde0be10717ccec0f85202 (diff) | |
download | libssh-6cdbc01208dad2113effda008be4f529b424a6d7.tar.gz libssh-6cdbc01208dad2113effda008be4f529b424a6d7.tar.xz libssh-6cdbc01208dad2113effda008be4f529b424a6d7.zip |
Fixes infinite loops
Thanks to Xi Wang for the patches
-rw-r--r-- | examples/sample.c | 8 | ||||
-rw-r--r-- | libssh/auth.c | 3 | ||||
-rw-r--r-- | libssh/auth1.c | 8 |
3 files changed, 11 insertions, 8 deletions
diff --git a/examples/sample.c b/examples/sample.c index c847635..040a2e1 100644 --- a/examples/sample.c +++ b/examples/sample.c @@ -240,7 +240,7 @@ static void select_loop(ssh_session session,ssh_channel channel){ channels[0]=NULL; } if(channels[0]){ - while(channel && channel_is_open(channel) && channel_poll(channel,0)){ + while(channel && channel_is_open(channel) && channel_poll(channel,0)>0){ lus=channel_read_buffer(channel,readbuf,0,0); if(lus==-1){ fprintf(stderr, "Error reading channel: %s\n", @@ -259,7 +259,7 @@ static void select_loop(ssh_session session,ssh_channel channel){ return; } } - while(channel && channel_is_open(channel) && channel_poll(channel,1)){ /* stderr */ + while(channel && channel_is_open(channel) && channel_poll(channel,1)>0){ /* stderr */ lus=channel_read_buffer(channel,readbuf,0,1); if(lus==-1){ fprintf(stderr, "Error reading channel: %s\n", @@ -332,7 +332,7 @@ static void select_loop(ssh_session session,ssh_channel channel){ channels[0]=NULL; } if(outchannels[0]){ - while(channel && channel_is_open(channel) && channel_poll(channel,0)){ + while(channel && channel_is_open(channel) && channel_poll(channel,0)>0){ lus=channel_read(channel,buffer,sizeof(buffer),0); if(lus==-1){ fprintf(stderr, "Error reading channel: %s\n", @@ -351,7 +351,7 @@ static void select_loop(ssh_session session,ssh_channel channel){ return; } } - while(channel && channel_is_open(channel) && channel_poll(channel,1)){ /* stderr */ + while(channel && channel_is_open(channel) && channel_poll(channel,1)>0){ /* stderr */ lus=channel_read(channel,buffer,sizeof(buffer),1); if(lus==-1){ fprintf(stderr, "Error reading channel: %s\n", diff --git a/libssh/auth.c b/libssh/auth.c index b0e0e90..3961f78 100644 --- a/libssh/auth.c +++ b/libssh/auth.c @@ -218,7 +218,8 @@ static int wait_auth_status(ssh_session session) { enter_function(); while (session->auth_state == SSH_AUTH_STATE_NONE) { - ssh_handle_packets(session,-1); + if (ssh_handle_packets(session,-1) != SSH_OK) + break; } switch(session->auth_state){ case SSH_AUTH_STATE_ERROR: diff --git a/libssh/auth1.c b/libssh/auth1.c index 3571d76..4154728 100644 --- a/libssh/auth1.c +++ b/libssh/auth1.c @@ -38,7 +38,8 @@ static int wait_auth1_status(ssh_session session) { enter_function(); /* wait for a packet */ while(session->auth_state == SSH_AUTH_STATE_NONE) - ssh_handle_packets(session,-1); + if (ssh_handle_packets(session,-1) != SSH_OK) + break; ssh_log(session,SSH_LOG_PROTOCOL,"Auth state : %d",session->auth_state); leave_function(); switch(session->auth_state) { @@ -57,9 +58,10 @@ void ssh_auth1_handler(ssh_session session, uint8_t type){ ssh_set_error(session,SSH_FATAL,"SSH_SMSG_SUCCESS or FAILED received in wrong state"); return; } - if(type==SSH_SMSG_SUCCESS) + if(type==SSH_SMSG_SUCCESS){ session->auth_state=SSH_AUTH_STATE_SUCCESS; - if(type==SSH_SMSG_FAILURE) + session->session_state=SSH_SESSION_STATE_AUTHENTICATED; + } else if(type==SSH_SMSG_FAILURE) session->auth_state=SSH_AUTH_STATE_FAILED; } |