diff options
author | Carlos Garcia Campos <carlosgc@gnome.org> | 2008-03-25 17:35:33 +0000 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@src.gnome.org> | 2008-03-25 17:35:33 +0000 |
commit | e44ed7d11c34d2828678bcf5edd4e66518004202 (patch) | |
tree | fad8e2ecb11f22366b3f09e314d434b18932a51c | |
parent | 9a77824388efda2165a676eb1aac197a5ead56c0 (diff) | |
download | gvfs-e44ed7d11c34d2828678bcf5edd4e66518004202.tar.gz |
Do not create new read/write jobs if the gvfschannel has been cancelled.
2008-03-25 Carlos Garcia Campos <carlosgc@gnome.org>
* daemon/gvfschannel.c: (got_request), (send_reply_cb):
Do not create new read/write jobs if the gvfschannel has been
cancelled. Fixes a crash in sftp backend (#522192).
svn path=/trunk/; revision=1679
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | daemon/gvfschannel.c | 9 |
2 files changed, 13 insertions, 2 deletions
@@ -1,3 +1,9 @@ +2008-03-25 Carlos Garcia Campos <carlosgc@gnome.org> + + * daemon/gvfschannel.c: (got_request), (send_reply_cb): + Do not create new read/write jobs if the gvfschannel has been + cancelled. Fixes a crash in sftp backend (#522192). + 2008-03-25 Paolo Borelli <pborelli@katamail.com> * daemon/gvfsbackendtrash.c (add_extra_trash_info): diff --git a/daemon/gvfschannel.c b/daemon/gvfschannel.c index 94b1667c..01c40e67 100644 --- a/daemon/gvfschannel.c +++ b/daemon/gvfschannel.c @@ -84,6 +84,7 @@ struct _GVfsChannelPrivate GInputStream *command_stream; GOutputStream *reply_stream; int remote_fd; + gboolean cancelled; GVfsBackendHandle backend_handle; GVfsJob *current_job; @@ -340,7 +341,8 @@ got_request (GVfsChannel *channel, command = g_ntohl (request->command); arg1 = g_ntohl (request->arg1); - if (command == G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_CANCEL) + if (command == G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_CANCEL || + channel->priv->cancelled) { if (arg1 == channel->priv->current_job_seq_nr && channel->priv->current_job != NULL) @@ -364,6 +366,8 @@ got_request (GVfsChannel *channel, } } + channel->priv->cancelled = TRUE; + /* Cancel ops get no return */ g_free (data); return; @@ -604,7 +608,8 @@ send_reply_cb (GObject *source_object, g_vfs_job_source_new_job (G_VFS_JOB_SOURCE (channel), channel->priv->current_job); } /* Start queued request or readahead */ - else if (!start_queued_request (channel) && + else if (!channel->priv->cancelled && + !start_queued_request (channel) && class->readahead) { /* No queued requests, maybe we want to do a readahead call */ |