From: Simon Tatham Date: Wed, 15 Feb 2017 21:39:23 +0000 (+0000) Subject: scp_recv_filedata: handle EOF more sensibly. X-Git-Tag: 0.68~12 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=5d852585a1f00f130333d2350627ffb80014d4e2;p=PuTTY.git 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. --- 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");