aboutsummaryrefslogtreecommitdiff
path: root/libssh/scp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libssh/scp.c')
-rw-r--r--libssh/scp.c12
1 files changed, 11 insertions, 1 deletions
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;