0002-admin-Add-query_info_on_read-write-functionality.patch 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. From 5cd76d627f4d1982b6e77a0e271ef9301732d09e Mon Sep 17 00:00:00 2001
  2. From: Ondrej Holy <oholy@redhat.com>
  3. Date: Thu, 23 May 2019 10:24:36 +0200
  4. Subject: [PATCH] admin: Add query_info_on_read/write functionality
  5. Admin backend doesn't implement query_info_on_read/write which might
  6. potentially lead to some race conditions which aren't really wanted
  7. especially in case of admin backend. Let's add this missing functionality.
  8. [Retrieved fom:
  9. https://gitlab.gnome.org/GNOME/gvfs/commit/5cd76d627f4d1982b6e77a0e271ef9301732d09e]
  10. Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
  11. ---
  12. daemon/gvfsbackendadmin.c | 79 +++++++++++++++++++++++++++++++++------
  13. 1 file changed, 67 insertions(+), 12 deletions(-)
  14. diff --git a/daemon/gvfsbackendadmin.c b/daemon/gvfsbackendadmin.c
  15. index 65a979e7..23d16f16 100644
  16. --- a/daemon/gvfsbackendadmin.c
  17. +++ b/daemon/gvfsbackendadmin.c
  18. @@ -42,6 +42,8 @@
  19. #include "gvfsjobopenforwrite.h"
  20. #include "gvfsjobqueryattributes.h"
  21. #include "gvfsjobqueryinfo.h"
  22. +#include "gvfsjobqueryinforead.h"
  23. +#include "gvfsjobqueryinfowrite.h"
  24. #include "gvfsjobread.h"
  25. #include "gvfsjobseekread.h"
  26. #include "gvfsjobseekwrite.h"
  27. @@ -155,6 +157,19 @@ complete_job (GVfsJob *job,
  28. g_vfs_job_succeeded (job);
  29. }
  30. +static void
  31. +fix_file_info (GFileInfo *info)
  32. +{
  33. + /* Override read/write flags, since the above call will use access()
  34. + * to determine permissions, which does not honor our privileged
  35. + * capabilities.
  36. + */
  37. + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ, TRUE);
  38. + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, TRUE);
  39. + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, TRUE);
  40. + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, TRUE);
  41. +}
  42. +
  43. static void
  44. do_query_info (GVfsBackend *backend,
  45. GVfsJobQueryInfo *query_info_job,
  46. @@ -180,19 +195,57 @@ do_query_info (GVfsBackend *backend,
  47. if (error != NULL)
  48. goto out;
  49. - /* Override read/write flags, since the above call will use access()
  50. - * to determine permissions, which does not honor our privileged
  51. - * capabilities.
  52. - */
  53. - g_file_info_set_attribute_boolean (real_info,
  54. - G_FILE_ATTRIBUTE_ACCESS_CAN_READ, TRUE);
  55. - g_file_info_set_attribute_boolean (real_info,
  56. - G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, TRUE);
  57. - g_file_info_set_attribute_boolean (real_info,
  58. - G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, TRUE);
  59. - g_file_info_set_attribute_boolean (real_info,
  60. - G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, TRUE);
  61. + fix_file_info (real_info);
  62. + g_file_info_copy_into (real_info, info);
  63. + g_object_unref (real_info);
  64. +
  65. + out:
  66. + complete_job (job, error);
  67. +}
  68. +
  69. +static void
  70. +do_query_info_on_read (GVfsBackend *backend,
  71. + GVfsJobQueryInfoRead *query_info_job,
  72. + GVfsBackendHandle handle,
  73. + GFileInfo *info,
  74. + GFileAttributeMatcher *matcher)
  75. +{
  76. + GVfsJob *job = G_VFS_JOB (query_info_job);
  77. + GFileInputStream *stream = handle;
  78. + GError *error = NULL;
  79. + GFileInfo *real_info;
  80. +
  81. + real_info = g_file_input_stream_query_info (stream, query_info_job->attributes,
  82. + job->cancellable, &error);
  83. + if (error != NULL)
  84. + goto out;
  85. +
  86. + fix_file_info (real_info);
  87. + g_file_info_copy_into (real_info, info);
  88. + g_object_unref (real_info);
  89. +
  90. + out:
  91. + complete_job (job, error);
  92. +}
  93. +
  94. +static void
  95. +do_query_info_on_write (GVfsBackend *backend,
  96. + GVfsJobQueryInfoWrite *query_info_job,
  97. + GVfsBackendHandle handle,
  98. + GFileInfo *info,
  99. + GFileAttributeMatcher *matcher)
  100. +{
  101. + GVfsJob *job = G_VFS_JOB (query_info_job);
  102. + GFileOutputStream *stream = handle;
  103. + GError *error = NULL;
  104. + GFileInfo *real_info;
  105. +
  106. + real_info = g_file_output_stream_query_info (stream, query_info_job->attributes,
  107. + job->cancellable, &error);
  108. + if (error != NULL)
  109. + goto out;
  110. + fix_file_info (real_info);
  111. g_file_info_copy_into (real_info, info);
  112. g_object_unref (real_info);
  113. @@ -868,6 +921,8 @@ g_vfs_backend_admin_class_init (GVfsBackendAdminClass * klass)
  114. backend_class->mount = do_mount;
  115. backend_class->open_for_read = do_open_for_read;
  116. backend_class->query_info = do_query_info;
  117. + backend_class->query_info_on_read = do_query_info_on_read;
  118. + backend_class->query_info_on_write = do_query_info_on_write;
  119. backend_class->read = do_read;
  120. backend_class->create = do_create;
  121. backend_class->append_to = do_append_to;
  122. --
  123. 2.24.1