From 5d852585a1f00f130333d2350627ffb80014d4e2 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Wed, 15 Feb 2017 21:39:23 +0000 Subject: [PATCH] scp_recv_filedata: handle EOF more sensibly. xfer_download_data could return actuallen as either 0 or -1 to indicate EOF. Now it's always 0, and scp_recv_filedata actually checks for that case and reports an error. --- pscp.c | 7 +++++++ sftp.c | 1 + 2 files changed, 8 insertions(+) diff --git a/pscp.c b/pscp.c index 150b5492..f7e09db9 100644 --- a/pscp.c +++ b/pscp.c @@ -1560,6 +1560,13 @@ int scp_recv_filedata(char *data, int len) } if (xfer_download_data(scp_sftp_xfer, &vbuf, &actuallen)) { + if (actuallen <= 0) { + tell_user(stderr, "pscp: %s while reading", + actuallen < 0 ? "error" : "end of file"); + errs++; + sfree(vbuf); + return -1; + } /* * This assertion relies on the fact that the natural * block size used in the xfer manager is at most that diff --git a/sftp.c b/sftp.c index 5685c79e..dbbd7401 100644 --- a/sftp.c +++ b/sftp.c @@ -1226,6 +1226,7 @@ int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin) if ((rr->retlen < 0 && fxp_error_type()==SSH_FX_EOF) || rr->retlen == 0) { xfer->eof = TRUE; + rr->retlen = 0; rr->complete = -1; #ifdef DEBUG_DOWNLOAD printf("setting eof\n"); -- 2.45.1