All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sam Sun <samsun1006219@gmail.com>
To: linux-kernel@vger.kernel.org, martin.petersen@oracle.com
Cc: linux-scsi@vger.kernel.org, xrivendell7@gmail.com,
	 Bart Van Assche <bvanassche@acm.org>,
	syzkaller-bugs@googlegroups.com
Subject: [PATCH] drivers: scsi: fix shift-out-of-bounds in sg_build_indirect
Date: Mon, 15 Apr 2024 11:14:18 +0800	[thread overview]
Message-ID: <CAEkJfYNguDt47=KnEUX7tLwx_46ggBx3Oh3-3dAcZxqndL_OWQ@mail.gmail.com> (raw)

The get_order(0) is undefined. If scatter_elem_sz is equal or below
zero, the order returned will be 52, so that PAGE_SHIFT + order is 64,
which is larger than 32 bits int range, causing shift-out-of bound.
scatter_elem_sz equals or below zero is not allowed in the
sg_build_indirect().

UBSAN: shift-out-of-bounds in /home/sy/linux-original/drivers/scsi/sg.c:1902:13
shift exponent 64 is too large for 32-bit type 'int'
CPU: 1 PID: 8078 Comm: syz-executor748 Not tainted 6.7.0-rc7 #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
1.13.0-1ubuntu1.1 04/01/2014
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:88 [inline]
 dump_stack_lvl+0x136/0x150 lib/dump_stack.c:106
 ubsan_epilogue lib/ubsan.c:217 [inline]
 __ubsan_handle_shift_out_of_bounds+0x24b/0x430 lib/ubsan.c:387
 sg_build_indirect.cold+0x1b/0x20 drivers/scsi/sg.c:1902
 sg_build_reserve+0xc4/0x180 drivers/scsi/sg.c:2012
 sg_add_sfp drivers/scsi/sg.c:2194 [inline]
 sg_open+0xde4/0x1810 drivers/scsi/sg.c:350
 chrdev_open+0x269/0x770 fs/char_dev.c:414
 do_dentry_open+0x6d3/0x18d0 fs/open.c:948
 do_open fs/namei.c:3622 [inline]
 path_openat+0x1e1e/0x26d0 fs/namei.c:3779
 do_filp_open+0x1c9/0x410 fs/namei.c:3809
 do_sys_openat2+0x160/0x1c0 fs/open.c:1437
 do_sys_open fs/open.c:1452 [inline]
 __do_sys_openat fs/open.c:1468 [inline]
 __se_sys_openat fs/open.c:1463 [inline]
 __x64_sys_openat+0x140/0x1f0 fs/open.c:1463
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0x40/0x110 arch/x86/entry/common.c:83
 entry_SYSCALL_64_after_hwframe+0x63/0x6b
---[ end trace ]---

Fix it by setting the minimum num to PAGE_SIZE, and change the type of
scatter_elem_sz to uint.

Reported-by: Yue Sun <samsun1006219@gmail.com>
Reported by: xingwei lee <xrivendell7@gmail.com>
Signed-off-by: Yue Sun <samsun1006219@gmail.com>
---
 drivers/scsi/sg.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 9d7b7db75e4b..6199481be585 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1586,7 +1586,7 @@ sg_remove_device(struct device *cl_dev, struct
class_interface *cl_intf)
     kref_put(&sdp->d_ref, sg_device_destroy);
 }

-module_param_named(scatter_elem_sz, scatter_elem_sz, int, S_IRUGO | S_IWUSR);
+module_param_named(scatter_elem_sz, scatter_elem_sz, uint, S_IRUGO | S_IWUSR);
 module_param_named(def_reserved_size, def_reserved_size, int,
            S_IRUGO | S_IWUSR);
 module_param_named(allow_dio, sg_allow_dio, int, S_IRUGO | S_IWUSR);
@@ -1837,7 +1837,7 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd
* sfp, int buff_size)
     if (mx_sc_elems < 0)
         return mx_sc_elems;    /* most likely -ENOMEM */

-    num = scatter_elem_sz;
+    num = max(scatter_elem_sz, PAGE_SIZE);
     if (unlikely(num != scatter_elem_sz_prev)) {
         if (num < PAGE_SIZE) {
             scatter_elem_sz = PAGE_SIZE;
-- 
2.34.1

             reply	other threads:[~2024-04-15  3:14 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-15  3:14 Sam Sun [this message]
2024-04-15 17:26 ` [PATCH] drivers: scsi: fix shift-out-of-bounds in sg_build_indirect Bart Van Assche
2024-04-16  6:32   ` Sam Sun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAEkJfYNguDt47=KnEUX7tLwx_46ggBx3Oh3-3dAcZxqndL_OWQ@mail.gmail.com' \
    --to=samsun1006219@gmail.com \
    --cc=bvanassche@acm.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=syzkaller-bugs@googlegroups.com \
    --cc=xrivendell7@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.