From e8a1d135e21721426851312dc2a9180e5c38273f Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Mon, 1 Mar 2010 19:59:06 +0100 Subject: Fix a race condition bug in ssh_scp_close() Conflicts: libssh/scp.c --- libssh/scp.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'libssh') diff --git a/libssh/scp.c b/libssh/scp.c index a9bd1fdc..81c32908 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; -- cgit v1.2.3