Check directory entry names for invalid characters.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
        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);
+}
 
 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__ */
 
                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)