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