mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
The xfer mechanism wasn't gracefully terminating when an error was
encountered part way through transfer. In particular, this caused psftp to hang (waiting for FXP_READ replies which had already arrived) if you try `get' (without -r) on a remote directory. [originally from svn r5005]
This commit is contained in:
parent
cac296d9c0
commit
d649075539
7
psftp.c
7
psftp.c
@ -201,7 +201,7 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart,
|
|||||||
struct fxp_xfer *xfer;
|
struct fxp_xfer *xfer;
|
||||||
uint64 offset;
|
uint64 offset;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int ret;
|
int ret, shown_err = FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In recursive mode, see if we're dealing with a directory.
|
* In recursive mode, see if we're dealing with a directory.
|
||||||
@ -443,7 +443,10 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart,
|
|||||||
ret = xfer_download_gotpkt(xfer, pktin);
|
ret = xfer_download_gotpkt(xfer, pktin);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
printf("error while reading: %s\n", fxp_error());
|
if (!shown_err) {
|
||||||
|
printf("error while reading: %s\n", fxp_error());
|
||||||
|
shown_err = TRUE;
|
||||||
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
sftp.c
5
sftp.c
@ -1089,7 +1089,8 @@ int xfer_done(struct fxp_xfer *xfer)
|
|||||||
|
|
||||||
void xfer_download_queue(struct fxp_xfer *xfer)
|
void xfer_download_queue(struct fxp_xfer *xfer)
|
||||||
{
|
{
|
||||||
while (xfer->req_totalsize < xfer->req_maxsize && !xfer->eof) {
|
while (xfer->req_totalsize < xfer->req_maxsize &&
|
||||||
|
!xfer->eof && !xfer->err) {
|
||||||
/*
|
/*
|
||||||
* Queue a new read request.
|
* Queue a new read request.
|
||||||
*/
|
*/
|
||||||
@ -1155,6 +1156,8 @@ int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin)
|
|||||||
#endif
|
#endif
|
||||||
} else if (rr->retlen < 0) {
|
} else if (rr->retlen < 0) {
|
||||||
/* some error other than EOF; signal it back to caller */
|
/* some error other than EOF; signal it back to caller */
|
||||||
|
xfer_set_error(xfer);
|
||||||
|
rr->complete = -1;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user