summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2008-03-25 17:35:33 +0000
committerCarlos Garcia Campos <carlosgc@src.gnome.org>2008-03-25 17:35:33 +0000
commite44ed7d11c34d2828678bcf5edd4e66518004202 (patch)
treefad8e2ecb11f22366b3f09e314d434b18932a51c
parent9a77824388efda2165a676eb1aac197a5ead56c0 (diff)
downloadgvfs-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--ChangeLog6
-rw-r--r--daemon/gvfschannel.c9
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 45cef27b..06ac7882 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 */