123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- From 5cd76d627f4d1982b6e77a0e271ef9301732d09e Mon Sep 17 00:00:00 2001
- From: Ondrej Holy <oholy@redhat.com>
- Date: Thu, 23 May 2019 10:24:36 +0200
- Subject: [PATCH] admin: Add query_info_on_read/write functionality
- Admin backend doesn't implement query_info_on_read/write which might
- potentially lead to some race conditions which aren't really wanted
- especially in case of admin backend. Let's add this missing functionality.
- [Retrieved fom:
- https://gitlab.gnome.org/GNOME/gvfs/commit/5cd76d627f4d1982b6e77a0e271ef9301732d09e]
- Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
- ---
- daemon/gvfsbackendadmin.c | 79 +++++++++++++++++++++++++++++++++------
- 1 file changed, 67 insertions(+), 12 deletions(-)
- diff --git a/daemon/gvfsbackendadmin.c b/daemon/gvfsbackendadmin.c
- index 65a979e7..23d16f16 100644
- --- a/daemon/gvfsbackendadmin.c
- +++ b/daemon/gvfsbackendadmin.c
- @@ -42,6 +42,8 @@
- #include "gvfsjobopenforwrite.h"
- #include "gvfsjobqueryattributes.h"
- #include "gvfsjobqueryinfo.h"
- +#include "gvfsjobqueryinforead.h"
- +#include "gvfsjobqueryinfowrite.h"
- #include "gvfsjobread.h"
- #include "gvfsjobseekread.h"
- #include "gvfsjobseekwrite.h"
- @@ -155,6 +157,19 @@ complete_job (GVfsJob *job,
- g_vfs_job_succeeded (job);
- }
-
- +static void
- +fix_file_info (GFileInfo *info)
- +{
- + /* Override read/write flags, since the above call will use access()
- + * to determine permissions, which does not honor our privileged
- + * capabilities.
- + */
- + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ, TRUE);
- + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, TRUE);
- + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, TRUE);
- + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, TRUE);
- +}
- +
- static void
- do_query_info (GVfsBackend *backend,
- GVfsJobQueryInfo *query_info_job,
- @@ -180,19 +195,57 @@ do_query_info (GVfsBackend *backend,
- if (error != NULL)
- goto out;
-
- - /* Override read/write flags, since the above call will use access()
- - * to determine permissions, which does not honor our privileged
- - * capabilities.
- - */
- - g_file_info_set_attribute_boolean (real_info,
- - G_FILE_ATTRIBUTE_ACCESS_CAN_READ, TRUE);
- - g_file_info_set_attribute_boolean (real_info,
- - G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, TRUE);
- - g_file_info_set_attribute_boolean (real_info,
- - G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, TRUE);
- - g_file_info_set_attribute_boolean (real_info,
- - G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, TRUE);
- + fix_file_info (real_info);
- + g_file_info_copy_into (real_info, info);
- + g_object_unref (real_info);
- +
- + out:
- + complete_job (job, error);
- +}
- +
- +static void
- +do_query_info_on_read (GVfsBackend *backend,
- + GVfsJobQueryInfoRead *query_info_job,
- + GVfsBackendHandle handle,
- + GFileInfo *info,
- + GFileAttributeMatcher *matcher)
- +{
- + GVfsJob *job = G_VFS_JOB (query_info_job);
- + GFileInputStream *stream = handle;
- + GError *error = NULL;
- + GFileInfo *real_info;
- +
- + real_info = g_file_input_stream_query_info (stream, query_info_job->attributes,
- + job->cancellable, &error);
- + if (error != NULL)
- + goto out;
- +
- + fix_file_info (real_info);
- + g_file_info_copy_into (real_info, info);
- + g_object_unref (real_info);
- +
- + out:
- + complete_job (job, error);
- +}
- +
- +static void
- +do_query_info_on_write (GVfsBackend *backend,
- + GVfsJobQueryInfoWrite *query_info_job,
- + GVfsBackendHandle handle,
- + GFileInfo *info,
- + GFileAttributeMatcher *matcher)
- +{
- + GVfsJob *job = G_VFS_JOB (query_info_job);
- + GFileOutputStream *stream = handle;
- + GError *error = NULL;
- + GFileInfo *real_info;
- +
- + real_info = g_file_output_stream_query_info (stream, query_info_job->attributes,
- + job->cancellable, &error);
- + if (error != NULL)
- + goto out;
-
- + fix_file_info (real_info);
- g_file_info_copy_into (real_info, info);
- g_object_unref (real_info);
-
- @@ -868,6 +921,8 @@ g_vfs_backend_admin_class_init (GVfsBackendAdminClass * klass)
- backend_class->mount = do_mount;
- backend_class->open_for_read = do_open_for_read;
- backend_class->query_info = do_query_info;
- + backend_class->query_info_on_read = do_query_info_on_read;
- + backend_class->query_info_on_write = do_query_info_on_write;
- backend_class->read = do_read;
- backend_class->create = do_create;
- backend_class->append_to = do_append_to;
- --
- 2.24.1
|