1. 29 9月, 2021 2 次提交
  2. 28 9月, 2021 2 次提交
  3. 22 9月, 2021 1 次提交
  4. 21 9月, 2021 4 次提交
  5. 14 9月, 2021 2 次提交
  6. 10 9月, 2021 1 次提交
  7. 08 9月, 2021 9 次提交
  8. 04 9月, 2021 2 次提交
  9. 01 9月, 2021 1 次提交
    • W
      Bluetooth: fix use-after-free error in lock_sock_nested() · 1bff51ea
      Wang ShaoBo 提交于
      use-after-free error in lock_sock_nested is reported:
      
      [  179.140137][ T3731] =====================================================
      [  179.142675][ T3731] BUG: KMSAN: use-after-free in lock_sock_nested+0x280/0x2c0
      [  179.145494][ T3731] CPU: 4 PID: 3731 Comm: kworker/4:2 Not tainted 5.12.0-rc6+ #54
      [  179.148432][ T3731] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
      [  179.151806][ T3731] Workqueue: events l2cap_chan_timeout
      [  179.152730][ T3731] Call Trace:
      [  179.153301][ T3731]  dump_stack+0x24c/0x2e0
      [  179.154063][ T3731]  kmsan_report+0xfb/0x1e0
      [  179.154855][ T3731]  __msan_warning+0x5c/0xa0
      [  179.155579][ T3731]  lock_sock_nested+0x280/0x2c0
      [  179.156436][ T3731]  ? kmsan_get_metadata+0x116/0x180
      [  179.157257][ T3731]  l2cap_sock_teardown_cb+0xb8/0x890
      [  179.158154][ T3731]  ? __msan_metadata_ptr_for_load_8+0x10/0x20
      [  179.159141][ T3731]  ? kmsan_get_metadata+0x116/0x180
      [  179.159994][ T3731]  ? kmsan_get_shadow_origin_ptr+0x84/0xb0
      [  179.160959][ T3731]  ? l2cap_sock_recv_cb+0x420/0x420
      [  179.161834][ T3731]  l2cap_chan_del+0x3e1/0x1d50
      [  179.162608][ T3731]  ? kmsan_get_metadata+0x116/0x180
      [  179.163435][ T3731]  ? kmsan_get_shadow_origin_ptr+0x84/0xb0
      [  179.164406][ T3731]  l2cap_chan_close+0xeea/0x1050
      [  179.165189][ T3731]  ? kmsan_internal_unpoison_shadow+0x42/0x70
      [  179.166180][ T3731]  l2cap_chan_timeout+0x1da/0x590
      [  179.167066][ T3731]  ? __msan_metadata_ptr_for_load_8+0x10/0x20
      [  179.168023][ T3731]  ? l2cap_chan_create+0x560/0x560
      [  179.168818][ T3731]  process_one_work+0x121d/0x1ff0
      [  179.169598][ T3731]  worker_thread+0x121b/0x2370
      [  179.170346][ T3731]  kthread+0x4ef/0x610
      [  179.171010][ T3731]  ? process_one_work+0x1ff0/0x1ff0
      [  179.171828][ T3731]  ? kthread_blkcg+0x110/0x110
      [  179.172587][ T3731]  ret_from_fork+0x1f/0x30
      [  179.173348][ T3731]
      [  179.173752][ T3731] Uninit was created at:
      [  179.174409][ T3731]  kmsan_internal_poison_shadow+0x5c/0xf0
      [  179.175373][ T3731]  kmsan_slab_free+0x76/0xc0
      [  179.176060][ T3731]  kfree+0x3a5/0x1180
      [  179.176664][ T3731]  __sk_destruct+0x8af/0xb80
      [  179.177375][ T3731]  __sk_free+0x812/0x8c0
      [  179.178032][ T3731]  sk_free+0x97/0x130
      [  179.178686][ T3731]  l2cap_sock_release+0x3d5/0x4d0
      [  179.179457][ T3731]  sock_close+0x150/0x450
      [  179.180117][ T3731]  __fput+0x6bd/0xf00
      [  179.180787][ T3731]  ____fput+0x37/0x40
      [  179.181481][ T3731]  task_work_run+0x140/0x280
      [  179.182219][ T3731]  do_exit+0xe51/0x3e60
      [  179.182930][ T3731]  do_group_exit+0x20e/0x450
      [  179.183656][ T3731]  get_signal+0x2dfb/0x38f0
      [  179.184344][ T3731]  arch_do_signal_or_restart+0xaa/0xe10
      [  179.185266][ T3731]  exit_to_user_mode_prepare+0x2d2/0x560
      [  179.186136][ T3731]  syscall_exit_to_user_mode+0x35/0x60
      [  179.186984][ T3731]  do_syscall_64+0xc5/0x140
      [  179.187681][ T3731]  entry_SYSCALL_64_after_hwframe+0x44/0xae
      [  179.188604][ T3731] =====================================================
      
      In our case, there are two Thread A and B:
      
      Context: Thread A:              Context: Thread B:
      
      l2cap_chan_timeout()            __se_sys_shutdown()
        l2cap_chan_close()              l2cap_sock_shutdown()
          l2cap_chan_del()                l2cap_chan_close()
            l2cap_sock_teardown_cb()        l2cap_sock_teardown_cb()
      
      Once l2cap_sock_teardown_cb() excuted, this sock will be marked as SOCK_ZAPPED,
      and can be treated as killable in l2cap_sock_kill() if sock_orphan() has
      excuted, at this time we close sock through sock_close() which end to call
      l2cap_sock_kill() like Thread C:
      
      Context: Thread C:
      
      sock_close()
        l2cap_sock_release()
          sock_orphan()
          l2cap_sock_kill()  #free sock if refcnt is 1
      
      If C completed, Once A or B reaches l2cap_sock_teardown_cb() again,
      use-after-free happened.
      
      We should set chan->data to NULL if sock is destructed, for telling teardown
      operation is not allowed in l2cap_sock_teardown_cb(), and also we should
      avoid killing an already killed socket in l2cap_sock_close_cb().
      Signed-off-by: NWang ShaoBo <bobo.shaobowang@huawei.com>
      Signed-off-by: NLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
      1bff51ea
  10. 31 8月, 2021 2 次提交
  11. 30 8月, 2021 6 次提交
  12. 19 8月, 2021 3 次提交
    • K
      Bluetooth: Fix return value in hci_dev_do_close() · 61969ef8
      Kangmin Park 提交于
      hci_error_reset() return without calling hci_dev_do_open() when
      hci_dev_do_close() return error value which is not 0.
      
      Also, hci_dev_close() return hci_dev_do_close() function's return
      value.
      
      But, hci_dev_do_close() return always 0 even if hdev->shutdown
      return error value. So, fix hci_dev_do_close() to save and return
      the return value of the hdev->shutdown when it is called.
      Signed-off-by: NKangmin Park <l4stpr0gr4m@gmail.com>
      Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
      61969ef8
    • P
      Bluetooth: add timeout sanity check to hci_inquiry · f41a4b2b
      Pavel Skripkin 提交于
      Syzbot hit "task hung" bug in hci_req_sync(). The problem was in
      unreasonable huge inquiry timeout passed from userspace.
      Fix it by adding sanity check for timeout value to hci_inquiry().
      
      Since hci_inquiry() is the only user of hci_req_sync() with user
      controlled timeout value, it makes sense to check timeout value in
      hci_inquiry() and don't touch hci_req_sync().
      
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Reported-and-tested-by: syzbot+be2baed593ea56c6a84c@syzkaller.appspotmail.com
      Signed-off-by: NPavel Skripkin <paskripkin@gmail.com>
      Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
      f41a4b2b
    • K
      Bluetooth: mgmt: Pessimize compile-time bounds-check · a31e5a41
      Kees Cook 提交于
      After gaining __alloc_size hints, GCC thinks it can reach a memcpy()
      with eir_len == 0 (since it can't see into the rewrite of status).
      Instead, check eir_len == 0, avoiding this future warning:
      
      In function 'eir_append_data',
          inlined from 'read_local_oob_ext_data_complete' at net/bluetooth/mgmt.c:7210:12:
      ./include/linux/fortify-string.h:54:29: warning: '__builtin_memcpy' offset 5 is out of the bounds [0, 3] [-Warray-bounds]
      ...
      net/bluetooth/hci_request.h:133:2: note: in expansion of macro 'memcpy'
        133 |  memcpy(&eir[eir_len], data, data_len);
            |  ^~~~~~
      
      Cc: Marcel Holtmann <marcel@holtmann.org>
      Cc: Johan Hedberg <johan.hedberg@gmail.com>
      Cc: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Jakub Kicinski <kuba@kernel.org>
      Cc: linux-bluetooth@vger.kernel.org
      Cc: netdev@vger.kernel.org
      Signed-off-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
      a31e5a41
  13. 17 8月, 2021 1 次提交
    • K
      Bluetooth: Fix race condition in handling NOP command · ecb71f25
      Kiran K 提交于
      For NOP command, need to cancel work scheduled on cmd_timer,
      on receiving command status or commmand complete event.
      
      Below use case might lead to race condition multiple when NOP
      commands are queued sequentially:
      
      hci_cmd_work() {
         if (atomic_read(&hdev->cmd_cnt) {
                  .
                  .
                  .
            atomic_dec(&hdev->cmd_cnt);
            hci_send_frame(hdev,...);
            schedule_delayed_work(&hdev->cmd_timer,...);
         }
      }
      
      On receiving event for first NOP, the work scheduled on hdev->cmd_timer
      is not cancelled and second NOP is dequeued and sent to controller.
      
      While waiting for an event for second NOP command, work scheduled on
      cmd_timer for the first NOP can get scheduled, resulting in sending third
      NOP command (sending back to back NOP commands). This might
      cause issues at controller side (like memory overrun, controller going
      unresponsive) resulting in hci tx timeouts, hardware errors etc.
      
      The fix to this issue is to cancel the delayed work scheduled on
      cmd_timer on receiving command status or command complete event for
      NOP command (this patch handles NOP command same as any other SIG
      command).
      Signed-off-by: NKiran K <kiran.k@intel.com>
      Reviewed-by: NChethan T N <chethan.tumkur.narayan@intel.com>
      Reviewed-by: NSrivatsa Ravishankar <ravishankar.srivatsa@intel.com>
      Acked-by: NManish Mandlik <mmandlik@google.com>
      Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
      ecb71f25
  14. 16 8月, 2021 3 次提交
  15. 11 8月, 2021 1 次提交
    • D
      Bluetooth: fix repeated calls to sco_sock_kill · e1dee2c1
      Desmond Cheong Zhi Xi 提交于
      In commit 4e1a720d ("Bluetooth: avoid killing an already killed
      socket"), a check was added to sco_sock_kill to skip killing a socket
      if the SOCK_DEAD flag was set.
      
      This was done after a trace for a use-after-free bug showed that the
      same sock pointer was being killed twice.
      
      Unfortunately, this check prevents sco_sock_kill from running on any
      socket. sco_sock_kill kills a socket only if it's zapped and orphaned,
      however sock_orphan announces that the socket is dead before detaching
      it. i.e., orphaned sockets have the SOCK_DEAD flag set.
      
      To fix this, we remove the check for SOCK_DEAD, and avoid repeated
      calls to sco_sock_kill by removing incorrect calls in:
      
      1. sco_sock_timeout. The socket should not be killed on timeout as
      further processing is expected to be done. For example,
      sco_sock_connect sets the timer then waits for the socket to be
      connected or for an error to be returned.
      
      2. sco_conn_del. This function should clean up resources for the
      connection, but the socket itself should be cleaned up in
      sco_sock_release.
      
      3. sco_sock_close. Calls to sco_sock_close in sco_sock_cleanup_listen
      and sco_sock_release are followed by sco_sock_kill. Hence the
      duplicated call should be removed.
      
      Fixes: 4e1a720d ("Bluetooth: avoid killing an already killed socket")
      Signed-off-by: NDesmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
      Signed-off-by: NLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      e1dee2c1