1. 05 Jun, 2023 6 commits
    • David S. Miller's avatar
      Merge tag 'linux-can-fixes-for-6.4-20230605' of... · d7536931
      David S. Miller authored
      Merge tag 'linux-can-fixes-for-6.4-20230605' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
      
      Marc Kleine-Budde says:
      
      ====================
      
      this is a pull request of 3 patches for net/master.
      
      All 3 patches target the j1939 stack.
      
      The 1st patch is by Oleksij Rempel and fixes the error queue handling
      for (E)TP sessions that run into timeouts.
      
      The last 2 patches are by Fedor Pchelkin and fix a potential
      use-after-free in j1939_netdev_start() if j1939_can_rx_register()
      fails.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d7536931
    • Eric Dumazet's avatar
      net/sched: fq_pie: ensure reasonable TCA_FQ_PIE_QUANTUM values · cd2b8113
      Eric Dumazet authored
      We got multiple syzbot reports, all duplicates of the following [1]
      
      syzbot managed to install fq_pie with a zero TCA_FQ_PIE_QUANTUM,
      thus triggering infinite loops.
      
      Use limits similar to sch_fq, with commits
      3725a269 ("pkt_sched: fq: avoid hang when quantum 0") and
      d9e15a27 ("pkt_sched: fq: do not accept silly TCA_FQ_QUANTUM")
      
      [1]
      watchdog: BUG: soft lockup - CPU#0 stuck for 26s! [swapper/0:0]
      Modules linked in:
      irq event stamp: 172817
      hardirqs last enabled at (172816): [<ffff80001242fde4>] __el1_irq arch/arm64/kernel/entry-common.c:476 [inline]
      hardirqs last enabled at (172816): [<ffff80001242fde4>] el1_interrupt+0x58/0x68 arch/arm64/kernel/entry-common.c:486
      hardirqs last disabled at (172817): [<ffff80001242fdb0>] __el1_irq arch/arm64/kernel/entry-common.c:468 [inline]
      hardirqs last disabled at (172817): [<ffff80001242fdb0>] el1_interrupt+0x24/0x68 arch/arm64/kernel/entry-common.c:486
      softirqs last enabled at (167634): [<ffff800008020c1c>] softirq_handle_end kernel/softirq.c:414 [inline]
      softirqs last enabled at (167634): [<ffff800008020c1c>] __do_softirq+0xac0/0xd54 kernel/softirq.c:600
      softirqs last disabled at (167701): [<ffff80000802a660>] ____do_softirq+0x14/0x20 arch/arm64/kernel/irq.c:80
      CPU: 0 PID: 0 Comm: swapper/0 Not tainted 6.4.0-rc3-syzkaller-geb0f1697d729 #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/28/2023
      pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
      pc : fq_pie_qdisc_dequeue+0x10c/0x8ac net/sched/sch_fq_pie.c:246
      lr : fq_pie_qdisc_dequeue+0xe4/0x8ac net/sched/sch_fq_pie.c:240
      sp : ffff800008007210
      x29: ffff800008007280 x28: ffff0000c86f7890 x27: ffff0000cb20c2e8
      x26: ffff0000cb20c2f0 x25: dfff800000000000 x24: ffff0000cb20c2e0
      x23: ffff0000c86f7880 x22: 0000000000000040 x21: 1fffe000190def10
      x20: ffff0000cb20c2e0 x19: ffff0000cb20c2e0 x18: ffff800008006e60
      x17: 0000000000000000 x16: ffff80000850af6c x15: 0000000000000302
      x14: 0000000000000100 x13: 0000000000000000 x12: 0000000000000001
      x11: 0000000000000302 x10: 0000000000000100 x9 : 0000000000000000
      x8 : 0000000000000000 x7 : ffff80000841c468 x6 : 0000000000000000
      x5 : 0000000000000001 x4 : 0000000000000001 x3 : 0000000000000000
      x2 : ffff0000cb20c2e0 x1 : ffff0000cb20c2e0 x0 : 0000000000000001
      Call trace:
      fq_pie_qdisc_dequeue+0x10c/0x8ac net/sched/sch_fq_pie.c:246
      dequeue_skb net/sched/sch_generic.c:292 [inline]
      qdisc_restart net/sched/sch_generic.c:397 [inline]
      __qdisc_run+0x1fc/0x231c net/sched/sch_generic.c:415
      __dev_xmit_skb net/core/dev.c:3868 [inline]
      __dev_queue_xmit+0xc80/0x3318 net/core/dev.c:4210
      dev_queue_xmit include/linux/netdevice.h:3085 [inline]
      neigh_connected_output+0x2f8/0x38c net/core/neighbour.c:1581
      neigh_output include/net/neighbour.h:544 [inline]
      ip6_finish_output2+0xd60/0x1a1c net/ipv6/ip6_output.c:134
      __ip6_finish_output net/ipv6/ip6_output.c:195 [inline]
      ip6_finish_output+0x538/0x8c8 net/ipv6/ip6_output.c:206
      NF_HOOK_COND include/linux/netfilter.h:292 [inline]
      ip6_output+0x270/0x594 net/ipv6/ip6_output.c:227
      dst_output include/net/dst.h:458 [inline]
      NF_HOOK include/linux/netfilter.h:303 [inline]
      ndisc_send_skb+0xc30/0x1790 net/ipv6/ndisc.c:508
      ndisc_send_rs+0x47c/0x5d4 net/ipv6/ndisc.c:718
      addrconf_rs_timer+0x300/0x58c net/ipv6/addrconf.c:3936
      call_timer_fn+0x19c/0x8cc kernel/time/timer.c:1700
      expire_timers kernel/time/timer.c:1751 [inline]
      __run_timers+0x55c/0x734 kernel/time/timer.c:2022
      run_timer_softirq+0x7c/0x114 kernel/time/timer.c:2035
      __do_softirq+0x2d0/0xd54 kernel/softirq.c:571
      ____do_softirq+0x14/0x20 arch/arm64/kernel/irq.c:80
      call_on_irq_stack+0x24/0x4c arch/arm64/kernel/entry.S:882
      do_softirq_own_stack+0x20/0x2c arch/arm64/kernel/irq.c:85
      invoke_softirq kernel/softirq.c:452 [inline]
      __irq_exit_rcu+0x28c/0x534 kernel/softirq.c:650
      irq_exit_rcu+0x14/0x84 kernel/softirq.c:662
      __el1_irq arch/arm64/kernel/entry-common.c:472 [inline]
      el1_interrupt+0x38/0x68 arch/arm64/kernel/entry-common.c:486
      el1h_64_irq_handler+0x18/0x24 arch/arm64/kernel/entry-common.c:491
      el1h_64_irq+0x64/0x68 arch/arm64/kernel/entry.S:587
      __daif_local_irq_enable arch/arm64/include/asm/irqflags.h:33 [inline]
      arch_local_irq_enable+0x8/0xc arch/arm64/include/asm/irqflags.h:55
      cpuidle_idle_call kernel/sched/idle.c:170 [inline]
      do_idle+0x1f0/0x4e8 kernel/sched/idle.c:282
      cpu_startup_entry+0x24/0x28 kernel/sched/idle.c:379
      rest_init+0x2dc/0x2f4 init/main.c:735
      start_kernel+0x0/0x55c init/main.c:834
      start_kernel+0x3f0/0x55c init/main.c:1088
      __primary_switched+0xb8/0xc0 arch/arm64/kernel/head.S:523
      
      Fixes: ec97ecf1 ("net: sched: add Flow Queue PIE packet scheduler")
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Reviewed-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cd2b8113
    • Marc Kleine-Budde's avatar
      Merge patch series "can: j1939: avoid possible use-after-free when j1939_can_rx_register fails" · 628f725d
      Marc Kleine-Budde authored
      Fedor Pchelkin <pchelkin@ispras.ru> says:
      
      The patch series fixes a possible racy use-after-free scenario
      described in 2/2: if j1939_can_rx_register() fails then the concurrent
      thread may have already read the invalid priv structure.
      
      The 1/2 makes j1939_netdev_lock a mutex so that access to
      j1939_can_rx_register() can be serialized without changing GFP_KERNEL
      to GFP_ATOMIC inside can_rx_register(). This seems to be safe.
      
      Note that the patch series has been tested only via Syzkaller and not
      with a real device.
      
      Link: https://lore.kernel.org/r/20230526171910.227615-1-pchelkin@ispras.ruSigned-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
      628f725d
    • Fedor Pchelkin's avatar
      can: j1939: avoid possible use-after-free when j1939_can_rx_register fails · 9f16eb10
      Fedor Pchelkin authored
      Syzkaller reports the following failure:
      
      BUG: KASAN: use-after-free in kref_put include/linux/kref.h:64 [inline]
      BUG: KASAN: use-after-free in j1939_priv_put+0x25/0xa0 net/can/j1939/main.c:172
      Write of size 4 at addr ffff888141c15058 by task swapper/3/0
      
      CPU: 3 PID: 0 Comm: swapper/3 Not tainted 5.10.144-syzkaller #0
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
      Call Trace:
       <IRQ>
       __dump_stack lib/dump_stack.c:77 [inline]
       dump_stack+0x107/0x167 lib/dump_stack.c:118
       print_address_description.constprop.0+0x1c/0x220 mm/kasan/report.c:385
       __kasan_report mm/kasan/report.c:545 [inline]
       kasan_report.cold+0x1f/0x37 mm/kasan/report.c:562
       check_memory_region_inline mm/kasan/generic.c:186 [inline]
       check_memory_region+0x145/0x190 mm/kasan/generic.c:192
       instrument_atomic_read_write include/linux/instrumented.h:101 [inline]
       atomic_fetch_sub_release include/asm-generic/atomic-instrumented.h:220 [inline]
       __refcount_sub_and_test include/linux/refcount.h:272 [inline]
       __refcount_dec_and_test include/linux/refcount.h:315 [inline]
       refcount_dec_and_test include/linux/refcount.h:333 [inline]
       kref_put include/linux/kref.h:64 [inline]
       j1939_priv_put+0x25/0xa0 net/can/j1939/main.c:172
       j1939_sk_sock_destruct+0x44/0x90 net/can/j1939/socket.c:374
       __sk_destruct+0x4e/0x820 net/core/sock.c:1784
       rcu_do_batch kernel/rcu/tree.c:2485 [inline]
       rcu_core+0xb35/0x1a30 kernel/rcu/tree.c:2726
       __do_softirq+0x289/0x9a3 kernel/softirq.c:298
       asm_call_irq_on_stack+0x12/0x20
       </IRQ>
       __run_on_irqstack arch/x86/include/asm/irq_stack.h:26 [inline]
       run_on_irqstack_cond arch/x86/include/asm/irq_stack.h:77 [inline]
       do_softirq_own_stack+0xaa/0xe0 arch/x86/kernel/irq_64.c:77
       invoke_softirq kernel/softirq.c:393 [inline]
       __irq_exit_rcu kernel/softirq.c:423 [inline]
       irq_exit_rcu+0x136/0x200 kernel/softirq.c:435
       sysvec_apic_timer_interrupt+0x4d/0x100 arch/x86/kernel/apic/apic.c:1095
       asm_sysvec_apic_timer_interrupt+0x12/0x20 arch/x86/include/asm/idtentry.h:635
      
      Allocated by task 1141:
       kasan_save_stack+0x1b/0x40 mm/kasan/common.c:48
       kasan_set_track mm/kasan/common.c:56 [inline]
       __kasan_kmalloc.constprop.0+0xc9/0xd0 mm/kasan/common.c:461
       kmalloc include/linux/slab.h:552 [inline]
       kzalloc include/linux/slab.h:664 [inline]
       j1939_priv_create net/can/j1939/main.c:131 [inline]
       j1939_netdev_start+0x111/0x860 net/can/j1939/main.c:268
       j1939_sk_bind+0x8ea/0xd30 net/can/j1939/socket.c:485
       __sys_bind+0x1f2/0x260 net/socket.c:1645
       __do_sys_bind net/socket.c:1656 [inline]
       __se_sys_bind net/socket.c:1654 [inline]
       __x64_sys_bind+0x6f/0xb0 net/socket.c:1654
       do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x61/0xc6
      
      Freed by task 1141:
       kasan_save_stack+0x1b/0x40 mm/kasan/common.c:48
       kasan_set_track+0x1c/0x30 mm/kasan/common.c:56
       kasan_set_free_info+0x1b/0x30 mm/kasan/generic.c:355
       __kasan_slab_free+0x112/0x170 mm/kasan/common.c:422
       slab_free_hook mm/slub.c:1542 [inline]
       slab_free_freelist_hook+0xad/0x190 mm/slub.c:1576
       slab_free mm/slub.c:3149 [inline]
       kfree+0xd9/0x3b0 mm/slub.c:4125
       j1939_netdev_start+0x5ee/0x860 net/can/j1939/main.c:300
       j1939_sk_bind+0x8ea/0xd30 net/can/j1939/socket.c:485
       __sys_bind+0x1f2/0x260 net/socket.c:1645
       __do_sys_bind net/socket.c:1656 [inline]
       __se_sys_bind net/socket.c:1654 [inline]
       __x64_sys_bind+0x6f/0xb0 net/socket.c:1654
       do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x61/0xc6
      
      It can be caused by this scenario:
      
      CPU0					CPU1
      j1939_sk_bind(socket0, ndev0, ...)
        j1939_netdev_start()
      					j1939_sk_bind(socket1, ndev0, ...)
                                                j1939_netdev_start()
        mutex_lock(&j1939_netdev_lock)
        j1939_priv_set(ndev0, priv)
        mutex_unlock(&j1939_netdev_lock)
      					  if (priv_new)
      					    kref_get(&priv_new->rx_kref)
      					    return priv_new;
      					  /* inside j1939_sk_bind() */
      					  jsk->priv = priv
        j1939_can_rx_register(priv) // fails
        j1939_priv_set(ndev, NULL)
        kfree(priv)
      					j1939_sk_sock_destruct()
      					j1939_priv_put() // <- uaf
      
      To avoid this, call j1939_can_rx_register() under j1939_netdev_lock so
      that a concurrent thread cannot process j1939_priv before
      j1939_can_rx_register() returns.
      
      Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
      
      Fixes: 9d71dd0c ("can: add support of SAE J1939 protocol")
      Signed-off-by: default avatarFedor Pchelkin <pchelkin@ispras.ru>
      Tested-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
      Acked-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
      Link: https://lore.kernel.org/r/20230526171910.227615-3-pchelkin@ispras.ru
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
      9f16eb10
    • Fedor Pchelkin's avatar
      can: j1939: change j1939_netdev_lock type to mutex · cd9c790d
      Fedor Pchelkin authored
      It turns out access to j1939_can_rx_register() needs to be serialized,
      otherwise j1939_priv can be corrupted when parallel threads call
      j1939_netdev_start() and j1939_can_rx_register() fails. This issue is
      thoroughly covered in other commit which serializes access to
      j1939_can_rx_register().
      
      Change j1939_netdev_lock type to mutex so that we do not need to remove
      GFP_KERNEL from can_rx_register().
      
      j1939_netdev_lock seems to be used in normal contexts where mutex usage
      is not prohibited.
      
      Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
      
      Fixes: 9d71dd0c ("can: add support of SAE J1939 protocol")
      Suggested-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
      Signed-off-by: default avatarFedor Pchelkin <pchelkin@ispras.ru>
      Tested-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
      Acked-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
      Link: https://lore.kernel.org/r/20230526171910.227615-2-pchelkin@ispras.ru
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
      cd9c790d
    • Oleksij Rempel's avatar
      can: j1939: j1939_sk_send_loop_abort(): improved error queue handling in J1939 Socket · 2a84aea8
      Oleksij Rempel authored
      This patch addresses an issue within the j1939_sk_send_loop_abort()
      function in the j1939/socket.c file, specifically in the context of
      Transport Protocol (TP) sessions.
      
      Without this patch, when a TP session is initiated and a Clear To Send
      (CTS) frame is received from the remote side requesting one data packet,
      the kernel dispatches the first Data Transport (DT) frame and then waits
      for the next CTS. If the remote side doesn't respond with another CTS,
      the kernel aborts due to a timeout. This leads to the user-space
      receiving an EPOLLERR on the socket, and the socket becomes active.
      
      However, when trying to read the error queue from the socket with
      sock.recvmsg(, , socket.MSG_ERRQUEUE), it returns -EAGAIN,
      given that the socket is non-blocking. This situation results in an
      infinite loop: the user-space repeatedly calls epoll(), epoll() returns
      the socket file descriptor with EPOLLERR, but the socket then blocks on
      the recv() of ERRQUEUE.
      
      This patch introduces an additional check for the J1939_SOCK_ERRQUEUE
      flag within the j1939_sk_send_loop_abort() function. If the flag is set,
      it indicates that the application has subscribed to receive error queue
      messages. In such cases, the kernel can communicate the current transfer
      state via the error queue. This allows for the function to return early,
      preventing the unnecessary setting of the socket into an error state,
      and breaking the infinite loop. It is crucial to note that a socket
      error is only needed if the application isn't using the error queue, as,
      without it, the application wouldn't be aware of transfer issues.
      
      Fixes: 9d71dd0c ("can: add support of SAE J1939 protocol")
      Reported-by: default avatarDavid Jander <david@protonic.nl>
      Tested-by: default avatarDavid Jander <david@protonic.nl>
      Signed-off-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
      Link: https://lore.kernel.org/r/20230526081946.715190-1-o.rempel@pengutronix.de
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
      2a84aea8
  2. 04 Jun, 2023 4 commits
  3. 03 Jun, 2023 6 commits
  4. 02 Jun, 2023 5 commits
  5. 01 Jun, 2023 19 commits