[ostree] checkout: fchown symlink to proper uid/gid



commit bb82c17701ad36bd6a408a8212164d42f70f65fb
Author: Alexander Larsson <alexl redhat com>
Date:   Thu Dec 4 20:19:09 2014 +0100

    checkout: fchown symlink to proper uid/gid
    
    When commiting a symlink we do store the uid/gid of the actual
    symlink (i.e. not target). However, this was not restored
    on non-user-mode checkout as it should.
    
    This commit fixes that, and additionally it ensures xattrs
    on symlinks are not set in user-mode checkout.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=741125

 src/libostree/ostree-repo-checkout.c |   22 +++++++++++++++++-----
 1 files changed, 17 insertions(+), 5 deletions(-)
---
diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c
index 03efd60..29243d5 100644
--- a/src/libostree/ostree-repo-checkout.c
+++ b/src/libostree/ostree-repo-checkout.c
@@ -189,12 +189,24 @@ checkout_file_from_input_at (OstreeRepoCheckoutMode mode,
           ot_util_set_error_from_errno (error, errno);
           goto out;
         }
-          
-      if (xattrs)
+
+      if (mode != OSTREE_REPO_CHECKOUT_MODE_USER)
         {
-          if (!gs_dfd_and_name_set_all_xattrs (destination_dfd, destination_name,
-                                               xattrs, cancellable, error))
-            goto out;
+          if (G_UNLIKELY (fchownat (destination_dfd, destination_name,
+                                    g_file_info_get_attribute_uint32 (file_info, "unix::uid"),
+                                    g_file_info_get_attribute_uint32 (file_info, "unix::gid"),
+                                    AT_SYMLINK_NOFOLLOW) == -1))
+            {
+              ot_util_set_error_from_errno (error, errno);
+              goto out;
+            }
+
+          if (xattrs)
+            {
+              if (!gs_dfd_and_name_set_all_xattrs (destination_dfd, destination_name,
+                                                   xattrs, cancellable, error))
+                goto out;
+            }
         }
     }
   else if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]