diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2016-06-20 21:53:28 -0400 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2016-06-20 21:53:28 -0400 |
commit | 3f94c441e2c3dea029a46a2326b2170acf2c7713 (patch) | |
tree | ea12867e40eb742cbdf212cc24727b4a1e076df1 | |
parent | 408fd484618c48414eb52c86a48f11794de9a248 (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.h | 25 |
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 | |||
25 | static inline void __init | 30 | static inline void __init |
26 | xfs_check_ondisk_structs(void) | 31 | xfs_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 | ||