]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: check directory name validity
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 1 Feb 2019 17:08:54 +0000 (09:08 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 12 Feb 2019 00:06:40 +0000 (16:06 -0800)
Check directory entry names for invalid characters.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/libxfs/xfs_dir2.c
fs/xfs/libxfs/xfs_dir2.h
fs/xfs/scrub/dir.c

index 229152cd1a246f34bf9237572a4680bd13093ab7..156ce95c9c4545de6b03cd638463e23f7fa4746e 100644 (file)
@@ -703,3 +703,20 @@ xfs_dir2_shrink_inode(
        xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
        return 0;
 }
+
+/* Returns true if the directory entry name is valid. */
+bool
+xfs_dir2_namecheck(
+       const void      *name,
+       size_t          length)
+{
+       /*
+        * MAXNAMELEN includes the trailing null, but (name/length) leave it
+        * out, so use >= for the length check.
+        */
+       if (length >= MAXNAMELEN)
+               return false;
+
+       /* There shouldn't be any slashes or nulls here */
+       return !memchr(name, '/', length) && !memchr(name, 0, length);
+}
index c3e3f6b813d869cb2f7a78bebc3b2a5765ab58ed..f542447794928e47c9eba683690866e105506aaa 100644 (file)
@@ -326,5 +326,6 @@ xfs_dir2_leaf_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_leaf *lp)
 unsigned char xfs_dir3_get_dtype(struct xfs_mount *mp, uint8_t filetype);
 void *xfs_dir3_data_endp(struct xfs_da_geometry *geo,
                struct xfs_dir2_data_hdr *hdr);
+bool xfs_dir2_namecheck(const void *name, size_t length);
 
 #endif /* __XFS_DIR2_H__ */
index cd3e4d768a18ce2d6466c973dfe891174cc523cf..a38a22785a1a28e6a7a50b533c1103f5caf2ebd0 100644 (file)
@@ -129,6 +129,12 @@ xchk_dir_actor(
                goto out;
        }
 
+       /* Does this name make sense? */
+       if (!xfs_dir2_namecheck(name, namelen)) {
+               xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK, offset);
+               goto out;
+       }
+
        if (!strncmp(".", name, namelen)) {
                /* If this is "." then check that the inum matches the dir. */
                if (xfs_sb_version_hasftype(&mp->m_sb) && type != DT_DIR)