aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2016-06-20 21:53:28 -0400
committerDave Chinner <david@fromorbit.com>2016-06-20 21:53:28 -0400
commit3f94c441e2c3dea029a46a2326b2170acf2c7713 (patch)
treeea12867e40eb742cbdf212cc24727b4a1e076df1
parent408fd484618c48414eb52c86a48f11794de9a248 (diff)
xfs: check offsets of variable length structures
Some of the directory/attr structures contain variable-length objects, so the enclosing structure doesn't have a meaningful fixed size at compile time. We can check the offsets of the members before the variable-length member, so do those. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--fs/xfs/xfs_ondisk.h25
1 files changed, 23 insertions, 2 deletions
diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
index 184c44effdd5..027230134098 100644
--- a/fs/xfs/xfs_ondisk.h
+++ b/fs/xfs/xfs_ondisk.h
@@ -22,6 +22,11 @@
22 BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \ 22 BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \
23 #structname ") is wrong, expected " #size) 23 #structname ") is wrong, expected " #size)
24 24
25#define XFS_CHECK_OFFSET(structname, member, off) \
26 BUILD_BUG_ON_MSG(offsetof(structname, member) != (off), \
27 "XFS: offsetof(" #structname ", " #member ") is wrong, " \
28 "expected " #off)
29
25static inline void __init 30static inline void __init
26xfs_check_ondisk_structs(void) 31xfs_check_ondisk_structs(void)
27{ 32{
@@ -75,15 +80,28 @@ xfs_check_ondisk_structs(void)
75 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); 80 XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12);
76 */ 81 */
77 82
83 XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, valuelen, 0);
84 XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, namelen, 2);
85 XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, nameval, 3);
86 XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valueblk, 0);
87 XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valuelen, 4);
88 XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, namelen, 8);
89 XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, name, 9);
78 XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40); 90 XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40);
79 XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8); 91 XFS_CHECK_OFFSET(xfs_attr_shortform_t, hdr.totsize, 0);
92 XFS_CHECK_OFFSET(xfs_attr_shortform_t, hdr.count, 2);
93 XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].namelen, 4);
94 XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].valuelen, 5);
95 XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].flags, 6);
96 XFS_CHECK_OFFSET(xfs_attr_shortform_t, list[0].nameval, 7);
80 XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); 97 XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12);
81 XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); 98 XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16);
82 XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); 99 XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8);
83 XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16); 100 XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16);
84 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4); 101 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4);
85 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16); 102 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16);
86 XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t, 6); 103 XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, freetag, 0);
104 XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, length, 2);
87 XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16); 105 XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16);
88 XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16); 106 XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16);
89 XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4); 107 XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4);
@@ -94,6 +112,9 @@ xfs_check_ondisk_structs(void)
94 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16); 112 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16);
95 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4); 113 XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4);
96 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3); 114 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3);
115 XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, namelen, 0);
116 XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, offset, 1);
117 XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, name, 3);
97 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10); 118 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10);
98 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2); 119 XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2);
99 120