In the wake of r7415, let's have some better error reporting.
[u/mdw/putty] / psftp.c
diff --git a/psftp.c b/psftp.c
index 2a74bcd..f77a88e 100644 (file)
--- a/psftp.c
+++ b/psftp.c
@@ -128,8 +128,12 @@ char *canonify(char *name)
        assert(rreq == req);
        canonname = fxp_realpath_recv(pktin, rreq);
 
-       if (!canonname)
-           return fullname;           /* even that failed; give up */
+       if (!canonname) {
+           /* Even that failed. Restore our best guess at the
+            * constructed filename and give up */
+           fullname[i] = '/';  /* restore slash and last component */
+           return fullname;
+       }
 
        /*
         * We have a canonical name for all but the last path
@@ -952,7 +956,7 @@ int sftp_cmd_close(struct sftp_command *cmd)
        return 0;
     }
 
-    if (back != NULL && back->socket(backhandle) != NULL) {
+    if (back != NULL && back->connected(backhandle)) {
        char ch;
        back->special(backhandle, TS_EOF);
        sftp_recvdata(&ch, 1);
@@ -2567,7 +2571,7 @@ int sftp_recvdata(char *buf, int len)
     }
 
     while (outlen > 0) {
-       if (ssh_sftp_loop_iteration() < 0)
+       if (back->exitcode(backhandle) >= 0 || ssh_sftp_loop_iteration() < 0)
            return 0;                  /* doom */
     }
 
@@ -2909,7 +2913,7 @@ int psftp_main(int argc, char *argv[])
 
     do_sftp(mode, modeflags, batchfile);
 
-    if (back != NULL && back->socket(backhandle) != NULL) {
+    if (back != NULL && back->connected(backhandle)) {
        char ch;
        back->special(backhandle, TS_EOF);
        sftp_recvdata(&ch, 1);