diff options
author | Ross Lagerwall <rosslagerwall@gmail.com> | 2015-12-05 14:34:53 +0000 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2015-12-14 14:01:23 +0100 |
commit | 5e65aa2bffc6fc55cd03021f2fcdb64492cc42fe (patch) | |
tree | d79f926f96b305dd4cb4be328dc3e6a70b7d3799 /daemon/gvfsbackendsftp.c | |
parent | f839c18b279bbcb079c6738e3781351f51107c23 (diff) | |
download | gvfs-5e65aa2bffc6fc55cd03021f2fcdb64492cc42fe.tar.gz |
sftp: Fail cancelled jobs
Fail jobs which have been marked as cancelled, otherwise the job remains
and blocks unmounting. This can be reproduced by cancelling while
copying a large file to/from a mount and then trying to unmount it.
https://bugzilla.gnome.org/show_bug.cgi?id=759061
Diffstat (limited to 'daemon/gvfsbackendsftp.c')
-rw-r--r-- | daemon/gvfsbackendsftp.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c index 79b880dd..8982de3a 100644 --- a/daemon/gvfsbackendsftp.c +++ b/daemon/gvfsbackendsftp.c @@ -5202,6 +5202,23 @@ try_set_attribute (GVfsBackend *backend, return TRUE; } +/* Return true if the job is finished or cancelled, failing it if needed. */ +static gboolean +check_finished_or_cancelled_job (GVfsJob *job) +{ + if (g_vfs_job_is_finished (job)) + return TRUE; + + if (g_vfs_job_is_cancelled (job)) + { + g_vfs_job_failed (job, G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("Operation was cancelled")); + return TRUE; + } + + return FALSE; +} + /* The push sliding window mechanism is based on the one in the OpenSSH sftp * client. */ @@ -5464,7 +5481,7 @@ push_source_close_cb (GObject *source, GAsyncResult *res, gpointer user_data) g_input_stream_close_finish (handle->in, res, NULL); g_clear_object (&handle->in); - if (g_vfs_job_is_finished (handle->job) || g_vfs_job_is_cancelled (handle->job)) + if (check_finished_or_cancelled_job (handle->job)) { sftp_push_handle_free (handle); return; @@ -5491,7 +5508,7 @@ push_write_reply (GVfsBackendSftp *backend, handle->num_req--; - if (g_vfs_job_is_finished (job) || g_vfs_job_is_cancelled (job)) + if (check_finished_or_cancelled_job (job)) { sftp_push_handle_free (handle); return; @@ -5541,7 +5558,7 @@ push_read_cb (GObject *source, GAsyncResult *res, gpointer user_data) count = g_input_stream_read_finish (handle->in, res, &error); - if (g_vfs_job_is_finished (handle->job) || g_vfs_job_is_cancelled (handle->job)) + if (check_finished_or_cancelled_job (handle->job)) { g_clear_error (&error); sftp_push_handle_free (handle); @@ -6208,7 +6225,7 @@ pull_read_reply (GVfsBackendSftp *backend, handle->num_req--; - if (g_vfs_job_is_finished (job) || g_vfs_job_is_cancelled (job)) + if (check_finished_or_cancelled_job (job)) { } else if (reply_type == SSH_FXP_STATUS) @@ -6290,7 +6307,7 @@ pull_fstat_reply (GVfsBackendSftp *backend, { SftpPullHandle *handle = user_data; - if (g_vfs_job_is_finished (job) || g_vfs_job_is_cancelled (job)) + if (check_finished_or_cancelled_job (job)) { handle->size = PULL_SIZE_INVALID; sftp_pull_handle_free (handle); |