diff options
| author | Giorgi Kobakhia <gkobakhi@asu.edu> | 2026-09-28 13:04:45 -0700 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2026-10-02 12:54:49 +0200 |
| commit | 0f242ca0878896df30292f4922700a32e8fdd039 (patch) | |
| tree | d2466d8631fbc8b1b3bbcfa5d3d116ee64df93c8 /include/uapi/linux/errqueue.h | |
| parent | e646566b4ad537286ebee65a55de460003a7bf90 (diff) | |
| download | linux-next-0f242ca0878896df30292f4922700a32e8fdd039.tar.gz linux-next-0f242ca0878896df30292f4922700a32e8fdd039.zip | |
udf: fix return value for non-recorded-allocated extents in udf_map_block()
When someone creates a corrupted UDF filesystem where symlink contains
other extent type than EXT_RECORDED_ALLOCATED, it can leads to a crash
like:
Oops: general protection fault
KASAN: maybe wild-memory-access
RIP: 0010:page_get_link (fs/namei.c:6503)
Call Trace:
vfs_readlink (fs/namei.c:6419)
do_readlinkat (fs/stat.c:583)
__x64_sys_readlink (fs/stat.c:605 fs/stat.c:602 fs/stat.c:602)
This is because in this case udf_map_block() fails to convert return
value of inode_bmap() from 1 to 0. Returned '1' propagates through
udf_bread() all the way up to __page_get_link() where it ends up being
treated as a folio pointer with obvious results.
Move the reset to 0 line outside the if, so udf_map_block() returns either
0 or -errno, even if the extent type is not EXT_RECORDED_ALLOCATED.
Fixes: c226964ec786 ("udf: refactor inode_bmap() to handle error")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Tested-by: Xiang Mei <xmei5@asu.edu>
Signed-off-by: Giorgi Kobakhia <gkobakhi@asu.edu>
Link: https://patch.msgid.link/20260928200445.18722-1-gkobakhi@asu.edu
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'include/uapi/linux/errqueue.h')
0 files changed, 0 insertions, 0 deletions
