]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxfs: enforce metadata inode flag
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:12 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:25 +0000 (18:01 -0800)
Add checks for the metadata inode flag so that we don't ever leak
metadata inodes out to userspace, and we don't ever try to read a
regular inode as metadata.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
libxfs/inode.c

index 1eb0bccae48906f6539b76eae75be5b23d609529..0598a70ff504a465f031f8d27a6c511528808c3f 100644 (file)
@@ -208,7 +208,8 @@ out_destroy:
 /*
  * Get a metadata inode.
  *
- * The metafile type must match the file mode exactly.
+ * The metafile type must match the file mode exactly, and for files in the
+ * metadata directory tree, it must match the inode's metatype exactly.
  */
 int
 libxfs_trans_metafile_iget(
@@ -232,6 +233,12 @@ libxfs_trans_metafile_iget(
                mode = S_IFREG;
        if (inode_wrong_type(VFS_I(ip), mode))
                goto bad_rele;
+       if (xfs_has_metadir(mp)) {
+               if (!xfs_is_metadir_inode(ip))
+                       goto bad_rele;
+               if (metafile_type != ip->i_metatype)
+                       goto bad_rele;
+       }
 
        *ipp = ip;
        return 0;