1. 18 1月, 2021 12 次提交
    • B
      fcntl: Fix potential deadlock in send_sig{io, urg}() · 29e28b88
      Boqun Feng 提交于
      stable inclusion
      from stable-5.10.5
      commit 908030501772553dc8553792d6c97a24000ab04a
      bugzilla: 46931
      
      --------------------------------
      
      commit 8d1ddb5e upstream.
      
      Syzbot reports a potential deadlock found by the newly added recursive
      read deadlock detection in lockdep:
      
      [...] ========================================================
      [...] WARNING: possible irq lock inversion dependency detected
      [...] 5.9.0-rc2-syzkaller #0 Not tainted
      [...] --------------------------------------------------------
      [...] syz-executor.1/10214 just changed the state of lock:
      [...] ffff88811f506338 (&f->f_owner.lock){.+..}-{2:2}, at: send_sigurg+0x1d/0x200
      [...] but this lock was taken by another, HARDIRQ-safe lock in the past:
      [...]  (&dev->event_lock){-...}-{2:2}
      [...]
      [...]
      [...] and interrupts could create inverse lock ordering between them.
      [...]
      [...]
      [...] other info that might help us debug this:
      [...] Chain exists of:
      [...]   &dev->event_lock --> &new->fa_lock --> &f->f_owner.lock
      [...]
      [...]  Possible interrupt unsafe locking scenario:
      [...]
      [...]        CPU0                    CPU1
      [...]        ----                    ----
      [...]   lock(&f->f_owner.lock);
      [...]                                local_irq_disable();
      [...]                                lock(&dev->event_lock);
      [...]                                lock(&new->fa_lock);
      [...]   <Interrupt>
      [...]     lock(&dev->event_lock);
      [...]
      [...]  *** DEADLOCK ***
      
      The corresponding deadlock case is as followed:
      
      	CPU 0		CPU 1		CPU 2
      	read_lock(&fown->lock);
      			spin_lock_irqsave(&dev->event_lock, ...)
      					write_lock_irq(&filp->f_owner.lock); // wait for the lock
      			read_lock(&fown-lock); // have to wait until the writer release
      					       // due to the fairness
      	<interrupted>
      	spin_lock_irqsave(&dev->event_lock); // wait for the lock
      
      The lock dependency on CPU 1 happens if there exists a call sequence:
      
      	input_inject_event():
      	  spin_lock_irqsave(&dev->event_lock,...);
      	  input_handle_event():
      	    input_pass_values():
      	      input_to_handler():
      	        handler->event(): // evdev_event()
      	          evdev_pass_values():
      	            spin_lock(&client->buffer_lock);
      	            __pass_event():
      	              kill_fasync():
      	                kill_fasync_rcu():
      	                  read_lock(&fa->fa_lock);
      	                  send_sigio():
      	                    read_lock(&fown->lock);
      
      To fix this, make the reader in send_sigurg() and send_sigio() use
      read_lock_irqsave() and read_lock_irqrestore().
      
      Reported-by: syzbot+22e87cdf94021b984aa6@syzkaller.appspotmail.com
      Reported-by: syzbot+c5e32344981ad9f33750@syzkaller.appspotmail.com
      Signed-off-by: NBoqun Feng <boqun.feng@gmail.com>
      Signed-off-by: NJeff Layton <jlayton@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      29e28b88
    • T
      ext4: check for invalid block size early when mounting a file system · ac832d34
      Theodore Ts'o 提交于
      stable inclusion
      from stable-5.10.5
      commit 721972b8665f784f6d840d9ef563a8971565c569
      bugzilla: 46931
      
      --------------------------------
      
      commit c9200760 upstream.
      
      Check for valid block size directly by validating s_log_block_size; we
      were doing this in two places.  First, by calculating blocksize via
      BLOCK_SIZE << s_log_block_size, and then checking that the blocksize
      was valid.  And then secondly, by checking s_log_block_size directly.
      
      The first check is not reliable, and can trigger an UBSAN warning if
      s_log_block_size on a maliciously corrupted superblock is greater than
      22.  This is harmless, since the second test will correctly reject the
      maliciously fuzzed file system, but to make syzbot shut up, and
      because the two checks are duplicative in any case, delete the
      blocksize check, and move the s_log_block_size earlier in
      ext4_fill_super().
      Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
      Reported-by: syzbot+345b75652b1d24227443@syzkaller.appspotmail.com
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      ac832d34
    • R
      bfs: don't use WARNING: string when it's just info. · 8428e288
      Randy Dunlap 提交于
      stable inclusion
      from stable-5.10.5
      commit 8ed894f1117e5e1347e059943480265e3f8480e3
      bugzilla: 46931
      
      --------------------------------
      
      commit dc889b8d upstream.
      
      Make the printk() [bfs "printf" macro] seem less severe by changing
      "WARNING:" to "NOTE:".
      
      <asm-generic/bug.h> warns us about using WARNING or BUG in a format string
      other than in WARN() or BUG() family macros.  bfs/inode.c is doing just
      that in a normal printk() call, so change the "WARNING" string to be
      "NOTE".
      
      Link: https://lkml.kernel.org/r/20201203212634.17278-1-rdunlap@infradead.org
      Reported-by: syzbot+3fd34060f26e766536ff@syzkaller.appspotmail.com
      Signed-off-by: NRandy Dunlap <rdunlap@infradead.org>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Al Viro <viro@ZenIV.linux.org.uk>
      Cc: "Tigran A. Aivazian" <aivazian.tigran@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      8428e288
    • C
      f2fs: fix shift-out-of-bounds in sanity_check_raw_super() · 6e3c10be
      Chao Yu 提交于
      stable inclusion
      from stable-5.10.5
      commit 1c5a034710da75d5a422482f5535dda8ab048b60
      bugzilla: 46931
      
      --------------------------------
      
      commit e584bbe8 upstream.
      
      syzbot reported a bug which could cause shift-out-of-bounds issue,
      fix it.
      
      Call Trace:
       __dump_stack lib/dump_stack.c:79 [inline]
       dump_stack+0x107/0x163 lib/dump_stack.c:120
       ubsan_epilogue+0xb/0x5a lib/ubsan.c:148
       __ubsan_handle_shift_out_of_bounds.cold+0xb1/0x181 lib/ubsan.c:395
       sanity_check_raw_super fs/f2fs/super.c:2812 [inline]
       read_raw_super_block fs/f2fs/super.c:3267 [inline]
       f2fs_fill_super.cold+0x16c9/0x16f6 fs/f2fs/super.c:3519
       mount_bdev+0x34d/0x410 fs/super.c:1366
       legacy_get_tree+0x105/0x220 fs/fs_context.c:592
       vfs_get_tree+0x89/0x2f0 fs/super.c:1496
       do_new_mount fs/namespace.c:2896 [inline]
       path_mount+0x12ae/0x1e70 fs/namespace.c:3227
       do_mount fs/namespace.c:3240 [inline]
       __do_sys_mount fs/namespace.c:3448 [inline]
       __se_sys_mount fs/namespace.c:3425 [inline]
       __x64_sys_mount+0x27f/0x300 fs/namespace.c:3425
       do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
      
      Reported-by: syzbot+ca9a785f8ac472085994@syzkaller.appspotmail.com
      Signed-off-by: NAnant Thazhemadam <anant.thazhemadam@gmail.com>
      Signed-off-by: NChao Yu <yuchao0@huawei.com>
      Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      6e3c10be
    • R
      reiserfs: add check for an invalid ih_entry_count · 70daca2c
      Rustam Kovhaev 提交于
      stable inclusion
      from stable-5.10.5
      commit a021b66961324889ad223607152e8c9db941b03f
      bugzilla: 46931
      
      --------------------------------
      
      commit d24396c5 upstream.
      
      when directory item has an invalid value set for ih_entry_count it might
      trigger use-after-free or out-of-bounds read in bin_search_in_dir_item()
      
      ih_entry_count * IH_SIZE for directory item should not be larger than
      ih_item_len
      
      Link: https://lore.kernel.org/r/20201101140958.3650143-1-rkovhaev@gmail.com
      Reported-and-tested-by: syzbot+83b6f7cf9922cae5c4d7@syzkaller.appspotmail.com
      Link: https://syzkaller.appspot.com/bug?extid=83b6f7cf9922cae5c4d7Signed-off-by: NRustam Kovhaev <rkovhaev@gmail.com>
      Signed-off-by: NJan Kara <jack@suse.cz>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      70daca2c
    • P
      io_uring: fix io_sqe_files_unregister() hangs · 72779b06
      Pavel Begunkov 提交于
      stable inclusion
      from stable-5.10.5
      commit ce00a7d0d9523192d0a9dd954f9993358f19a536
      bugzilla: 46931
      
      --------------------------------
      
      commit 1ffc5422 upstream.
      
      io_sqe_files_unregister() uninterruptibly waits for enqueued ref nodes,
      however requests keeping them may never complete, e.g. because of some
      userspace dependency. Make sure it's interruptible otherwise it would
      hang forever.
      
      Cc: stable@vger.kernel.org # 5.6+
      Signed-off-by: NPavel Begunkov <asml.silence@gmail.com>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      72779b06
    • P
      io_uring: add a helper for setting a ref node · dd81dbb9
      Pavel Begunkov 提交于
      stable inclusion
      from stable-5.10.5
      commit b25b86936a8dccd6f6ec9045bede4774b6c7c7cf
      bugzilla: 46931
      
      --------------------------------
      
      commit 1642b445 upstream.
      
      Setting a new reference node to a file data is not trivial, don't repeat
      it, add and use a helper.
      
      Cc: stable@vger.kernel.org # 5.6+
      Signed-off-by: NPavel Begunkov <asml.silence@gmail.com>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      dd81dbb9
    • J
      io_uring: use bottom half safe lock for fixed file data · 94fe557f
      Jens Axboe 提交于
      stable inclusion
      from stable-5.10.5
      commit 25a2de679b5d55ead2f99881c7d3e9b745325f39
      bugzilla: 46931
      
      --------------------------------
      
      commit ac0648a5 upstream.
      
      io_file_data_ref_zero() can be invoked from soft-irq from the RCU core,
      hence we need to ensure that the file_data lock is bottom half safe. Use
      the _bh() variants when grabbing this lock.
      
      Reported-by: syzbot+1f4ba1e5520762c523c6@syzkaller.appspotmail.com
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      94fe557f
    • J
      io_uring: don't assume mm is constant across submits · 8b40a98b
      Jens Axboe 提交于
      stable inclusion
      from stable-5.10.5
      commit 7247bc60e8e1458d89ea53179fce02d2307aac7f
      bugzilla: 46931
      
      --------------------------------
      
      commit 77788775 upstream.
      
      If we COW the identity, we assume that ->mm never changes. But this
      isn't true of multiple processes end up sharing the ring. Hence treat
      id->mm like like any other process compontent when it comes to the
      identity mapping. This is pretty trivial, just moving the existing grab
      into io_grab_identity(), and including a check for the match.
      
      Cc: stable@vger.kernel.org # 5.10
      Fixes: 1e6fa521 ("io_uring: COW io_identity on mismatch")
      Reported-by: Christian Brauner <christian.brauner@ubuntu.com>:
      Tested-by: Christian Brauner <christian.brauner@ubuntu.com>:
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      8b40a98b
    • J
      jffs2: Fix NULL pointer dereference in rp_size fs option parsing · 1e1b6bf6
      Jamie Iles 提交于
      stable inclusion
      from stable-5.10.5
      commit 6d63cc42bb8f422a96deafdab9409b69cb1a7925
      bugzilla: 46931
      
      --------------------------------
      
      [ Upstream commit a61df3c4 ]
      
      syzkaller found the following JFFS2 splat:
      
        Unable to handle kernel paging request at virtual address dfffa00000000001
        Mem abort info:
          ESR = 0x96000004
          EC = 0x25: DABT (current EL), IL = 32 bits
          SET = 0, FnV = 0
          EA = 0, S1PTW = 0
        Data abort info:
          ISV = 0, ISS = 0x00000004
          CM = 0, WnR = 0
        [dfffa00000000001] address between user and kernel address ranges
        Internal error: Oops: 96000004 [#1] SMP
        Dumping ftrace buffer:
           (ftrace buffer empty)
        Modules linked in:
        CPU: 0 PID: 12745 Comm: syz-executor.5 Tainted: G S                5.9.0-rc8+ #98
        Hardware name: linux,dummy-virt (DT)
        pstate: 20400005 (nzCv daif +PAN -UAO BTYPE=--)
        pc : jffs2_parse_param+0x138/0x308 fs/jffs2/super.c:206
        lr : jffs2_parse_param+0x108/0x308 fs/jffs2/super.c:205
        sp : ffff000022a57910
        x29: ffff000022a57910 x28: 0000000000000000
        x27: ffff000057634008 x26: 000000000000d800
        x25: 000000000000d800 x24: ffff0000271a9000
        x23: ffffa0001adb5dc0 x22: ffff000023fdcf00
        x21: 1fffe0000454af2c x20: ffff000024cc9400
        x19: 0000000000000000 x18: 0000000000000000
        x17: 0000000000000000 x16: ffffa000102dbdd0
        x15: 0000000000000000 x14: ffffa000109e44bc
        x13: ffffa00010a3a26c x12: ffff80000476e0b3
        x11: 1fffe0000476e0b2 x10: ffff80000476e0b2
        x9 : ffffa00010a3ad60 x8 : ffff000023b70593
        x7 : 0000000000000003 x6 : 00000000f1f1f1f1
        x5 : ffff000023fdcf00 x4 : 0000000000000002
        x3 : ffffa00010000000 x2 : 0000000000000001
        x1 : dfffa00000000000 x0 : 0000000000000008
        Call trace:
         jffs2_parse_param+0x138/0x308 fs/jffs2/super.c:206
         vfs_parse_fs_param+0x234/0x4e8 fs/fs_context.c:117
         vfs_parse_fs_string+0xe8/0x148 fs/fs_context.c:161
         generic_parse_monolithic+0x17c/0x208 fs/fs_context.c:201
         parse_monolithic_mount_data+0x7c/0xa8 fs/fs_context.c:649
         do_new_mount fs/namespace.c:2871 [inline]
         path_mount+0x548/0x1da8 fs/namespace.c:3192
         do_mount+0x124/0x138 fs/namespace.c:3205
         __do_sys_mount fs/namespace.c:3413 [inline]
         __se_sys_mount fs/namespace.c:3390 [inline]
         __arm64_sys_mount+0x164/0x238 fs/namespace.c:3390
         __invoke_syscall arch/arm64/kernel/syscall.c:36 [inline]
         invoke_syscall arch/arm64/kernel/syscall.c:48 [inline]
         el0_svc_common.constprop.0+0x15c/0x598 arch/arm64/kernel/syscall.c:149
         do_el0_svc+0x60/0x150 arch/arm64/kernel/syscall.c:195
         el0_svc+0x34/0xb0 arch/arm64/kernel/entry-common.c:226
         el0_sync_handler+0xc8/0x5b4 arch/arm64/kernel/entry-common.c:236
         el0_sync+0x15c/0x180 arch/arm64/kernel/entry.S:663
        Code: d2d40001 f2fbffe1 91002260 d343fc02 (38e16841)
        ---[ end trace 4edf690313deda44 ]---
      
      This is because since ec10a24f, the option parsing happens before
      fill_super and so the MTD device isn't associated with the filesystem.
      Defer the size check until there is a valid association.
      
      Fixes: ec10a24f ("vfs: Convert jffs2 to use the new mount API")
      Cc: <stable@vger.kernel.org>
      Cc: David Howells <dhowells@redhat.com>
      Signed-off-by: NJamie Iles <jamie@nuviainc.com>
      Signed-off-by: NRichard Weinberger <richard@nod.at>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      1e1b6bf6
    • L
      jffs2: Allow setting rp_size to zero during remounting · b1f18c4e
      lizhe 提交于
      stable inclusion
      from stable-5.10.5
      commit 58dc34446c5280b3d069c27c4b0a56a08c1a2da8
      bugzilla: 46931
      
      --------------------------------
      
      [ Upstream commit cd3ed3c7 ]
      
      Set rp_size to zero will be ignore during remounting.
      
      The method to identify whether we input a remounting option of
      rp_size is to check if the rp_size input is zero. It can not work
      well if we pass "rp_size=0".
      
      This patch add a bool variable "set_rp_size" to fix this problem.
      Reported-by: NJubin Zhong <zhongjubin@huawei.com>
      Signed-off-by: Nlizhe <lizhe67@huawei.com>
      Signed-off-by: NRichard Weinberger <richard@nod.at>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      b1f18c4e
    • P
      io_uring: close a small race gap for files cancel · b3818042
      Pavel Begunkov 提交于
      stable inclusion
      from stable-5.10.5
      commit 52504a61ab999289d406f5dec930d3e3f386365d
      bugzilla: 46931
      
      --------------------------------
      
      commit dfea9fce upstream.
      
      The purpose of io_uring_cancel_files() is to wait for all requests
      matching ->files to go/be cancelled. We should first drop files of a
      request in io_req_drop_files() and only then make it undiscoverable for
      io_uring_cancel_files.
      
      First drop, then delete from list. It's ok to leave req->id->files
      dangling, because it's not dereferenced by cancellation code, only
      compared against. It would potentially go to sleep and be awaken by
      following in io_req_drop_files() wake_up().
      
      Fixes: 0f212204 ("io_uring: don't rely on weak ->files references")
      Cc: <stable@vger.kernel.org> # 5.5+
      Signed-off-by: NPavel Begunkov <asml.silence@gmail.com>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChen Jun <chenjun102@huawei.com>
      Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
      b3818042
  2. 12 1月, 2021 28 次提交