mirror of
https://github.com/curl/curl.git
synced 2026-05-30 06:57:28 +03:00
ssh: loop the state machine if not done and not blocking
If the state machine isn't complete, didn't fail and it didn't return due to blocking it can just as well loop again. This addresses the problem with SFTP directory listings where we would otherwise return back to the parent and as the multi state machine doesn't have any code for using CURLM_CALL_MULTI_PERFORM for as long the doing phase isn't complete, it would return out when in reality there was more data to deal with. Fixes #3506 Closes #3644
This commit is contained in:
parent
b0972bc8e1
commit
d6f73af730
1 changed files with 7 additions and 4 deletions
11
lib/ssh.c
11
lib/ssh.c
|
|
@ -81,11 +81,11 @@
|
|||
#include "multiif.h"
|
||||
#include "select.h"
|
||||
#include "warnless.h"
|
||||
#include "curl_path.h"
|
||||
|
||||
/* The last 3 #include files should be in this order */
|
||||
#include "curl_printf.h"
|
||||
#include "curl_memory.h"
|
||||
#include "curl_path.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
#if LIBSSH2_VERSION_NUM >= 0x010206
|
||||
|
|
@ -2789,9 +2789,12 @@ static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
|
|||
CURLcode result = CURLE_OK;
|
||||
bool block; /* we store the status and use that to provide a ssh_getsock()
|
||||
implementation */
|
||||
|
||||
result = ssh_statemach_act(conn, &block);
|
||||
*done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
|
||||
do {
|
||||
result = ssh_statemach_act(conn, &block);
|
||||
*done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
|
||||
/* if there's no error, it isn't done and it didn't EWOULDBLOCK, then
|
||||
try again */
|
||||
} while(!result && !*done && !block);
|
||||
ssh_block2waitfor(conn, block);
|
||||
|
||||
return result;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue