diff options
| author | Aldo Ariel Panzardo <qwe.aldo@gmail.com> | 2026-09-23 08:57:54 -0300 |
|---|---|---|
| committer | Carlos Maiolino <cem@kernel.org> | 2026-10-08 19:23:39 +0200 |
| commit | 3df5e5aaa3bc0913236c48ab29b7df3a785aa29f (patch) | |
| tree | 80515aa199835886835928e26faedea2d132c951 /tools/lib/python | |
| parent | 9232301894a06e664d8de2da97175cf98419bd16 (diff) | |
| download | linux-next-3df5e5aaa3bc0913236c48ab29b7df3a785aa29f.tar.gz linux-next-3df5e5aaa3bc0913236c48ab29b7df3a785aa29f.zip | |
xfs: bound da-node entry count against the correct geometry
xfs_da3_node_verify() bounds the node entry count against the larger of
the directory and attribute geometries because, as a buffer verifier, it
cannot tell whether the block belongs to the directory or the attribute
tree. When the directory block size exceeds the fs block size (e.g.
mkfs.xfs -n size=64k -b size=4k), an attribute node buffer is a single fs
block that holds only m_attr_geo->node_ents entries, yet a crafted attr
node may claim a count up to m_dir_geo->node_ents and still pass the
verifier.
xfs_da3_node_lookup_int() then indexes btree[] up to that count during
its binary search -- an out-of-bounds read via getxattr/listxattr on a
mounted crafted image.
The buffer verifier is the wrong place to tighten this: it has no fork
context, and the transaction-less read path used by getxattr does not run
xfs_da3_node_set_type() either. xfs_da3_node_lookup_int(), on the other
hand, always runs on that path and holds args->geo, the geometry of the
fork actually being searched. Bound the entry count against
args->geo->node_ents there, before walking the entries.
Fixes: 7ab610f9e0f1 ("xfs: move node entry counts to xfs_da_geometry")
Cc: stable@vger.kernel.org
Signed-off-by: Aldo Ariel Panzardo <qwe.aldo@gmail.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
Diffstat (limited to 'tools/lib/python')
0 files changed, 0 insertions, 0 deletions
