- sftp: fix crash on unmount
This commit is contained in:
parent
3f4ce1d31a
commit
3c4d88b8be
114
gvfs-1.5.4-sftp-unmount.patch
Normal file
114
gvfs-1.5.4-sftp-unmount.patch
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
From f06989be68a60215b66376210bd367507c7b5c3c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tomas Bzatek <tbzatek@redhat.com>
|
||||||
|
Date: Mon, 15 Feb 2010 13:57:33 +0000
|
||||||
|
Subject: sftp: Cancel all pending reads in reply_stream on unmount
|
||||||
|
|
||||||
|
Close the active read_reply_async() channel waiting for input from the sftp process.
|
||||||
|
---
|
||||||
|
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
|
||||||
|
index 6b618ea..659ed93 100644
|
||||||
|
--- a/daemon/gvfsbackendsftp.c
|
||||||
|
+++ b/daemon/gvfsbackendsftp.c
|
||||||
|
@@ -161,6 +161,8 @@ struct _GVfsBackendSftp
|
||||||
|
GInputStream *reply_stream;
|
||||||
|
GDataInputStream *error_stream;
|
||||||
|
|
||||||
|
+ GCancellable *reply_stream_cancellable;
|
||||||
|
+
|
||||||
|
guint32 current_id;
|
||||||
|
|
||||||
|
/* Output Queue */
|
||||||
|
@@ -254,6 +256,9 @@ g_vfs_backend_sftp_finalize (GObject *object)
|
||||||
|
if (backend->command_stream)
|
||||||
|
g_object_unref (backend->command_stream);
|
||||||
|
|
||||||
|
+ if (backend->reply_stream_cancellable)
|
||||||
|
+ g_object_unref (backend->reply_stream_cancellable);
|
||||||
|
+
|
||||||
|
if (backend->reply_stream)
|
||||||
|
g_object_unref (backend->reply_stream);
|
||||||
|
|
||||||
|
@@ -1216,6 +1221,13 @@ read_reply_async_got_len (GObject *source_object,
|
||||||
|
error = NULL;
|
||||||
|
res = g_input_stream_read_finish (G_INPUT_STREAM (source_object), result, &error);
|
||||||
|
|
||||||
|
+ /* Bail out if cancelled */
|
||||||
|
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||||
|
+ {
|
||||||
|
+ g_object_unref (backend);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
check_input_stream_read_result (backend, res, error);
|
||||||
|
|
||||||
|
backend->reply_size_read += res;
|
||||||
|
@@ -1224,7 +1236,8 @@ read_reply_async_got_len (GObject *source_object,
|
||||||
|
{
|
||||||
|
g_input_stream_read_async (backend->reply_stream,
|
||||||
|
&backend->reply_size + backend->reply_size_read, 4 - backend->reply_size_read,
|
||||||
|
- 0, NULL, read_reply_async_got_len, backend);
|
||||||
|
+ 0, backend->reply_stream_cancellable, read_reply_async_got_len,
|
||||||
|
+ backend);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
backend->reply_size = GUINT32_FROM_BE (backend->reply_size);
|
||||||
|
@@ -1242,7 +1255,9 @@ read_reply_async (GVfsBackendSftp *backend)
|
||||||
|
backend->reply_size_read = 0;
|
||||||
|
g_input_stream_read_async (backend->reply_stream,
|
||||||
|
&backend->reply_size, 4,
|
||||||
|
- 0, NULL, read_reply_async_got_len, backend);
|
||||||
|
+ 0, backend->reply_stream_cancellable,
|
||||||
|
+ read_reply_async_got_len,
|
||||||
|
+ backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void send_command (GVfsBackendSftp *backend);
|
||||||
|
@@ -1595,6 +1610,7 @@ do_mount (GVfsBackend *backend,
|
||||||
|
}
|
||||||
|
|
||||||
|
op_backend->reply_stream = g_unix_input_stream_new (stdout_fd, TRUE);
|
||||||
|
+ op_backend->reply_stream_cancellable = g_cancellable_new ();
|
||||||
|
|
||||||
|
make_fd_nonblocking (stderr_fd);
|
||||||
|
is = g_unix_input_stream_new (stderr_fd, TRUE);
|
||||||
|
@@ -1641,7 +1657,7 @@ do_mount (GVfsBackend *backend,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- read_reply_async (op_backend);
|
||||||
|
+ read_reply_async (g_object_ref (op_backend));
|
||||||
|
|
||||||
|
sftp_mount_spec = g_mount_spec_new ("sftp");
|
||||||
|
if (op_backend->user_specified_in_uri)
|
||||||
|
@@ -1738,6 +1754,21 @@ try_mount (GVfsBackend *backend,
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+try_unmount (GVfsBackend *backend,
|
||||||
|
+ GVfsJobUnmount *job,
|
||||||
|
+ GMountUnmountFlags flags,
|
||||||
|
+ GMountSource *mount_source)
|
||||||
|
+{
|
||||||
|
+ GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
|
||||||
|
+
|
||||||
|
+ if (op_backend->reply_stream && op_backend->reply_stream_cancellable)
|
||||||
|
+ g_cancellable_cancel (op_backend->reply_stream_cancellable);
|
||||||
|
+ g_vfs_job_succeeded (G_VFS_JOB (job));
|
||||||
|
+
|
||||||
|
+ return TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
io_error_code_for_sftp_error (guint32 code, int failure_error)
|
||||||
|
{
|
||||||
|
@@ -4664,6 +4695,7 @@ g_vfs_backend_sftp_class_init (GVfsBackendSftpClass *klass)
|
||||||
|
|
||||||
|
backend_class->mount = real_do_mount;
|
||||||
|
backend_class->try_mount = try_mount;
|
||||||
|
+ backend_class->try_unmount = try_unmount;
|
||||||
|
backend_class->try_open_icon_for_read = try_open_icon_for_read;
|
||||||
|
backend_class->try_open_for_read = try_open_for_read;
|
||||||
|
backend_class->try_read = try_read;
|
||||||
|
--
|
||||||
|
cgit v0.8.3.1
|
11
gvfs.spec
11
gvfs.spec
@ -1,7 +1,7 @@
|
|||||||
Summary: Backends for the gio framework in GLib
|
Summary: Backends for the gio framework in GLib
|
||||||
Name: gvfs
|
Name: gvfs
|
||||||
Version: 1.5.3
|
Version: 1.5.3
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
Group: System Environment/Libraries
|
Group: System Environment/Libraries
|
||||||
URL: http://www.gtk.org
|
URL: http://www.gtk.org
|
||||||
@ -35,6 +35,11 @@ BuildRequires: libtool
|
|||||||
|
|
||||||
# http://bugzilla.gnome.org/show_bug.cgi?id=567235
|
# http://bugzilla.gnome.org/show_bug.cgi?id=567235
|
||||||
Patch0: gvfs-archive-integration.patch
|
Patch0: gvfs-archive-integration.patch
|
||||||
|
|
||||||
|
# gvfsd-sftp crashes on unmount
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=557548
|
||||||
|
Patch1: gvfs-1.5.4-sftp-unmount.patch
|
||||||
|
|
||||||
# Recognize gphoto2 cameras which don't implement get storageinfo
|
# Recognize gphoto2 cameras which don't implement get storageinfo
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=552856
|
# https://bugzilla.redhat.com/show_bug.cgi?id=552856
|
||||||
Patch15: gvfs-1.5.1-gphoto2-no-storageinfo-support.patch
|
Patch15: gvfs-1.5.1-gphoto2-no-storageinfo-support.patch
|
||||||
@ -134,6 +139,7 @@ including phones and music players to applications using gvfs.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1 -b .archive-integration
|
%patch0 -p1 -b .archive-integration
|
||||||
|
%patch1 -p1 -b .sftp-unmount
|
||||||
%patch15 -p1 -b .gphoto2-storageinfo
|
%patch15 -p1 -b .gphoto2-storageinfo
|
||||||
|
|
||||||
|
|
||||||
@ -315,6 +321,9 @@ killall -USR1 gvfsd >&/dev/null || :
|
|||||||
%{_datadir}/gvfs/remote-volume-monitors/afc.monitor
|
%{_datadir}/gvfs/remote-volume-monitors/afc.monitor
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Feb 15 2010 Tomas Bzatek <tbzatek@redhat.com> - 1.5.3-2
|
||||||
|
- sftp: fix crash on unmount
|
||||||
|
|
||||||
* Tue Feb 9 2010 Tomas Bzatek <tbzatek@redhat.com> - 1.5.3-1
|
* Tue Feb 9 2010 Tomas Bzatek <tbzatek@redhat.com> - 1.5.3-1
|
||||||
- Update to 1.5.3
|
- Update to 1.5.3
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user