]> andersk Git - openssh.git/commitdiff
- djm@cvs.openbsd.org 2008/01/21 19:20:17
authordjm <djm>
Sun, 10 Feb 2008 11:27:24 +0000 (11:27 +0000)
committerdjm <djm>
Sun, 10 Feb 2008 11:27:24 +0000 (11:27 +0000)
     [sftp-client.c]
     when a remote write error occurs during an upload, ensure that ACKs for
     all issued requests are properly drained. patch from t8m AT centrum.cz

ChangeLog
sftp-client.c

index b6cc9c526f331f6eb209e0bebb5944d1c94737c8..9928c3b55eee5133b2ebebfd2438d3cdcc4d1024 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
      Remove the fixed 100 handle limit in sftp-server and allocate as many
      as we have available file descriptors. Patch from miklos AT szeredi.hu;
      ok dtucker@ markus@
+   - djm@cvs.openbsd.org 2008/01/21 19:20:17
+     [sftp-client.c]
+     when a remote write error occurs during an upload, ensure that ACKs for
+     all issued requests are properly drained. patch from t8m AT centrum.cz
 
 20080119
  - (djm) Silence noice from expr in ssh-copy-id; patch from
index e8cdb96ac8b271a75dc420f8088f1a9f8690948e..b189422d44c67fc6b143dce06bb15b55f3bce1e9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-client.c,v 1.79 2008/01/19 22:04:57 djm Exp $ */
+/* $OpenBSD: sftp-client.c,v 1.80 2008/01/21 19:20:17 djm Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
@@ -997,7 +997,8 @@ int
 do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
     int pflag)
 {
-       int local_fd, status;
+       int local_fd;
+       int status = SSH2_FX_OK;
        u_int handle_len, id, type;
        off_t offset;
        char *handle, *data;
@@ -1059,7 +1060,7 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
        if (handle == NULL) {
                close(local_fd);
                buffer_free(&msg);
-               return(-1);
+               return -1;
        }
 
        startid = ackid = id + 1;
@@ -1079,7 +1080,7 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
                 * Simulate an EOF on interrupt, allowing ACKs from the
                 * server to drain.
                 */
-               if (interrupted)
+               if (interrupted || status != SSH2_FX_OK)
                        len = 0;
                else do
                        len = read(local_fd, data, conn->transfer_buflen);
@@ -1135,19 +1136,6 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
                        if (ack == NULL)
                                fatal("Can't find request for ID %u", r_id);
                        TAILQ_REMOVE(&acks, ack, tq);
-
-                       if (status != SSH2_FX_OK) {
-                               error("Couldn't write to remote file \"%s\": %s",
-                                   remote_path, fx2txt(status));
-                               if (showprogress)
-                                       stop_progress_meter();
-                               do_close(conn, handle, handle_len);
-                               close(local_fd);
-                               xfree(data);
-                               xfree(ack);
-                               status = -1;
-                               goto done;
-                       }
                        debug3("In write loop, ack for %u %u bytes at %lld",
                            ack->id, ack->len, (long long)ack->offset);
                        ++ackid;
@@ -1157,26 +1145,31 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
                if (offset < 0)
                        fatal("%s: offset < 0", __func__);
        }
+       buffer_free(&msg);
+
        if (showprogress)
                stop_progress_meter();
        xfree(data);
 
+       if (status != SSH2_FX_OK) {
+               error("Couldn't write to remote file \"%s\": %s",
+                   remote_path, fx2txt(status));
+               status = -1;
+       }
+
        if (close(local_fd) == -1) {
                error("Couldn't close local file \"%s\": %s", local_path,
                    strerror(errno));
-               do_close(conn, handle, handle_len);
                status = -1;
-               goto done;
        }
 
        /* Override umask and utimes if asked */
        if (pflag)
                do_fsetstat(conn, handle, handle_len, &a);
 
-       status = do_close(conn, handle, handle_len);
-
-done:
+       if (do_close(conn, handle, handle_len) != SSH2_FX_OK)
+               status = -1;
        xfree(handle);
-       buffer_free(&msg);
-       return(status);
+
+       return status;
 }
This page took 0.049993 seconds and 5 git commands to generate.