diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-03-01 19:59:06 +0100 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-03-01 20:00:02 +0100 |
commit | e8a1d135e21721426851312dc2a9180e5c38273f (patch) | |
tree | 0a7f6b98690b79a9c91a74025d94058d1ecaf4f0 /libssh/scp.c | |
parent | b707b5e2a477669181ca2ebca7395d28fb0e3087 (diff) | |
download | libssh-e8a1d135e21721426851312dc2a9180e5c38273f.tar.gz libssh-e8a1d135e21721426851312dc2a9180e5c38273f.tar.xz libssh-e8a1d135e21721426851312dc2a9180e5c38273f.zip |
Fix a race condition bug in ssh_scp_close()
Conflicts:
libssh/scp.c
Diffstat (limited to 'libssh/scp.c')
-rw-r--r-- | libssh/scp.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/libssh/scp.c b/libssh/scp.c index a9bd1fd..81c3290 100644 --- a/libssh/scp.c +++ b/libssh/scp.c @@ -26,7 +26,6 @@ #include "libssh/priv.h" #include "libssh/scp.h" - /** @defgroup ssh_scp SSH-scp * @brief SCP protocol over SSH functions * @addtogroup ssh_scp @@ -120,6 +119,8 @@ int ssh_scp_init(ssh_scp scp){ } int ssh_scp_close(ssh_scp scp){ + char buffer[128]; + int err; if(scp==NULL) return SSH_ERROR; if(scp->channel != NULL){ @@ -127,6 +128,15 @@ int ssh_scp_close(ssh_scp scp){ scp->state=SSH_SCP_ERROR; return SSH_ERROR; } + /* avoid situations where data are buffered and + * not yet stored on disk. This can happen if the close is sent + * before we got the EOF back + */ + while(!channel_is_eof(scp->channel)){ + err=channel_read(scp->channel,buffer,sizeof(buffer),0); + if(err==SSH_ERROR) + break; + } if(channel_close(scp->channel) == SSH_ERROR){ scp->state=SSH_SCP_ERROR; return SSH_ERROR; |