]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ocfs2: validate l_tree_depth to avoid out-of-bounds access
authorVasiliy Kovalev <kovalev@altlinux.org>
Fri, 14 Feb 2025 08:49:08 +0000 (11:49 +0300)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 06:24:12 +0000 (23:24 -0700)
The l_tree_depth field is 16-bit (__le16), but the actual maximum depth is
limited to OCFS2_MAX_PATH_DEPTH.

Add a check to prevent out-of-bounds access if l_tree_depth has an invalid
value, which may occur when reading from a corrupted mounted disk [1].

Link: https://lkml.kernel.org/r/20250214084908.736528-1-kovalev@altlinux.org
Fixes: ccd979bdbce9 ("[PATCH] OCFS2: The Second Oracle Cluster Filesystem")
Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
Reported-by: syzbot+66c146268dc88f4341fd@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=66c146268dc88f4341fd [1]
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Jun Piao <piaojun@huawei.com>
Cc: Kurt Hackel <kurt.hackel@oracle.com>
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Vasiliy Kovalev <kovalev@altlinux.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/ocfs2/alloc.c

index 4414743b638e82972daab8946b4c4fea4bb7ae7c..b8ac85b548c7e57e8ebde278e861ab6dd980e712 100644 (file)
@@ -1803,6 +1803,14 @@ static int __ocfs2_find_path(struct ocfs2_caching_info *ci,
 
        el = root_el;
        while (el->l_tree_depth) {
+               if (unlikely(le16_to_cpu(el->l_tree_depth) >= OCFS2_MAX_PATH_DEPTH)) {
+                       ocfs2_error(ocfs2_metadata_cache_get_super(ci),
+                                   "Owner %llu has invalid tree depth %u in extent list\n",
+                                   (unsigned long long)ocfs2_metadata_cache_owner(ci),
+                                   le16_to_cpu(el->l_tree_depth));
+                       ret = -EROFS;
+                       goto out;
+               }
                if (le16_to_cpu(el->l_next_free_rec) == 0) {
                        ocfs2_error(ocfs2_metadata_cache_get_super(ci),
                                    "Owner %llu has empty extent list at depth %u\n",