lib/core/checksum: add flag to use canonical permissions
authorLuca BRUNO <luca.bruno@coreos.com>
Thu, 19 Aug 2021 13:50:21 +0000 (13:50 +0000)
committerLuca BRUNO <luca.bruno@coreos.com>
Thu, 19 Aug 2021 14:08:36 +0000 (14:08 +0000)
This adds a new `OSTREE_CHECKSUM_FLAGS_CANONICAL_PERMISSIONS`
checksumming flag, which is needed in bare-user-only mode
to ignore local IDs.

src/libostree/ostree-core.c
src/libostree/ostree-core.h

index 6a7c2afad6c19252b127b60420e7c13d58aad4fc..aecaf31aa3501e847e4d63c832f229a9c03275f9 100644 (file)
@@ -984,6 +984,9 @@ ostree_checksum_file_at (int               dfd,
 
   g_autoptr(GFileInfo) file_info = _ostree_stbuf_to_gfileinfo (stbuf);
 
+  const gboolean canonicalize_perms =
+    ((flags & OSTREE_CHECKSUM_FLAGS_CANONICAL_PERMISSIONS) != 0);
+
   g_autoptr(GInputStream) in = NULL;
   if (S_ISREG (stbuf->st_mode))
     {
@@ -991,6 +994,11 @@ ostree_checksum_file_at (int               dfd,
       if (!glnx_openat_rdonly (dfd, path, FALSE, &fd, error))
         return FALSE;
       in = g_unix_input_stream_new (glnx_steal_fd (&fd), TRUE);
+      if (canonicalize_perms)
+        {
+          g_file_info_set_attribute_uint32 (file_info, "unix::uid", 0);
+          g_file_info_set_attribute_uint32 (file_info, "unix::gid", 0);
+        }
     }
   else if (S_ISLNK (stbuf->st_mode))
     {
index 3b903d5cc4cdd9e1528e72e98f7979dcf61d74d6..7dc1ffb7322bd8f41681639b9de47aa3f395d7be 100644 (file)
@@ -460,12 +460,21 @@ gboolean ostree_break_hardlink (int               dfd,
 
 /**
  * OstreeChecksumFlags:
+ * @OSTREE_CHECKSUM_FLAGS_NONE: Default checksumming without tweaks.
+ *    (Since: 2017.13.)
+ * @OSTREE_CHECKSUM_FLAGS_IGNORE_XATTRS: Ignore xattrs when checksumming.
+ *    (Since: 2017.13.)
+ * @OSTREE_CHECKSUM_FLAGS_CANONICAL_PERMISSIONS: Use canonical uid/gid/mode
+ *    values, for bare-user-only mode. (Since: 2021.4.)
+ *
+ * Flags influencing checksumming logic.
  *
  * Since: 2017.13
  */
 typedef enum {
   OSTREE_CHECKSUM_FLAGS_NONE = 0,
   OSTREE_CHECKSUM_FLAGS_IGNORE_XATTRS = (1 << 0),
+  OSTREE_CHECKSUM_FLAGS_CANONICAL_PERMISSIONS = (1 << 1),
 } OstreeChecksumFlags;
 
 _OSTREE_PUBLIC