1. 07 Jun, 2023 7 commits
    • Jakub Kicinski's avatar
      Merge tag 'nf-23-06-07' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf · 20c47646
      Jakub Kicinski authored
      Pablo Neira Ayuso says:
      
      ====================
      Netfilter fixes for net
      
      The following patchset contains Netfilter fixes for net:
      
      1) Missing nul-check in basechain hook netlink dump path, from Gavrilov Ilia.
      
      2) Fix bitwise register tracking, from Jeremy Sowden.
      
      3) Null pointer dereference when accessing conntrack helper,
         from Tijs Van Buggenhout.
      
      4) Add schedule point to ipset's call_ad, from Kuniyuki Iwashima.
      
      5) Incorrect boundary check when building chain blob.
      
      * tag 'nf-23-06-07' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf:
        netfilter: nf_tables: out-of-bound check in chain blob
        netfilter: ipset: Add schedule point in call_ad().
        netfilter: conntrack: fix NULL pointer dereference in nf_confirm_cthelper
        netfilter: nft_bitwise: fix register tracking
        netfilter: nf_tables: Add null check for nla_nest_start_noflag() in nft_dump_basechain_hook()
      ====================
      
      Link: https://lore.kernel.org/r/20230606225851.67394-1-pablo@netfilter.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      20c47646
    • Jakub Kicinski's avatar
      Merge tag 'wireless-2023-06-06' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless · e684ab76
      Jakub Kicinski authored
      Kalle Valo says:
      
      ====================
      wireless fixes for v6.4
      
      Both rtw88 and rtw89 have a 802.11 powersave fix for a regression
      introduced in v6.0. mt76 fixes a race and a null pointer dereference.
      iwlwifi fixes an issue where not enough memory was allocated for a
      firmware event. And finally the stack has several smaller fixes all
      over.
      
      * tag 'wireless-2023-06-06' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless:
        wifi: cfg80211: fix locking in regulatory disconnect
        wifi: cfg80211: fix locking in sched scan stop work
        wifi: iwlwifi: mvm: Fix -Warray-bounds bug in iwl_mvm_wait_d3_notif()
        wifi: mac80211: fix switch count in EMA beacons
        wifi: mac80211: don't translate beacon/presp addrs
        wifi: mac80211: mlme: fix non-inheritence element
        wifi: cfg80211: reject bad AP MLD address
        wifi: mac80211: use correct iftype HE cap
        wifi: mt76: mt7996: fix possible NULL pointer dereference in mt7996_mac_write_txwi()
        wifi: rtw89: remove redundant check of entering LPS
        wifi: rtw89: correct PS calculation for SUPPORTS_DYNAMIC_PS
        wifi: rtw88: correct PS calculation for SUPPORTS_DYNAMIC_PS
        wifi: mt76: mt7615: fix possible race in mt7615_mac_sta_poll
      ====================
      
      Link: https://lore.kernel.org/r/20230606150817.EC133C433D2@smtp.kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      e684ab76
    • Brett Creeley's avatar
      virtio_net: use control_buf for coalesce params · accc1bf2
      Brett Creeley authored
      Commit 699b045a ("net: virtio_net: notifications coalescing
      support") added coalescing command support for virtio_net. However,
      the coalesce commands are using buffers on the stack, which is causing
      the device to see DMA errors. There should also be a complaint from
      check_for_stack() in debug_dma_map_xyz(). Fix this by adding and using
      coalesce params from the control_buf struct, which aligns with other
      commands.
      
      Cc: stable@vger.kernel.org
      Fixes: 699b045a ("net: virtio_net: notifications coalescing support")
      Reviewed-by: default avatarShannon Nelson <shannon.nelson@amd.com>
      Signed-off-by: default avatarAllen Hubbe <allen.hubbe@amd.com>
      Signed-off-by: default avatarBrett Creeley <brett.creeley@amd.com>
      Acked-by: default avatarJason Wang <jasowang@redhat.com>
      Reviewed-by: default avatarXuan Zhuo <xuanzhuo@linux.alibaba.com>
      Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      Link: https://lore.kernel.org/r/20230605195925.51625-1-brett.creeley@amd.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      accc1bf2
    • Brett Creeley's avatar
      pds_core: Fix FW recovery detection · 4f48c303
      Brett Creeley authored
      Commit 523847df ("pds_core: add devcmd device interfaces") included
      initial support for FW recovery detection. Unfortunately, the ordering
      in pdsc_is_fw_good() was incorrect, which was causing FW recovery to be
      undetected by the driver. Fix this by making sure to update the cached
      fw_status by calling pdsc_is_fw_running() before setting the local FW
      gen.
      
      Fixes: 523847df ("pds_core: add devcmd device interfaces")
      Signed-off-by: default avatarShannon Nelson <shannon.nelson@amd.com>
      Signed-off-by: default avatarBrett Creeley <brett.creeley@amd.com>
      Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
      Link: https://lore.kernel.org/r/20230605195116.49653-1-brett.creeley@amd.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      4f48c303
    • Eric Dumazet's avatar
      tcp: gso: really support BIG TCP · 82a01ab3
      Eric Dumazet authored
      We missed that tcp_gso_segment() was assuming skb->len was smaller than 65535 :
      
      oldlen = (u16)~skb->len;
      
      This part came with commit 0718bcc0 ("[NET]: Fix CHECKSUM_HW GSO problems.")
      
      This leads to wrong TCP checksum.
      
      Adapt the code to accept arbitrary packet length.
      
      v2:
        - use two csum_add() instead of csum_fold() (Alexander Duyck)
        - Change delta type to __wsum to reduce casts (Alexander Duyck)
      
      Fixes: 09f3d1a3 ("ipv6/gso: remove temporary HBH/jumbo header")
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Reviewed-by: default avatarAlexander Duyck <alexanderduyck@fb.com>
      Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
      Link: https://lore.kernel.org/r/20230605161647.3624428-1-edumazet@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      82a01ab3
    • Kuniyuki Iwashima's avatar
      ipv6: rpl: Fix Route of Death. · a2f4c143
      Kuniyuki Iwashima authored
      A remote DoS vulnerability of RPL Source Routing is assigned CVE-2023-2156.
      
      The Source Routing Header (SRH) has the following format:
      
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |  Next Header  |  Hdr Ext Len  | Routing Type  | Segments Left |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        | CmprI | CmprE |  Pad  |               Reserved                |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                                                               |
        .                                                               .
        .                        Addresses[1..n]                        .
        .                                                               .
        |                                                               |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
      The originator of an SRH places the first hop's IPv6 address in the IPv6
      header's IPv6 Destination Address and the second hop's IPv6 address as
      the first address in Addresses[1..n].
      
      The CmprI and CmprE fields indicate the number of prefix octets that are
      shared with the IPv6 Destination Address.  When CmprI or CmprE is not 0,
      Addresses[1..n] are compressed as follows:
      
        1..n-1 : (16 - CmprI) bytes
             n : (16 - CmprE) bytes
      
      Segments Left indicates the number of route segments remaining.  When the
      value is not zero, the SRH is forwarded to the next hop.  Its address
      is extracted from Addresses[n - Segment Left + 1] and swapped with IPv6
      Destination Address.
      
      When Segment Left is greater than or equal to 2, the size of SRH is not
      changed because Addresses[1..n-1] are decompressed and recompressed with
      CmprI.
      
      OTOH, when Segment Left changes from 1 to 0, the new SRH could have a
      different size because Addresses[1..n-1] are decompressed with CmprI and
      recompressed with CmprE.
      
      Let's say CmprI is 15 and CmprE is 0.  When we receive SRH with Segment
      Left >= 2, Addresses[1..n-1] have 1 byte for each, and Addresses[n] has
      16 bytes.  When Segment Left is 1, Addresses[1..n-1] is decompressed to
      16 bytes and not recompressed.  Finally, the new SRH will need more room
      in the header, and the size is (16 - 1) * (n - 1) bytes.
      
      Here the max value of n is 255 as Segment Left is u8, so in the worst case,
      we have to allocate 3825 bytes in the skb headroom.  However, now we only
      allocate a small fixed buffer that is IPV6_RPL_SRH_WORST_SWAP_SIZE (16 + 7
      bytes).  If the decompressed size overflows the room, skb_push() hits BUG()
      below [0].
      
      Instead of allocating the fixed buffer for every packet, let's allocate
      enough headroom only when we receive SRH with Segment Left 1.
      
      [0]:
      skbuff: skb_under_panic: text:ffffffff81c9f6e2 len:576 put:576 head:ffff8880070b5180 data:ffff8880070b4fb0 tail:0x70 end:0x140 dev:lo
      kernel BUG at net/core/skbuff.c:200!
      invalid opcode: 0000 [#1] PREEMPT SMP PTI
      CPU: 0 PID: 154 Comm: python3 Not tainted 6.4.0-rc4-00190-gc308e9ec #7
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
      RIP: 0010:skb_panic (net/core/skbuff.c:200)
      Code: 4f 70 50 8b 87 bc 00 00 00 50 8b 87 b8 00 00 00 50 ff b7 c8 00 00 00 4c 8b 8f c0 00 00 00 48 c7 c7 80 6e 77 82 e8 ad 8b 60 ff <0f> 0b 66 66 2e 0f 1f 84 00 00 00 00 00 90 90 90 90 90 90 90 90 90
      RSP: 0018:ffffc90000003da0 EFLAGS: 00000246
      RAX: 0000000000000085 RBX: ffff8880058a6600 RCX: 0000000000000000
      RDX: 0000000000000000 RSI: ffff88807dc1c540 RDI: ffff88807dc1c540
      RBP: ffffc90000003e48 R08: ffffffff82b392c8 R09: 00000000ffffdfff
      R10: ffffffff82a592e0 R11: ffffffff82b092e0 R12: ffff888005b1c800
      R13: ffff8880070b51b8 R14: ffff888005b1ca18 R15: ffff8880070b5190
      FS:  00007f4539f0b740(0000) GS:ffff88807dc00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 000055670baf3000 CR3: 0000000005b0e000 CR4: 00000000007506f0
      PKRU: 55555554
      Call Trace:
       <IRQ>
       skb_push (net/core/skbuff.c:210)
       ipv6_rthdr_rcv (./include/linux/skbuff.h:2880 net/ipv6/exthdrs.c:634 net/ipv6/exthdrs.c:718)
       ip6_protocol_deliver_rcu (net/ipv6/ip6_input.c:437 (discriminator 5))
       ip6_input_finish (./include/linux/rcupdate.h:805 net/ipv6/ip6_input.c:483)
       __netif_receive_skb_one_core (net/core/dev.c:5494)
       process_backlog (./include/linux/rcupdate.h:805 net/core/dev.c:5934)
       __napi_poll (net/core/dev.c:6496)
       net_rx_action (net/core/dev.c:6565 net/core/dev.c:6696)
       __do_softirq (./arch/x86/include/asm/jump_label.h:27 ./include/linux/jump_label.h:207 ./include/trace/events/irq.h:142 kernel/softirq.c:572)
       do_softirq (kernel/softirq.c:472 kernel/softirq.c:459)
       </IRQ>
       <TASK>
       __local_bh_enable_ip (kernel/softirq.c:396)
       __dev_queue_xmit (net/core/dev.c:4272)
       ip6_finish_output2 (./include/net/neighbour.h:544 net/ipv6/ip6_output.c:134)
       rawv6_sendmsg (./include/net/dst.h:458 ./include/linux/netfilter.h:303 net/ipv6/raw.c:656 net/ipv6/raw.c:914)
       sock_sendmsg (net/socket.c:724 net/socket.c:747)
       __sys_sendto (net/socket.c:2144)
       __x64_sys_sendto (net/socket.c:2156 net/socket.c:2152 net/socket.c:2152)
       do_syscall_64 (arch/x86/entry/common.c:50 arch/x86/entry/common.c:80)
       entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120)
      RIP: 0033:0x7f453a138aea
      Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 15 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 7e c3 0f 1f 44 00 00 41 54 48 83 ec 30 44 89
      RSP: 002b:00007ffcc212a1c8 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
      RAX: ffffffffffffffda RBX: 00007ffcc212a288 RCX: 00007f453a138aea
      RDX: 0000000000000060 RSI: 00007f4539084c20 RDI: 0000000000000003
      RBP: 00007f4538308e80 R08: 00007ffcc212a300 R09: 000000000000001c
      R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
      R13: ffffffffc4653600 R14: 0000000000000001 R15: 00007f4539712d1b
       </TASK>
      Modules linked in:
      
      Fixes: 8610c7c6 ("net: ipv6: add support for rpl sr exthdr")
      Reported-by: Max VA
      Closes: https://www.interruptlabs.co.uk/articles/linux-ipv6-route-of-deathSigned-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
      Link: https://lore.kernel.org/r/20230605180617.67284-1-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      a2f4c143
    • Jakub Kicinski's avatar
      netlink: specs: ethtool: fix random typos · f6ca5baf
      Jakub Kicinski authored
      Working on the code gen for C reveals typos in the ethtool spec
      as the compiler tries to find the names in the existing uAPI
      header. Fix the mistakes.
      
      Fixes: a353318e ("tools: ynl: populate most of the ethtool spec")
      Acked-by: default avatarStanislav Fomichev <sdf@google.com>
      Link: https://lore.kernel.org/r/20230605233257.843977-1-kuba@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      f6ca5baf
  2. 06 Jun, 2023 14 commits
    • Pablo Neira Ayuso's avatar
      netfilter: nf_tables: out-of-bound check in chain blob · 08e42a0d
      Pablo Neira Ayuso authored
      Add current size of rule expressions to the boundary check.
      
      Fixes: 2c865a8a ("netfilter: nf_tables: add rule blob layout")
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      08e42a0d
    • Kuniyuki Iwashima's avatar
      netfilter: ipset: Add schedule point in call_ad(). · 24e22789
      Kuniyuki Iwashima authored
      syzkaller found a repro that causes Hung Task [0] with ipset.  The repro
      first creates an ipset and then tries to delete a large number of IPs
      from the ipset concurrently:
      
        IPSET_ATTR_IPADDR_IPV4 : 172.20.20.187
        IPSET_ATTR_CIDR        : 2
      
      The first deleting thread hogs a CPU with nfnl_lock(NFNL_SUBSYS_IPSET)
      held, and other threads wait for it to be released.
      
      Previously, the same issue existed in set->variant->uadt() that could run
      so long under ip_set_lock(set).  Commit 5e29dc36 ("netfilter: ipset:
      Rework long task execution when adding/deleting entries") tried to fix it,
      but the issue still exists in the caller with another mutex.
      
      While adding/deleting many IPs, we should release the CPU periodically to
      prevent someone from abusing ipset to hang the system.
      
      Note we need to increment the ipset's refcnt to prevent the ipset from
      being destroyed while rescheduling.
      
      [0]:
      INFO: task syz-executor174:268 blocked for more than 143 seconds.
            Not tainted 6.4.0-rc1-00145-gba79e9a7 #1
      "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
      task:syz-executor174 state:D stack:0     pid:268   ppid:260    flags:0x0000000d
      Call trace:
       __switch_to+0x308/0x714 arch/arm64/kernel/process.c:556
       context_switch kernel/sched/core.c:5343 [inline]
       __schedule+0xd84/0x1648 kernel/sched/core.c:6669
       schedule+0xf0/0x214 kernel/sched/core.c:6745
       schedule_preempt_disabled+0x58/0xf0 kernel/sched/core.c:6804
       __mutex_lock_common kernel/locking/mutex.c:679 [inline]
       __mutex_lock+0x6fc/0xdb0 kernel/locking/mutex.c:747
       __mutex_lock_slowpath+0x14/0x20 kernel/locking/mutex.c:1035
       mutex_lock+0x98/0xf0 kernel/locking/mutex.c:286
       nfnl_lock net/netfilter/nfnetlink.c:98 [inline]
       nfnetlink_rcv_msg+0x480/0x70c net/netfilter/nfnetlink.c:295
       netlink_rcv_skb+0x1c0/0x350 net/netlink/af_netlink.c:2546
       nfnetlink_rcv+0x18c/0x199c net/netfilter/nfnetlink.c:658
       netlink_unicast_kernel net/netlink/af_netlink.c:1339 [inline]
       netlink_unicast+0x664/0x8cc net/netlink/af_netlink.c:1365
       netlink_sendmsg+0x6d0/0xa4c net/netlink/af_netlink.c:1913
       sock_sendmsg_nosec net/socket.c:724 [inline]
       sock_sendmsg net/socket.c:747 [inline]
       ____sys_sendmsg+0x4b8/0x810 net/socket.c:2503
       ___sys_sendmsg net/socket.c:2557 [inline]
       __sys_sendmsg+0x1f8/0x2a4 net/socket.c:2586
       __do_sys_sendmsg net/socket.c:2595 [inline]
       __se_sys_sendmsg net/socket.c:2593 [inline]
       __arm64_sys_sendmsg+0x80/0x94 net/socket.c:2593
       __invoke_syscall arch/arm64/kernel/syscall.c:38 [inline]
       invoke_syscall+0x84/0x270 arch/arm64/kernel/syscall.c:52
       el0_svc_common+0x134/0x24c arch/arm64/kernel/syscall.c:142
       do_el0_svc+0x64/0x198 arch/arm64/kernel/syscall.c:193
       el0_svc+0x2c/0x7c arch/arm64/kernel/entry-common.c:637
       el0t_64_sync_handler+0x84/0xf0 arch/arm64/kernel/entry-common.c:655
       el0t_64_sync+0x190/0x194 arch/arm64/kernel/entry.S:591
      Reported-by: default avatarsyzkaller <syzkaller@googlegroups.com>
      Fixes: a7b4f989 ("netfilter: ipset: IP set core support")
      Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Acked-by: default avatarJozsef Kadlecsik <kadlec@netfilter.org>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      24e22789
    • Tijs Van Buggenhout's avatar
      netfilter: conntrack: fix NULL pointer dereference in nf_confirm_cthelper · e1f543dc
      Tijs Van Buggenhout authored
      An nf_conntrack_helper from nf_conn_help may become NULL after DNAT.
      
      Observed when TCP port 1720 (Q931_PORT), associated with h323 conntrack
      helper, is DNAT'ed to another destination port (e.g. 1730), while
      nfqueue is being used for final acceptance (e.g. snort).
      
      This happenned after transition from kernel 4.14 to 5.10.161.
      
      Workarounds:
       * keep the same port (1720) in DNAT
       * disable nfqueue
       * disable/unload h323 NAT helper
      
      $ linux-5.10/scripts/decode_stacktrace.sh vmlinux < /tmp/kernel.log
      BUG: kernel NULL pointer dereference, address: 0000000000000084
      [..]
      RIP: 0010:nf_conntrack_update (net/netfilter/nf_conntrack_core.c:2080 net/netfilter/nf_conntrack_core.c:2134) nf_conntrack
      [..]
      nfqnl_reinject (net/netfilter/nfnetlink_queue.c:237) nfnetlink_queue
      nfqnl_recv_verdict (net/netfilter/nfnetlink_queue.c:1230) nfnetlink_queue
      nfnetlink_rcv_msg (net/netfilter/nfnetlink.c:241) nfnetlink
      [..]
      
      Fixes: ee04805f ("netfilter: conntrack: make conntrack userspace helpers work again")
      Signed-off-by: default avatarTijs Van Buggenhout <tijs.van.buggenhout@axsguard.com>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      e1f543dc
    • Jeremy Sowden's avatar
      netfilter: nft_bitwise: fix register tracking · 14e8b293
      Jeremy Sowden authored
      At the end of `nft_bitwise_reduce`, there is a loop which is intended to
      update the bitwise expression associated with each tracked destination
      register.  However, currently, it just updates the first register
      repeatedly.  Fix it.
      
      Fixes: 34cc9e52 ("netfilter: nf_tables: cancel tracking for clobbered destination registers")
      Signed-off-by: default avatarJeremy Sowden <jeremy@azazel.net>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      14e8b293
    • Gavrilov Ilia's avatar
      netfilter: nf_tables: Add null check for nla_nest_start_noflag() in nft_dump_basechain_hook() · bd058763
      Gavrilov Ilia authored
      The nla_nest_start_noflag() function may fail and return NULL;
      the return value needs to be checked.
      
      Found by InfoTeCS on behalf of Linux Verification Center
      (linuxtesting.org) with SVACE.
      
      Fixes: d54725cd ("netfilter: nf_tables: support for multiple devices per netdev hook")
      Signed-off-by: default avatarGavrilov Ilia <Ilia.Gavrilov@infotecs.ru>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      bd058763
    • Johannes Berg's avatar
      wifi: cfg80211: fix locking in regulatory disconnect · f7e60032
      Johannes Berg authored
      This should use wiphy_lock() now instead of requiring the
      RTNL, since __cfg80211_leave() via cfg80211_leave() is now
      requiring that lock to be held.
      
      Fixes: a05829a7 ("cfg80211: avoid holding the RTNL when calling the driver")
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      f7e60032
    • Johannes Berg's avatar
      wifi: cfg80211: fix locking in sched scan stop work · 3e54ed82
      Johannes Berg authored
      This should use wiphy_lock() now instead of acquiring the
      RTNL, since cfg80211_stop_sched_scan_req() now needs that.
      
      Fixes: a05829a7 ("cfg80211: avoid holding the RTNL when calling the driver")
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      3e54ed82
    • Manish Chopra's avatar
      qed/qede: Fix scheduling while atomic · 42510dff
      Manish Chopra authored
      Statistics read through bond interface via sysfs causes
      below bug and traces as it triggers the bonding module to
      collect the slave device statistics while holding the spinlock,
      beneath that qede->qed driver statistics flow gets scheduled out
      due to usleep_range() used in PTT acquire logic
      
      [ 3673.988874] Hardware name: HPE ProLiant DL365 Gen10 Plus/ProLiant DL365 Gen10 Plus, BIOS A42 10/29/2021
      [ 3673.988878] Call Trace:
      [ 3673.988891]  dump_stack_lvl+0x34/0x44
      [ 3673.988908]  __schedule_bug.cold+0x47/0x53
      [ 3673.988918]  __schedule+0x3fb/0x560
      [ 3673.988929]  schedule+0x43/0xb0
      [ 3673.988932]  schedule_hrtimeout_range_clock+0xbf/0x1b0
      [ 3673.988937]  ? __hrtimer_init+0xc0/0xc0
      [ 3673.988950]  usleep_range+0x5e/0x80
      [ 3673.988955]  qed_ptt_acquire+0x2b/0xd0 [qed]
      [ 3673.988981]  _qed_get_vport_stats+0x141/0x240 [qed]
      [ 3673.989001]  qed_get_vport_stats+0x18/0x80 [qed]
      [ 3673.989016]  qede_fill_by_demand_stats+0x37/0x400 [qede]
      [ 3673.989028]  qede_get_stats64+0x19/0xe0 [qede]
      [ 3673.989034]  dev_get_stats+0x5c/0xc0
      [ 3673.989045]  netstat_show.constprop.0+0x52/0xb0
      [ 3673.989055]  dev_attr_show+0x19/0x40
      [ 3673.989065]  sysfs_kf_seq_show+0x9b/0xf0
      [ 3673.989076]  seq_read_iter+0x120/0x4b0
      [ 3673.989087]  new_sync_read+0x118/0x1a0
      [ 3673.989095]  vfs_read+0xf3/0x180
      [ 3673.989099]  ksys_read+0x5f/0xe0
      [ 3673.989102]  do_syscall_64+0x3b/0x90
      [ 3673.989109]  entry_SYSCALL_64_after_hwframe+0x44/0xae
      [ 3673.989115] RIP: 0033:0x7f8467d0b082
      [ 3673.989119] Code: c0 e9 b2 fe ff ff 50 48 8d 3d ca 05 08 00 e8 35 e7 01 00 0f 1f 44 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 0f 05 <48> 3d 00 f0 ff ff 77 56 c3 0f 1f 44 00 00 48 83 ec 28 48 89 54 24
      [ 3673.989121] RSP: 002b:00007ffffb21fd08 EFLAGS: 00000246 ORIG_RAX: 0000000000000000
      [ 3673.989127] RAX: ffffffffffffffda RBX: 000000000100eca0 RCX: 00007f8467d0b082
      [ 3673.989128] RDX: 00000000000003ff RSI: 00007ffffb21fdc0 RDI: 0000000000000003
      [ 3673.989130] RBP: 00007f8467b96028 R08: 0000000000000010 R09: 00007ffffb21ec00
      [ 3673.989132] R10: 00007ffffb27b170 R11: 0000000000000246 R12: 00000000000000f0
      [ 3673.989134] R13: 0000000000000003 R14: 00007f8467b92000 R15: 0000000000045a05
      [ 3673.989139] CPU: 30 PID: 285188 Comm: read_all Kdump: loaded Tainted: G        W  OE
      
      Fix this by collecting the statistics asynchronously from a periodic
      delayed work scheduled at default stats coalescing interval and return
      the recent copy of statisitcs from .ndo_get_stats64(), also add ability
      to configure/retrieve stats coalescing interval using below commands -
      
      ethtool -C ethx stats-block-usecs <val>
      ethtool -c ethx
      
      Fixes: 133fac0e ("qede: Add basic ethtool support")
      Cc: Sudarsana Kalluru <skalluru@marvell.com>
      Cc: David Miller <davem@davemloft.net>
      Signed-off-by: default avatarManish Chopra <manishc@marvell.com>
      Link: https://lore.kernel.org/r/20230605112600.48238-1-manishc@marvell.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      42510dff
    • Gustavo A. R. Silva's avatar
      wifi: iwlwifi: mvm: Fix -Warray-bounds bug in iwl_mvm_wait_d3_notif() · 7a4615b9
      Gustavo A. R. Silva authored
      kmemdup() at line 2735 is not duplicating enough memory for
      notif->tid_tear_down and notif->station_id. As it only duplicates
      612 bytes: up to offsetofend(struct iwl_wowlan_info_notif,
      received_beacons), this is the range of [0, 612) bytes.
      
      2735	notif = kmemdup(notif_v1,
      2736			offsetofend(struct iwl_wowlan_info_notif,
      2737				    received_beacons),
      2738			GFP_ATOMIC);
      
      which evidently does not cover bytes 612 and 613 for members
      tid_tear_down and station_id in struct iwl_wowlan_info_notif.
      See below:
      
      $ pahole -C iwl_wowlan_info_notif drivers/net/wireless/intel/iwlwifi/mvm/d3.o
      struct iwl_wowlan_info_notif {
      	struct iwl_wowlan_gtk_status_v3 gtk[2];          /*     0   488 */
      	/* --- cacheline 7 boundary (448 bytes) was 40 bytes ago --- */
      	struct iwl_wowlan_igtk_status igtk[2];           /*   488    80 */
      	/* --- cacheline 8 boundary (512 bytes) was 56 bytes ago --- */
      	__le64                     replay_ctr;           /*   568     8 */
      	/* --- cacheline 9 boundary (576 bytes) --- */
      	__le16                     pattern_number;       /*   576     2 */
      	__le16                     reserved1;            /*   578     2 */
      	__le16                     qos_seq_ctr[8];       /*   580    16 */
      	__le32                     wakeup_reasons;       /*   596     4 */
      	__le32                     num_of_gtk_rekeys;    /*   600     4 */
      	__le32                     transmitted_ndps;     /*   604     4 */
      	__le32                     received_beacons;     /*   608     4 */
      	u8                         tid_tear_down;        /*   612     1 */
      	u8                         station_id;           /*   613     1 */
      	u8                         reserved2[2];         /*   614     2 */
      
      	/* size: 616, cachelines: 10, members: 13 */
      	/* last cacheline: 40 bytes */
      };
      
      Therefore, when the following assignments take place, actually no memory
      has been allocated for those objects:
      
      2743	notif->tid_tear_down = notif_v1->tid_tear_down;
      2744	notif->station_id = notif_v1->station_id;
      
      Fix this by allocating space for the whole notif object and zero out the
      remaining space in memory after member station_id.
      
      This also fixes the following -Warray-bounds issues:
       CC      drivers/net/wireless/intel/iwlwifi/mvm/d3.o
      drivers/net/wireless/intel/iwlwifi/mvm/d3.c: In function ‘iwl_mvm_wait_d3_notif’:
      drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2743:30: warning: array subscript ‘struct iwl_wowlan_info_notif[0]’ is partly outside array bounds of ‘unsigned char[612]’ [-Warray-bounds=]
       2743 |                         notif->tid_tear_down = notif_v1->tid_tear_down;
            |
                       from drivers/net/wireless/intel/iwlwifi/mvm/d3.c:7:
      In function ‘kmemdup’,
          inlined from ‘iwl_mvm_wait_d3_notif’ at drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2735:12:
      include/linux/fortify-string.h:765:16: note: object of size 612 allocated by ‘__real_kmemdup’
        765 |         return __real_kmemdup(p, size, gfp);
            |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      drivers/net/wireless/intel/iwlwifi/mvm/d3.c: In function ‘iwl_mvm_wait_d3_notif’:
      drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2744:30: warning: array subscript ‘struct iwl_wowlan_info_notif[0]’ is partly outside array bounds of ‘unsigned char[612]’ [-Warray-bounds=]
       2744 |                         notif->station_id = notif_v1->station_id;
            |                              ^~
      In function ‘kmemdup’,
          inlined from ‘iwl_mvm_wait_d3_notif’ at drivers/net/wireless/intel/iwlwifi/mvm/d3.c:2735:12:
      include/linux/fortify-string.h:765:16: note: object of size 612 allocated by ‘__real_kmemdup’
        765 |         return __real_kmemdup(p, size, gfp);
            |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      Link: https://github.com/KSPP/linux/issues/306
      Fixes: 905d50dd ("wifi: iwlwifi: mvm: support wowlan info notification version 2")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Acked-by: default avatarGregory Greenman <gregory.greenman@intel.com>
      Link: https://lore.kernel.org/r/ZHpGN555FwAKGduH@workSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      7a4615b9
    • Aditya Kumar Singh's avatar
      wifi: mac80211: fix switch count in EMA beacons · 1afa18e9
      Aditya Kumar Singh authored
      Currently, whenever an EMA beacon is formed, due to is_template
      argument being false from the caller, the switch count is always
      decremented once which is wrong.
      
      Also if switch count is equal to profile periodicity, this makes
      the switch count to reach till zero which triggers a WARN_ON_ONCE.
      
      [  261.593915] CPU: 1 PID: 800 Comm: kworker/u8:3 Not tainted 5.4.213 #0
      [  261.616143] Hardware name: Qualcomm Technologies, Inc. IPQ9574
      [  261.622666] Workqueue: phy0 ath12k_get_link_bss_conf [ath12k]
      [  261.629771] pstate: 60400005 (nZCv daif +PAN -UAO)
      [  261.635595] pc : ieee80211_next_txq+0x1ac/0x1b8 [mac80211]
      [  261.640282] lr : ieee80211_beacon_update_cntdwn+0x64/0xb4 [mac80211]
      [...]
      [  261.729683] Call trace:
      [  261.734986]  ieee80211_next_txq+0x1ac/0x1b8 [mac80211]
      [  261.737156]  ieee80211_beacon_cntdwn_is_complete+0xa28/0x1194 [mac80211]
      [  261.742365]  ieee80211_beacon_cntdwn_is_complete+0xef4/0x1194 [mac80211]
      [  261.749224]  ieee80211_beacon_get_template_ema_list+0x38/0x5c [mac80211]
      [  261.755908]  ath12k_get_link_bss_conf+0xf8/0x33b4 [ath12k]
      [  261.762590]  ath12k_get_link_bss_conf+0x390/0x33b4 [ath12k]
      [  261.767881]  process_one_work+0x194/0x270
      [  261.773346]  worker_thread+0x200/0x314
      [  261.777514]  kthread+0x140/0x150
      [  261.781158]  ret_from_fork+0x10/0x18
      
      Fix this issue by making the is_template argument as true when fetching
      the EMA beacons.
      
      Fixes: bd54f3c2 ("wifi: mac80211: generate EMA beacons in AP mode")
      Signed-off-by: default avatarAditya Kumar Singh <quic_adisi@quicinc.com>
      Link: https://lore.kernel.org/r/20230531062012.4537-1-quic_adisi@quicinc.comSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      1afa18e9
    • Johannes Berg's avatar
      wifi: mac80211: don't translate beacon/presp addrs · 47c171a4
      Johannes Berg authored
      Don't do link address translation for beacons and probe responses,
      this leads to reporting multiple scan list entries for the same AP
      (one with the MLD address) which just breaks things.
      
      We might need to extend this in the future for some other (action)
      frames that aren't MLD addressed.
      
      Fixes: 42fb9148 ("wifi: mac80211: do link->MLD address translation on RX")
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
      Link: https://lore.kernel.org/r/20230604120651.62adead1b43a.Ifc25eed26ebf3b269f60b1ec10060156d0e7ec0d@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      47c171a4
    • Johannes Berg's avatar
      wifi: mac80211: mlme: fix non-inheritence element · 68c22855
      Johannes Berg authored
      There were two bugs when creating the non-inheritence
      element:
       1) 'at_extension' needs to be declared outside the loop,
          otherwise the value resets every iteration and we
          can never really switch properly
       2) 'added' never got set to true, so we always cut off
          the extension element again at the end of the function
      
      This shows another issue that we might add a list but no
      extension list, but we need to make the extension list a
      zero-length one in that case.
      
      Fix all these issues. While at it, add a comment explaining
      the trim.
      
      Fixes: 81151ce4 ("wifi: mac80211: support MLO authentication/association with one link")
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
      Link: https://lore.kernel.org/r/20230604120651.3addaa5c4782.If3a78f9305997ad7ef4ba7ffc17a8234c956f613@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      68c22855
    • Johannes Berg's avatar
      wifi: cfg80211: reject bad AP MLD address · 727073ca
      Johannes Berg authored
      When trying to authenticate, if the AP MLD address isn't
      a valid address, mac80211 can throw a warning. Avoid that
      by rejecting such addresses.
      
      Fixes: d648c230 ("wifi: nl80211: support MLO in auth/assoc")
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
      Link: https://lore.kernel.org/r/20230604120651.89188912bd1d.I8dbc6c8ee0cb766138803eec59508ef4ce477709@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      727073ca
    • Johannes Berg's avatar
      wifi: mac80211: use correct iftype HE cap · c37ab22b
      Johannes Berg authored
      We already check that the right iftype capa exists,
      but then don't use it. Assign it to a variable so we
      can actually use it, and then do that.
      
      Fixes: bac2fd3d ("mac80211: remove use of ieee80211_get_he_sta_cap()")
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
      Link: https://lore.kernel.org/r/20230604120651.0e908e5c5fdd.Iac142549a6144ac949ebd116b921a59ae5282735@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      c37ab22b
  3. 05 Jun, 2023 13 commits
    • David S. Miller's avatar
      Merge branch 'mptcp-addr-adv-fixes' · fb928170
      David S. Miller authored
      Mat Martineau says:
      
      ====================
      mptcp: Fixes for address advertisement
      
      Patches 1 and 2 allow address advertisements to be removed without
      affecting current connected subflows, and updates associated self tests.
      
      Patches 3 and 4 correctly track (and allow removal of) addresses that
      were implicitly announced as part of subflow creation. Also updates
      associated self tests.
      
      Patch 5 makes subflow and address announcement counters work consistently
      between the userspace and in-kernel path managers.
      ====================
      Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      fb928170
    • Geliang Tang's avatar
      mptcp: update userspace pm infos · 77e4b94a
      Geliang Tang authored
      Increase pm subflows counter on both server side and client side when
      userspace pm creates a new subflow, and decrease the counter when it
      closes a subflow.
      
      Increase add_addr_signaled counter in mptcp_nl_cmd_announce() when the
      address is announced by userspace PM.
      
      This modification is similar to how the in-kernel PM is updating the
      counter: when additional subflows are created/removed.
      
      Fixes: 9ab4807c ("mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE")
      Fixes: 702c2f64 ("mptcp: netlink: allow userspace-driven subflow establishment")
      Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/329
      Cc: stable@vger.kernel.org
      Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
      Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      77e4b94a
    • Geliang Tang's avatar
      selftests: mptcp: update userspace pm subflow tests · 6c160b63
      Geliang Tang authored
      To align with what is done by the in-kernel PM, update userspace pm
      subflow selftests, by sending the a remove_addrs command together
      before the remove_subflows command. This will get a RM_ADDR in
      chk_rm_nr().
      
      Fixes: d9a4594e ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE")
      Fixes: 5e986ec4 ("selftests: mptcp: userspace pm subflow tests")
      Link: https://github.com/multipath-tcp/mptcp_net-next/issues/379
      Cc: stable@vger.kernel.org
      Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
      Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6c160b63
    • Geliang Tang's avatar
      mptcp: add address into userspace pm list · 24430f8b
      Geliang Tang authored
      Add the address into userspace_pm_local_addr_list when the subflow is
      created. Make sure it can be found in mptcp_nl_cmd_remove(). And delete
      it in the new helper mptcp_userspace_pm_delete_local_addr().
      
      By doing this, the "REMOVE" command also works with subflows that have
      been created via the "SUB_CREATE" command instead of restricting to
      the addresses that have been announced via the "ANNOUNCE" command.
      
      Fixes: d9a4594e ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE")
      Link: https://github.com/multipath-tcp/mptcp_net-next/issues/379
      Cc: stable@vger.kernel.org
      Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
      Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      24430f8b
    • Geliang Tang's avatar
      selftests: mptcp: update userspace pm addr tests · 48d73f60
      Geliang Tang authored
      This patch is linked to the previous commit ("mptcp: only send RM_ADDR in
      nl_cmd_remove").
      
      To align with what is done by the in-kernel PM, update userspace pm addr
      selftests, by sending a remove_subflows command together after the
      remove_addrs command.
      
      Fixes: d9a4594e ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE")
      Fixes: 97040cf9 ("selftests: mptcp: userspace pm address tests")
      Cc: stable@vger.kernel.org
      Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
      Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      48d73f60
    • Geliang Tang's avatar
      mptcp: only send RM_ADDR in nl_cmd_remove · 8b1c94da
      Geliang Tang authored
      The specifications from [1] about the "REMOVE" command say:
      
          Announce that an address has been lost to the peer
      
      It was then only supposed to send a RM_ADDR and not trying to delete
      associated subflows.
      
      A new helper mptcp_pm_remove_addrs() is then introduced to do just
      that, compared to mptcp_pm_remove_addrs_and_subflows() also removing
      subflows.
      
      To delete a subflow, the userspace daemon can use the "SUB_DESTROY"
      command, see mptcp_nl_cmd_sf_destroy().
      
      Fixes: d9a4594e ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE")
      Link: https://github.com/multipath-tcp/mptcp/blob/mptcp_v0.96/include/uapi/linux/mptcp.h [1]
      Cc: stable@vger.kernel.org
      Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
      Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8b1c94da
    • Bartosz Golaszewski's avatar
      net: stmmac: dwmac-qcom-ethqos: fix a regression on EMAC < 3 · 9bc00973
      Bartosz Golaszewski authored
      We must not assign plat_dat->dwmac4_addrs unconditionally as for
      structures which don't set them, this will result in the core driver
      using zeroes everywhere and breaking the driver for older HW. On EMAC < 2
      the address should remain NULL.
      
      Fixes: b6837619 ("net: stmmac: dwmac-qcom-ethqos: Add EMAC3 support")
      Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
      Reviewed-by: default avatarAndrew Halaney <ahalaney@redhat.com>
      Reviewed-by: default avatarSiddharth Vadapalli <s-vadapalli@ti.com>
      Reviewed-by: default avatarVinod Koul <vkoul@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9bc00973
    • 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
  4. 04 Jun, 2023 4 commits
  5. 03 Jun, 2023 2 commits
    • Wen Gu's avatar
      net/smc: Avoid to access invalid RMBs' MRs in SMCRv1 ADD LINK CONT · c308e9ec
      Wen Gu authored
      SMCRv1 has a similar issue to SMCRv2 (see link below) that may access
      invalid MRs of RMBs when construct LLC ADD LINK CONT messages.
      
       BUG: kernel NULL pointer dereference, address: 0000000000000014
       #PF: supervisor read access in kernel mode
       #PF: error_code(0x0000) - not-present page
       PGD 0 P4D 0
       Oops: 0000 [#1] PREEMPT SMP PTI
       CPU: 5 PID: 48 Comm: kworker/5:0 Kdump: loaded Tainted: G W   E      6.4.0-rc3+ #49
       Workqueue: events smc_llc_add_link_work [smc]
       RIP: 0010:smc_llc_add_link_cont+0x160/0x270 [smc]
       RSP: 0018:ffffa737801d3d50 EFLAGS: 00010286
       RAX: ffff964f82144000 RBX: ffffa737801d3dd8 RCX: 0000000000000000
       RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff964f81370c30
       RBP: ffffa737801d3dd4 R08: ffff964f81370000 R09: ffffa737801d3db0
       R10: 0000000000000001 R11: 0000000000000060 R12: ffff964f82e70000
       R13: ffff964f81370c38 R14: ffffa737801d3dd3 R15: 0000000000000001
       FS:  0000000000000000(0000) GS:ffff9652bfd40000(0000) knlGS:0000000000000000
       CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
       CR2: 0000000000000014 CR3: 000000008fa20004 CR4: 00000000003706e0
       DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
       DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
       Call Trace:
        <TASK>
        smc_llc_srv_rkey_exchange+0xa7/0x190 [smc]
        smc_llc_srv_add_link+0x3ae/0x5a0 [smc]
        smc_llc_add_link_work+0xb8/0x140 [smc]
        process_one_work+0x1e5/0x3f0
        worker_thread+0x4d/0x2f0
        ? __pfx_worker_thread+0x10/0x10
        kthread+0xe5/0x120
        ? __pfx_kthread+0x10/0x10
        ret_from_fork+0x2c/0x50
        </TASK>
      
      When an alernate RNIC is available in system, SMC will try to add a new
      link based on the RNIC for resilience. All the RMBs in use will be mapped
      to the new link. Then the RMBs' MRs corresponding to the new link will
      be filled into LLC messages. For SMCRv1, they are ADD LINK CONT messages.
      
      However smc_llc_add_link_cont() may mistakenly access to unused RMBs which
      haven't been mapped to the new link and have no valid MRs, thus causing a
      crash. So this patch fixes it.
      
      Fixes: 87f88cda ("net/smc: rkey processing for a new link as SMC client")
      Link: https://lore.kernel.org/r/1685101741-74826-3-git-send-email-guwen@linux.alibaba.comSigned-off-by: default avatarWen Gu <guwen@linux.alibaba.com>
      Reviewed-by: default avatarWenjia Zhang <wenjia@linux.ibm.com>
      Reviewed-by: default avatarTony Lu <tonylu@linux.alibaba.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c308e9ec
    • Weihao Gao's avatar
      Fix gitignore for recently added usptream self tests · 02a7eee1
      Weihao Gao authored
      This resolves the issue that generated binary is showing up as an untracked git file after every build on the kernel.
      Signed-off-by: default avatarWeihao Gao <weihaogao@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      02a7eee1