Skip to content
Snippets Groups Projects
  1. Mar 26, 2024
    • Martin KaFai Lau's avatar
      bpf: net: Change do_ip_getsockopt() to take the sockptr_t argument · 8693e3cf
      Martin KaFai Lau authored
      
      [ Upstream commit 728f064c ]
      
      Similar to the earlier patch that changes sk_getsockopt() to
      take the sockptr_t argument.  This patch also changes
      do_ip_getsockopt() to take the sockptr_t argument such that
      a latter patch can make bpf_getsockopt(SOL_IP) to reuse
      do_ip_getsockopt().
      
      Note on the change in ip_mc_gsfget().  This function is to
      return an array of sockaddr_storage in optval.  This function
      is shared between ip_get_mcast_msfilter() and
      compat_ip_get_mcast_msfilter().  However, the sockaddr_storage
      is stored at different offset of the optval because of
      the difference between group_filter and compat_group_filter.
      Thus, a new 'ss_offset' argument is added to ip_mc_gsfget().
      
      Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
      Link: https://lore.kernel.org/r/20220902002828.2890585-1-kafai@fb.com
      
      
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Stable-dep-of: 5c3be3e0 ("ipmr: fix incorrect parameter validation in the ip_mroute_getsockopt() function")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8693e3cf
    • Gustavo A. R. Silva's avatar
      net/ipv4/ipv6: Replace one-element arraya with flexible-array members · 415edd2d
      Gustavo A. R. Silva authored
      [ Upstream commit db243b79 ]
      
      There is a regular need in the kernel to provide a way to declare having
      a dynamically sized set of trailing elements in a structure. Kernel code
      should always use “flexible array members”[1] for these cases. The older
      style of one-element or zero-length arrays should no longer be used[2].
      
      Use an anonymous union with a couple of anonymous structs in order to
      keep userspace unchanged and refactor the related code accordingly:
      
      $ pahole -C group_filter net/ipv4/ip_sockglue.o
      struct group_filter {
      	union {
      		struct {
      			__u32      gf_interface_aux;     /*     0     4 */
      
      			/* XXX 4 bytes hole, try to pack */
      
      			struct __kernel_sockaddr_storage gf_group_aux; /*     8   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
      			__u32      gf_fmode_aux;         /*   136     4 */
      			__u32      gf_numsrc_aux;        /*   140     4 */
      			struct __kernel_sockaddr_storage gf_slist[1]; /*   144   128 */
      		};                                       /*     0   272 */
      		struct {
      			__u32      gf_interface;         /*     0     4 */
      
      			/* XXX 4 bytes hole, try to pack */
      
      			struct __kernel_sockaddr_storage gf_group; /*     8   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
      			__u32      gf_fmode;             /*   136     4 */
      			__u32      gf_numsrc;            /*   140     4 */
      			struct __kernel_sockaddr_storage gf_slist_flex[0]; /*   144     0 */
      		};                                       /*     0   144 */
      	};                                               /*     0   272 */
      
      	/* size: 272, cachelines: 5, members: 1 */
      	/* last cacheline: 16 bytes */
      };
      
      $ pahole -C compat_group_filter net/ipv4/ip_sockglue.o
      struct compat_group_filter {
      	union {
      		struct {
      			__u32      gf_interface_aux;     /*     0     4 */
      			struct __kernel_sockaddr_storage gf_group_aux __attribute__((__aligned__(4))); /*     4   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
      			__u32      gf_fmode_aux;         /*   132     4 */
      			__u32      gf_numsrc_aux;        /*   136     4 */
      			struct __kernel_sockaddr_storage gf_slist[1] __attribute__((__aligned__(4))); /*   140   128 */
      		} __attribute__((__packed__)) __attribute__((__aligned__(4)));                     /*     0   268 */
      		struct {
      			__u32      gf_interface;         /*     0     4 */
      			struct __kernel_sockaddr_storage gf_group __attribute__((__aligned__(4))); /*     4   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
      			__u32      gf_fmode;             /*   132     4 */
      			__u32      gf_numsrc;            /*   136     4 */
      			struct __kernel_sockaddr_storage gf_slist_flex[0] __attribute__((__aligned__(4))); /*   140     0 */
      		} __attribute__((__packed__)) __attribute__((__aligned__(4)));                     /*     0   140 */
      	} __attribute__((__aligned__(1)));               /*     0   268 */
      
      	/* size: 268, cachelines: 5, members: 1 */
      	/* forced alignments: 1 */
      	/* last cacheline: 12 bytes */
      } __attribute__((__packed__));
      
      This helps with the ongoing efforts to globally enable -Warray-bounds
      and get us closer to being able to tighten the FORTIFY_SOURCE routines
      on memcpy().
      
      [1] https://en.wikipedia.org/wiki/Flexible_array_member
      [2] https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
      
      Link: https://github.com/KSPP/linux/issues/79
      Link: https://github.com/KSPP/linux/issues/109
      
      
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: 5c3be3e0 ("ipmr: fix incorrect parameter validation in the ip_mroute_getsockopt() function")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      415edd2d
    • Gustavo A. R. Silva's avatar
      net/ipv4: Revert use of struct_size() helper · 7394669d
      Gustavo A. R. Silva authored
      
      [ Upstream commit 4167a960 ]
      
      Revert the use of structr_size() and stay with IP_MSFILTER_SIZE() for
      now, as in this case, the size of struct ip_msfilter didn't change with
      the addition of the flexible array imsf_slist_flex[]. So, if we use
      struct_size() we will be allocating and calculating the size of
      struct ip_msfilter with one too many items for imsf_slist_flex[].
      
      We might use struct_size() in the future, but for now let's stay
      with IP_MSFILTER_SIZE().
      
      Fixes: 2d3e5caf ("net/ipv4: Replace one-element array with flexible-array member")
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: 5c3be3e0 ("ipmr: fix incorrect parameter validation in the ip_mroute_getsockopt() function")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7394669d
    • Gustavo A. R. Silva's avatar
      net/ipv4: Replace one-element array with flexible-array member · 1ebd0d89
      Gustavo A. R. Silva authored
      [ Upstream commit 2d3e5caf ]
      
      There is a regular need in the kernel to provide a way to declare having
      a dynamically sized set of trailing elements in a structure. Kernel code
      should always use “flexible array members”[1] for these cases. The older
      style of one-element or zero-length arrays should no longer be used[2].
      
      Use an anonymous union with a couple of anonymous structs in order to
      keep userspace unchanged:
      
      $ pahole -C ip_msfilter net/ipv4/ip_sockglue.o
      struct ip_msfilter {
      	union {
      		struct {
      			__be32     imsf_multiaddr_aux;   /*     0     4 */
      			__be32     imsf_interface_aux;   /*     4     4 */
      			__u32      imsf_fmode_aux;       /*     8     4 */
      			__u32      imsf_numsrc_aux;      /*    12     4 */
      			__be32     imsf_slist[1];        /*    16     4 */
      		};                                       /*     0    20 */
      		struct {
      			__be32     imsf_multiaddr;       /*     0     4 */
      			__be32     imsf_interface;       /*     4     4 */
      			__u32      imsf_fmode;           /*     8     4 */
      			__u32      imsf_numsrc;          /*    12     4 */
      			__be32     imsf_slist_flex[0];   /*    16     0 */
      		};                                       /*     0    16 */
      	};                                               /*     0    20 */
      
      	/* size: 20, cachelines: 1, members: 1 */
      	/* last cacheline: 20 bytes */
      };
      
      Also, refactor the code accordingly and make use of the struct_size()
      and flex_array_size() helpers.
      
      This helps with the ongoing efforts to globally enable -Warray-bounds
      and get us closer to being able to tighten the FORTIFY_SOURCE routines
      on memcpy().
      
      [1] https://en.wikipedia.org/wiki/Flexible_array_member
      [2] https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
      
      Link: https://github.com/KSPP/linux/issues/79
      Link: https://github.com/KSPP/linux/issues/109
      
      
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: 5c3be3e0 ("ipmr: fix incorrect parameter validation in the ip_mroute_getsockopt() function")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1ebd0d89
    • Gavrilov Ilia's avatar
      tcp: fix incorrect parameter validation in the do_tcp_getsockopt() function · c8059876
      Gavrilov Ilia authored
      
      [ Upstream commit 716edc97 ]
      
      The 'len' variable can't be negative when assigned the result of
      'min_t' because all 'min_t' parameters are cast to unsigned int,
      and then the minimum one is chosen.
      
      To fix the logic, check 'len' as read from 'optlen',
      where the types of relevant variables are (signed) int.
      
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarGavrilov Ilia <Ilia.Gavrilov@infotecs.ru>
      Reviewed-by: default avatarJason Xing <kerneljasonxing@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c8059876
    • Viresh Kumar's avatar
      OPP: debugfs: Fix warning around icc_get_name() · 1f6244e9
      Viresh Kumar authored
      
      [ Upstream commit 28330ceb ]
      
      If the kernel isn't built with interconnect support, icc_get_name()
      returns NULL and we get following warning:
      
      drivers/opp/debugfs.c: In function 'bw_name_read':
      drivers/opp/debugfs.c:43:42: error: '%.62s' directive argument is null [-Werror=format-overflow=]
               i = scnprintf(buf, sizeof(buf), "%.62s\n", icc_get_name(path));
      
      Fix it.
      
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Closes: https://lore.kernel.org/oe-kbuild-all/202402141313.81ltVF5g-lkp@intel.com/
      
      
      Fixes: 0430b1d5 ("opp: Expose bandwidth information via debugfs")
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Reviewed-by: default avatarDhruva Gole <d-gole@ti.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1f6244e9
    • Tim Pambor's avatar
      net: phy: dp83822: Fix RGMII TX delay configuration · 6cf2e533
      Tim Pambor authored
      [ Upstream commit c8a5c731 ]
      
      The logic for enabling the TX clock shift is inverse of enabling the RX
      clock shift. The TX clock shift is disabled when DP83822_TX_CLK_SHIFT is
      set. Correct the current behavior and always write the delay configuration
      to ensure consistent delay settings regardless of bootloader configuration.
      
      Reference: https://www.ti.com/lit/ds/symlink/dp83822i.pdf
      
       p. 69
      
      Fixes: 80952952 ("net: phy: DP83822: Add setting the fixed internal delay")
      Signed-off-by: default avatarTim Pambor <tp@osasysteme.de>
      Link: https://lore.kernel.org/r/20240305110608.104072-1-tp@osasysteme.de
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6cf2e533
    • Tommaso Merciai's avatar
      net: phy: DP83822: enable rgmii mode if phy_interface_is_rgmii · c44a5aa4
      Tommaso Merciai authored
      [ Upstream commit 621427fb ]
      
      RGMII mode can be enable from dp83822 straps, and also writing bit 9
      of register 0x17 - RMII and Status Register (RCSR).
      When phy_interface_is_rgmii rgmii mode must be enabled, same for
      contrary, this prevents malconfigurations of hw straps
      
      References:
       - https://www.ti.com/lit/gpn/dp83822i
      
       p66
      
      Signed-off-by: default avatarTommaso Merciai <tommaso.merciai@amarulasolutions.com>
      Co-developed-by: default avatarMichael Trimarchi <michael@amarulasolutions.com>
      Suggested-by: default avatarAlberto Bianchi <alberto.bianchi@amarulasolutions.com>
      Tested-by: default avatarTommaso Merciai <tommaso.merciai@amarulasolutions.com>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: c8a5c731 ("net: phy: dp83822: Fix RGMII TX delay configuration")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c44a5aa4
    • Jie Wang's avatar
      net: hns3: fix port duplex configure error in IMP reset · a352d039
      Jie Wang authored
      
      [ Upstream commit 11d80f79 ]
      
      Currently, the mac port is fixed to configured as full dplex mode in
      hclge_mac_init() when driver initialization or reset restore. Users may
      change the mode to half duplex with ethtool,  so it may cause the user
      configuration dropped after reset.
      
      To fix it, don't change the duplex mode when resetting.
      
      Fixes: 2d03eacc ("net: hns3: Only update mac configuation when necessary")
      Signed-off-by: default avatarJie Wang <wangjie125@huawei.com>
      Signed-off-by: default avatarJijie Shao <shaojijie@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a352d039
    • Kévin L'hôpital's avatar
      net: phy: fix phy_get_internal_delay accessing an empty array · 06dd2104
      Kévin L'hôpital authored
      
      [ Upstream commit 4469c0c5 ]
      
      The phy_get_internal_delay function could try to access to an empty
      array in the case that the driver is calling phy_get_internal_delay
      without defining delay_values and rx-internal-delay-ps or
      tx-internal-delay-ps is defined to 0 in the device-tree.
      This will lead to "unable to handle kernel NULL pointer dereference at
      virtual address 0". To avoid this kernel oops, the test should be delay
      >= 0. As there is already delay < 0 test just before, the test could
      only be size == 0.
      
      Fixes: 92252eec ("net: phy: Add a helper to return the index for of the internal delay")
      Co-developed-by: default avatarEnguerrand de Ribaucourt <enguerrand.de-ribaucourt@savoirfairelinux.com>
      Signed-off-by: default avatarEnguerrand de Ribaucourt <enguerrand.de-ribaucourt@savoirfairelinux.com>
      Signed-off-by: default avatarKévin L'hôpital <kevin.lhopital@savoirfairelinux.com>
      Reviewed-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      06dd2104
    • Eric Dumazet's avatar
      net: ip_tunnel: make sure to pull inner header in ip_tunnel_rcv() · 77fd5294
      Eric Dumazet authored
      
      [ Upstream commit b0ec2abf ]
      
      Apply the same fix than ones found in :
      
      8d975c15 ("ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()")
      1ca1ba46 ("geneve: make sure to pull inner header in geneve_rx()")
      
      We have to save skb->network_header in a temporary variable
      in order to be able to recompute the network_header pointer
      after a pskb_inet_may_pull() call.
      
      pskb_inet_may_pull() makes sure the needed headers are in skb->head.
      
      syzbot reported:
      BUG: KMSAN: uninit-value in __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline]
       BUG: KMSAN: uninit-value in INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline]
       BUG: KMSAN: uninit-value in IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline]
       BUG: KMSAN: uninit-value in ip_tunnel_rcv+0xed9/0x2ed0 net/ipv4/ip_tunnel.c:409
        __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline]
        INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline]
        IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline]
        ip_tunnel_rcv+0xed9/0x2ed0 net/ipv4/ip_tunnel.c:409
        __ipgre_rcv+0x9bc/0xbc0 net/ipv4/ip_gre.c:389
        ipgre_rcv net/ipv4/ip_gre.c:411 [inline]
        gre_rcv+0x423/0x19f0 net/ipv4/ip_gre.c:447
        gre_rcv+0x2a4/0x390 net/ipv4/gre_demux.c:163
        ip_protocol_deliver_rcu+0x264/0x1300 net/ipv4/ip_input.c:205
        ip_local_deliver_finish+0x2b8/0x440 net/ipv4/ip_input.c:233
        NF_HOOK include/linux/netfilter.h:314 [inline]
        ip_local_deliver+0x21f/0x490 net/ipv4/ip_input.c:254
        dst_input include/net/dst.h:461 [inline]
        ip_rcv_finish net/ipv4/ip_input.c:449 [inline]
        NF_HOOK include/linux/netfilter.h:314 [inline]
        ip_rcv+0x46f/0x760 net/ipv4/ip_input.c:569
        __netif_receive_skb_one_core net/core/dev.c:5534 [inline]
        __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5648
        netif_receive_skb_internal net/core/dev.c:5734 [inline]
        netif_receive_skb+0x58/0x660 net/core/dev.c:5793
        tun_rx_batched+0x3ee/0x980 drivers/net/tun.c:1556
        tun_get_user+0x53b9/0x66e0 drivers/net/tun.c:2009
        tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2055
        call_write_iter include/linux/fs.h:2087 [inline]
        new_sync_write fs/read_write.c:497 [inline]
        vfs_write+0xb6b/0x1520 fs/read_write.c:590
        ksys_write+0x20f/0x4c0 fs/read_write.c:643
        __do_sys_write fs/read_write.c:655 [inline]
        __se_sys_write fs/read_write.c:652 [inline]
        __x64_sys_write+0x93/0xd0 fs/read_write.c:652
        do_syscall_x64 arch/x86/entry/common.c:52 [inline]
        do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83
       entry_SYSCALL_64_after_hwframe+0x63/0x6b
      
      Uninit was created at:
        __alloc_pages+0x9a6/0xe00 mm/page_alloc.c:4590
        alloc_pages_mpol+0x62b/0x9d0 mm/mempolicy.c:2133
        alloc_pages+0x1be/0x1e0 mm/mempolicy.c:2204
        skb_page_frag_refill+0x2bf/0x7c0 net/core/sock.c:2909
        tun_build_skb drivers/net/tun.c:1686 [inline]
        tun_get_user+0xe0a/0x66e0 drivers/net/tun.c:1826
        tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2055
        call_write_iter include/linux/fs.h:2087 [inline]
        new_sync_write fs/read_write.c:497 [inline]
        vfs_write+0xb6b/0x1520 fs/read_write.c:590
        ksys_write+0x20f/0x4c0 fs/read_write.c:643
        __do_sys_write fs/read_write.c:655 [inline]
        __se_sys_write fs/read_write.c:652 [inline]
        __x64_sys_write+0x93/0xd0 fs/read_write.c:652
        do_syscall_x64 arch/x86/entry/common.c:52 [inline]
        do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83
       entry_SYSCALL_64_after_hwframe+0x63/0x6b
      
      Fixes: c5441932 ("GRE: Refactor GRE tunneling code.")
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      77fd5294
    • Shiming Cheng's avatar
      ipv6: fib6_rules: flush route cache when rule is changed · edcec236
      Shiming Cheng authored
      
      [ Upstream commit c4386ab4 ]
      
      When rule policy is changed, ipv6 socket cache is not refreshed.
      The sock's skb still uses a outdated route cache and was sent to
      a wrong interface.
      
      To avoid this error we should update fib node's version when
      rule is changed. Then skb's route will be reroute checked as
      route cache version is already different with fib node version.
      The route cache is refreshed to match the latest rule.
      
      Fixes: 101367c2 ("[IPV6]: Policy Routing Rules")
      Signed-off-by: default avatarShiming Cheng <shiming.cheng@mediatek.com>
      Signed-off-by: default avatarLena Wang <lena.wang@mediatek.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      edcec236
    • Toke Høiland-Jørgensen's avatar
      bpf: Fix stackmap overflow check on 32-bit arches · 15641007
      Toke Høiland-Jørgensen authored
      
      [ Upstream commit 7a4b2125 ]
      
      The stackmap code relies on roundup_pow_of_two() to compute the number
      of hash buckets, and contains an overflow check by checking if the
      resulting value is 0. However, on 32-bit arches, the roundup code itself
      can overflow by doing a 32-bit left-shift of an unsigned long value,
      which is undefined behaviour, so it is not guaranteed to truncate
      neatly. This was triggered by syzbot on the DEVMAP_HASH type, which
      contains the same check, copied from the hashtab code.
      
      The commit in the fixes tag actually attempted to fix this, but the fix
      did not account for the UB, so the fix only works on CPUs where an
      overflow does result in a neat truncation to zero, which is not
      guaranteed. Checking the value before rounding does not have this
      problem.
      
      Fixes: 6183f4d3 ("bpf: Check for integer overflow when using roundup_pow_of_two()")
      Signed-off-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Reviewed-by: default avatarBui Quang Minh <minhquangbui99@gmail.com>
      Message-ID: <20240307120340.99577-4-toke@redhat.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      15641007
    • Toke Høiland-Jørgensen's avatar
      bpf: Fix hashtab overflow check on 32-bit arches · 64f00b4d
      Toke Høiland-Jørgensen authored
      
      [ Upstream commit 6787d916 ]
      
      The hashtab code relies on roundup_pow_of_two() to compute the number of
      hash buckets, and contains an overflow check by checking if the
      resulting value is 0. However, on 32-bit arches, the roundup code itself
      can overflow by doing a 32-bit left-shift of an unsigned long value,
      which is undefined behaviour, so it is not guaranteed to truncate
      neatly. This was triggered by syzbot on the DEVMAP_HASH type, which
      contains the same check, copied from the hashtab code. So apply the same
      fix to hashtab, by moving the overflow check to before the roundup.
      
      Fixes: daaf427c ("bpf: fix arraymap NULL deref and missing overflow and zero size checks")
      Signed-off-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Message-ID: <20240307120340.99577-3-toke@redhat.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      64f00b4d
    • Toke Høiland-Jørgensen's avatar
      bpf: Fix DEVMAP_HASH overflow check on 32-bit arches · 225da02a
      Toke Høiland-Jørgensen authored
      [ Upstream commit 281d464a ]
      
      The devmap code allocates a number hash buckets equal to the next power
      of two of the max_entries value provided when creating the map. When
      rounding up to the next power of two, the 32-bit variable storing the
      number of buckets can overflow, and the code checks for overflow by
      checking if the truncated 32-bit value is equal to 0. However, on 32-bit
      arches the rounding up itself can overflow mid-way through, because it
      ends up doing a left-shift of 32 bits on an unsigned long value. If the
      size of an unsigned long is four bytes, this is undefined behaviour, so
      there is no guarantee that we'll end up with a nice and tidy 0-value at
      the end.
      
      Syzbot managed to turn this into a crash on arm32 by creating a
      DEVMAP_HASH with max_entries > 0x80000000 and then trying to update it.
      Fix this by moving the overflow check to before the rounding up
      operation.
      
      Fixes: 6f9d451a ("xdp: Add devmap_hash map type for looking up devices by hashed index")
      Link: https://lore.kernel.org/r/000000000000ed666a0611af6818@google.com
      
      
      Reported-and-tested-by: default avatar <syzbot+8cd36f6b65f3cafd400a@syzkaller.appspotmail.com>
      Signed-off-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Message-ID: <20240307120340.99577-2-toke@redhat.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      225da02a
    • Roman Gushchin's avatar
      bpf: Eliminate rlimit-based memory accounting for devmap maps · 70294d8b
      Roman Gushchin authored
      
      [ Upstream commit 844f157f ]
      
      Do not use rlimit-based memory accounting for devmap maps.
      It has been replaced with the memcg-based memory accounting.
      
      Signed-off-by: default avatarRoman Gushchin <guro@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarSong Liu <songliubraving@fb.com>
      Link: https://lore.kernel.org/bpf/20201201215900.3569844-23-guro@fb.com
      
      
      Stable-dep-of: 281d464a ("bpf: Fix DEVMAP_HASH overflow check on 32-bit arches")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      70294d8b
    • Chen Ni's avatar
      sr9800: Add check for usbnet_get_endpoints · 6b4a39ac
      Chen Ni authored
      
      [ Upstream commit 07161b24 ]
      
      Add check for usbnet_get_endpoints() and return the error if it fails
      in order to transfer the error.
      
      Signed-off-by: default avatarChen Ni <nichen@iscas.ac.cn>
      Reviewed-by: default avatarSimon Horman <horms@kernel.org>
      Fixes: 19a38d8e ("USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support")
      Link: https://lore.kernel.org/r/20240305075927.261284-1-nichen@iscas.ac.cn
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6b4a39ac
    • Luiz Augusto von Dentz's avatar
      Bluetooth: hci_core: Fix possible buffer overflow · d47e6c19
      Luiz Augusto von Dentz authored
      
      [ Upstream commit 81137162 ]
      
      struct hci_dev_info has a fixed size name[8] field so in the event that
      hdev->name is bigger than that strcpy would attempt to write past its
      size, so this fixes this problem by switching to use strscpy.
      
      Fixes: dcda1657 ("Bluetooth: hci_core: Fix build warnings")
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d47e6c19
    • Jonas Dreßler's avatar
      Bluetooth: Remove superfluous call to hci_conn_check_pending() · 69d9425b
      Jonas Dreßler authored
      
      [ Upstream commit 78e3639f ]
      
      The "pending connections" feature was originally introduced with commit
      4c67bc74 ("[Bluetooth] Support concurrent connect requests") and
      6bd57416 ("[Bluetooth] Handling pending connect attempts after
      inquiry") to handle controllers supporting only a single connection request
      at a time. Later things were extended to also cancel ongoing inquiries on
      connect() with commit 89e65975 ("Bluetooth: Cancel Inquiry before
      Create Connection").
      
      With commit a9de9248 ("[Bluetooth] Switch from OGF+OCF to using only
      opcodes"), hci_conn_check_pending() was introduced as a helper to
      consolidate a few places where we check for pending connections (indicated
      by the BT_CONNECT2 flag) and then try to connect.
      
      This refactoring commit also snuck in two more calls to
      hci_conn_check_pending():
      
      - One is in the failure callback of hci_cs_inquiry(), this one probably
      makes sense: If we send an "HCI Inquiry" command and then immediately
      after a "Create Connection" command, the "Create Connection" command might
      fail before the "HCI Inquiry" command, and then we want to retry the
      "Create Connection" on failure of the "HCI Inquiry".
      
      - The other added call to hci_conn_check_pending() is in the event handler
      for the "Remote Name" event, this seems unrelated and is possibly a
      copy-paste error, so remove that one.
      
      Fixes: a9de9248 ("[Bluetooth] Switch from OGF+OCF to using only opcodes")
      Signed-off-by: default avatarJonas Dreßler <verdre@v0yd.nl>
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      69d9425b
    • Vinicius Costa Gomes's avatar
      igb: Fix missing time sync events · cbe742db
      Vinicius Costa Gomes authored
      
      [ Upstream commit ee14cc9e ]
      
      Fix "double" clearing of interrupts, which can cause external events
      or timestamps to be missed.
      
      The E1000_TSIRC Time Sync Interrupt Cause register can be cleared in two
      ways, by either reading it or by writing '1' into the specific cause
      bit. This is documented in section 8.16.1.
      
      The following flow was used:
          1. read E1000_TSIRC into 'tsicr';
          2. handle the interrupts present into 'tsirc' and mark them in 'ack';
          3. write 'ack' into E1000_TSICR;
      
      As both (1) and (3) will clear the interrupt cause, if the same
      interrupt happens again between (1) and (3) it will be ignored,
      causing events to be missed.
      
      Remove the extra clear in (3).
      
      Fixes: 00c65578 ("igb: enable internal PPS for the i210")
      Acked-by: default avatarRichard Cochran <richardcochran@gmail.com>
      Signed-off-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
      Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cbe742db
    • Ruud Bos's avatar
      igb: move PEROUT and EXTTS isr logic to separate functions · 02cba676
      Ruud Bos authored
      
      [ Upstream commit cf99c1dd ]
      
      Remove code duplication in the tsync interrupt handler function by moving
      this logic to separate functions. This keeps the interrupt handler readable
      and allows the new functions to be extended for adapter types other than
      i210.
      
      Signed-off-by: default avatarRuud Bos <kernel.hbk@gmail.com>
      Tested-by: default avatarGurucharan G <gurucharanx.g@intel.com>
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Stable-dep-of: ee14cc9e ("igb: Fix missing time sync events")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      02cba676
    • Ethan Zhao's avatar
      iommu/vt-d: Don't issue ATS Invalidation request when device is disconnected · f873b85e
      Ethan Zhao authored
      
      [ Upstream commit 4fc82cd9 ]
      
      For those endpoint devices connect to system via hotplug capable ports,
      users could request a hot reset to the device by flapping device's link
      through setting the slot's link control register, as pciehp_ist() DLLSC
      interrupt sequence response, pciehp will unload the device driver and
      then power it off. thus cause an IOMMU device-TLB invalidation (Intel
      VT-d spec, or ATS Invalidation in PCIe spec r6.1) request for non-existence
      target device to be sent and deadly loop to retry that request after ITE
      fault triggered in interrupt context.
      
      That would cause following continuous hard lockup warning and system hang
      
      [ 4211.433662] pcieport 0000:17:01.0: pciehp: Slot(108): Link Down
      [ 4211.433664] pcieport 0000:17:01.0: pciehp: Slot(108): Card not present
      [ 4223.822591] NMI watchdog: Watchdog detected hard LOCKUP on cpu 144
      [ 4223.822622] CPU: 144 PID: 1422 Comm: irq/57-pciehp Kdump: loaded Tainted: G S
               OE    kernel version xxxx
      [ 4223.822623] Hardware name: vendorname xxxx 666-106,
      BIOS 01.01.02.03.01 05/15/2023
      [ 4223.822623] RIP: 0010:qi_submit_sync+0x2c0/0x490
      [ 4223.822624] Code: 48 be 00 00 00 00 00 08 00 00 49 85 74 24 20 0f 95 c1 48 8b
       57 10 83 c1 04 83 3c 1a 03 0f 84 a2 01 00 00 49 8b 04 24 8b 70 34 <40> f6 c6 1
      0 74 17 49 8b 04 24 8b 80 80 00 00 00 89 c2 d3 fa 41 39
      [ 4223.822624] RSP: 0018:ffffc4f074f0bbb8 EFLAGS: 00000093
      [ 4223.822625] RAX: ffffc4f040059000 RBX: 0000000000000014 RCX: 0000000000000005
      [ 4223.822625] RDX: ffff9f3841315800 RSI: 0000000000000000 RDI: ffff9f38401a8340
      [ 4223.822625] RBP: ffff9f38401a8340 R08: ffffc4f074f0bc00 R09: 0000000000000000
      [ 4223.822626] R10: 0000000000000010 R11: 0000000000000018 R12: ffff9f384005e200
      [ 4223.822626] R13: 0000000000000004 R14: 0000000000000046 R15: 0000000000000004
      [ 4223.822626] FS:  0000000000000000(0000) GS:ffffa237ae400000(0000)
      knlGS:0000000000000000
      [ 4223.822627] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [ 4223.822627] CR2: 00007ffe86515d80 CR3: 000002fd3000a001 CR4: 0000000000770ee0
      [ 4223.822627] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [ 4223.822628] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400
      [ 4223.822628] PKRU: 55555554
      [ 4223.822628] Call Trace:
      [ 4223.822628]  qi_flush_dev_iotlb+0xb1/0xd0
      [ 4223.822628]  __dmar_remove_one_dev_info+0x224/0x250
      [ 4223.822629]  dmar_remove_one_dev_info+0x3e/0x50
      [ 4223.822629]  intel_iommu_release_device+0x1f/0x30
      [ 4223.822629]  iommu_release_device+0x33/0x60
      [ 4223.822629]  iommu_bus_notifier+0x7f/0x90
      [ 4223.822630]  blocking_notifier_call_chain+0x60/0x90
      [ 4223.822630]  device_del+0x2e5/0x420
      [ 4223.822630]  pci_remove_bus_device+0x70/0x110
      [ 4223.822630]  pciehp_unconfigure_device+0x7c/0x130
      [ 4223.822631]  pciehp_disable_slot+0x6b/0x100
      [ 4223.822631]  pciehp_handle_presence_or_link_change+0xd8/0x320
      [ 4223.822631]  pciehp_ist+0x176/0x180
      [ 4223.822631]  ? irq_finalize_oneshot.part.50+0x110/0x110
      [ 4223.822632]  irq_thread_fn+0x19/0x50
      [ 4223.822632]  irq_thread+0x104/0x190
      [ 4223.822632]  ? irq_forced_thread_fn+0x90/0x90
      [ 4223.822632]  ? irq_thread_check_affinity+0xe0/0xe0
      [ 4223.822633]  kthread+0x114/0x130
      [ 4223.822633]  ? __kthread_cancel_work+0x40/0x40
      [ 4223.822633]  ret_from_fork+0x1f/0x30
      [ 4223.822633] Kernel panic - not syncing: Hard LOCKUP
      [ 4223.822634] CPU: 144 PID: 1422 Comm: irq/57-pciehp Kdump: loaded Tainted: G S
               OE     kernel version xxxx
      [ 4223.822634] Hardware name: vendorname xxxx 666-106,
      BIOS 01.01.02.03.01 05/15/2023
      [ 4223.822634] Call Trace:
      [ 4223.822634]  <NMI>
      [ 4223.822635]  dump_stack+0x6d/0x88
      [ 4223.822635]  panic+0x101/0x2d0
      [ 4223.822635]  ? ret_from_fork+0x11/0x30
      [ 4223.822635]  nmi_panic.cold.14+0xc/0xc
      [ 4223.822636]  watchdog_overflow_callback.cold.8+0x6d/0x81
      [ 4223.822636]  __perf_event_overflow+0x4f/0xf0
      [ 4223.822636]  handle_pmi_common+0x1ef/0x290
      [ 4223.822636]  ? __set_pte_vaddr+0x28/0x40
      [ 4223.822637]  ? flush_tlb_one_kernel+0xa/0x20
      [ 4223.822637]  ? __native_set_fixmap+0x24/0x30
      [ 4223.822637]  ? ghes_copy_tofrom_phys+0x70/0x100
      [ 4223.822637]  ? __ghes_peek_estatus.isra.16+0x49/0xa0
      [ 4223.822637]  intel_pmu_handle_irq+0xba/0x2b0
      [ 4223.822638]  perf_event_nmi_handler+0x24/0x40
      [ 4223.822638]  nmi_handle+0x4d/0xf0
      [ 4223.822638]  default_do_nmi+0x49/0x100
      [ 4223.822638]  exc_nmi+0x134/0x180
      [ 4223.822639]  end_repeat_nmi+0x16/0x67
      [ 4223.822639] RIP: 0010:qi_submit_sync+0x2c0/0x490
      [ 4223.822639] Code: 48 be 00 00 00 00 00 08 00 00 49 85 74 24 20 0f 95 c1 48 8b
       57 10 83 c1 04 83 3c 1a 03 0f 84 a2 01 00 00 49 8b 04 24 8b 70 34 <40> f6 c6 10
       74 17 49 8b 04 24 8b 80 80 00 00 00 89 c2 d3 fa 41 39
      [ 4223.822640] RSP: 0018:ffffc4f074f0bbb8 EFLAGS: 00000093
      [ 4223.822640] RAX: ffffc4f040059000 RBX: 0000000000000014 RCX: 0000000000000005
      [ 4223.822640] RDX: ffff9f3841315800 RSI: 0000000000000000 RDI: ffff9f38401a8340
      [ 4223.822641] RBP: ffff9f38401a8340 R08: ffffc4f074f0bc00 R09: 0000000000000000
      [ 4223.822641] R10: 0000000000000010 R11: 0000000000000018 R12: ffff9f384005e200
      [ 4223.822641] R13: 0000000000000004 R14: 0000000000000046 R15: 0000000000000004
      [ 4223.822641]  ? qi_submit_sync+0x2c0/0x490
      [ 4223.822642]  ? qi_submit_sync+0x2c0/0x490
      [ 4223.822642]  </NMI>
      [ 4223.822642]  qi_flush_dev_iotlb+0xb1/0xd0
      [ 4223.822642]  __dmar_remove_one_dev_info+0x224/0x250
      [ 4223.822643]  dmar_remove_one_dev_info+0x3e/0x50
      [ 4223.822643]  intel_iommu_release_device+0x1f/0x30
      [ 4223.822643]  iommu_release_device+0x33/0x60
      [ 4223.822643]  iommu_bus_notifier+0x7f/0x90
      [ 4223.822644]  blocking_notifier_call_chain+0x60/0x90
      [ 4223.822644]  device_del+0x2e5/0x420
      [ 4223.822644]  pci_remove_bus_device+0x70/0x110
      [ 4223.822644]  pciehp_unconfigure_device+0x7c/0x130
      [ 4223.822644]  pciehp_disable_slot+0x6b/0x100
      [ 4223.822645]  pciehp_handle_presence_or_link_change+0xd8/0x320
      [ 4223.822645]  pciehp_ist+0x176/0x180
      [ 4223.822645]  ? irq_finalize_oneshot.part.50+0x110/0x110
      [ 4223.822645]  irq_thread_fn+0x19/0x50
      [ 4223.822646]  irq_thread+0x104/0x190
      [ 4223.822646]  ? irq_forced_thread_fn+0x90/0x90
      [ 4223.822646]  ? irq_thread_check_affinity+0xe0/0xe0
      [ 4223.822646]  kthread+0x114/0x130
      [ 4223.822647]  ? __kthread_cancel_work+0x40/0x40
      [ 4223.822647]  ret_from_fork+0x1f/0x30
      [ 4223.822647] Kernel Offset: 0x6400000 from 0xffffffff81000000 (relocation
      range: 0xffffffff80000000-0xffffffffbfffffff)
      
      Such issue could be triggered by all kinds of regular surprise removal
      hotplug operation. like:
      
      1. pull EP(endpoint device) out directly.
      2. turn off EP's power.
      3. bring the link down.
      etc.
      
      this patch aims to work for regular safe removal and surprise removal
      unplug. these hot unplug handling process could be optimized for fix the
      ATS Invalidation hang issue by calling pci_dev_is_disconnected() in
      function devtlb_invalidation_with_pasid() to check target device state to
      avoid sending meaningless ATS Invalidation request to iommu when device is
      gone. (see IMPLEMENTATION NOTE in PCIe spec r6.1 section 10.3.1)
      
      For safe removal, device wouldn't be removed until the whole software
      handling process is done, it wouldn't trigger the hard lock up issue
      caused by too long ATS Invalidation timeout wait. In safe removal path,
      device state isn't set to pci_channel_io_perm_failure in
      pciehp_unconfigure_device() by checking 'presence' parameter, calling
      pci_dev_is_disconnected() in devtlb_invalidation_with_pasid() will return
      false there, wouldn't break the function.
      
      For surprise removal, device state is set to pci_channel_io_perm_failure in
      pciehp_unconfigure_device(), means device is already gone (disconnected)
      call pci_dev_is_disconnected() in devtlb_invalidation_with_pasid() will
      return true to break the function not to send ATS Invalidation request to
      the disconnected device blindly, thus avoid to trigger further ITE fault,
      and ITE fault will block all invalidation request to be handled.
      furthermore retry the timeout request could trigger hard lockup.
      
      safe removal (present) & surprise removal (not present)
      
      pciehp_ist()
         pciehp_handle_presence_or_link_change()
           pciehp_disable_slot()
             remove_board()
               pciehp_unconfigure_device(presence) {
                 if (!presence)
                      pci_walk_bus(parent, pci_dev_set_disconnected, NULL);
                 }
      
      this patch works for regular safe removal and surprise removal of ATS
      capable endpoint on PCIe switch downstream ports.
      
      Fixes: 6f7db75e ("iommu/vt-d: Add second level page table interface")
      Reviewed-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
      Tested-by: default avatarHaorong Ye <yehaorong@bytedance.com>
      Signed-off-by: default avatarEthan Zhao <haifeng.zhao@linux.intel.com>
      Link: https://lore.kernel.org/r/20240301080727.3529832-3-haifeng.zhao@linux.intel.com
      
      
      Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f873b85e
    • Ethan Zhao's avatar
      PCI: Make pci_dev_is_disconnected() helper public for other drivers · f858c084
      Ethan Zhao authored
      
      [ Upstream commit 39714fd7 ]
      
      Make pci_dev_is_disconnected() public so that it can be called from
      Intel VT-d driver to quickly fix/workaround the surprise removal
      unplug hang issue for those ATS capable devices on PCIe switch downstream
      hotplug capable ports.
      
      Beside pci_device_is_present() function, this one has no config space
      space access, so is light enough to optimize the normal pure surprise
      removal and safe removal flow.
      
      Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
      Reviewed-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
      Tested-by: default avatarHaorong Ye <yehaorong@bytedance.com>
      Signed-off-by: default avatarEthan Zhao <haifeng.zhao@linux.intel.com>
      Link: https://lore.kernel.org/r/20240301080727.3529832-2-haifeng.zhao@linux.intel.com
      
      
      Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Stable-dep-of: 4fc82cd9 ("iommu/vt-d: Don't issue ATS Invalidation request when device is disconnected")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f858c084
    • Bitterblue Smith's avatar
      wifi: rtw88: 8821c: Fix false alarm count · 722c24cd
      Bitterblue Smith authored
      
      [ Upstream commit c238adbc ]
      
      total_fa_cnt is supposed to include cck_fa_cnt and ofdm_fa_cnt, not just
      ofdm_fa_cnt.
      
      Fixes: 96036123 ("rtw88: 8821c: add false alarm statistics")
      Signed-off-by: default avatarBitterblue Smith <rtl8821cerfe2@gmail.com>
      Acked-by: default avatarPing-Ke Shih <pkshih@realtek.com>
      Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
      Link: https://msgid.link/f3cb6d17-e4e4-44a7-9c9b-72aed994b5c9@gmail.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      722c24cd
    • Christophe JAILLET's avatar
      mmc: wmt-sdmmc: remove an incorrect release_mem_region() call in the .remove function · c55cc636
      Christophe JAILLET authored
      
      [ Upstream commit ae5004a4 ]
      
      This looks strange to call release_mem_region() in a remove function
      without any request_mem_region() in the probe or "struct resource"
      somewhere.
      
      So remove the corresponding code.
      
      Fixes: 3a96dff0 ("mmc: SD/MMC Host Controller for Wondermedia WM8505/WM8650")
      Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
      Link: https://lore.kernel.org/r/bb0bb1ed1e18de55e8c0547625bde271e64b8c31.1708983064.git.christophe.jaillet@wanadoo.fr
      
      
      Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c55cc636
    • Zhipeng Lu's avatar
      SUNRPC: fix some memleaks in gssx_dec_option_array · bb336cd8
      Zhipeng Lu authored
      
      [ Upstream commit 3cfcfc10 ]
      
      The creds and oa->data need to be freed in the error-handling paths after
      their allocation. So this patch add these deallocations in the
      corresponding paths.
      
      Fixes: 1d658336 ("SUNRPC: Add RPC based upcall mechanism for RPCGSS auth")
      Signed-off-by: default avatarZhipeng Lu <alexious@zju.edu.cn>
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      bb336cd8
    • Kees Cook's avatar
      x86, relocs: Ignore relocations in .notes section · a4e7ff1a
      Kees Cook authored
      
      [ Upstream commit aaa87363 ]
      
      When building with CONFIG_XEN_PV=y, .text symbols are emitted into
      the .notes section so that Xen can find the "startup_xen" entry point.
      This information is used prior to booting the kernel, so relocations
      are not useful. In fact, performing relocations against the .notes
      section means that the KASLR base is exposed since /sys/kernel/notes
      is world-readable.
      
      To avoid leaking the KASLR base without breaking unprivileged tools that
      are expecting to read /sys/kernel/notes, skip performing relocations in
      the .notes section. The values readable in .notes are then identical to
      those found in System.map.
      
      Reported-by: default avatarGuixiong Wei <guixiongwei@gmail.com>
      Closes: https://lore.kernel.org/all/20240218073501.54555-1-guixiongwei@gmail.com/
      
      
      Fixes: 5ead97c8 ("xen: Core Xen implementation")
      Fixes: da1a679c ("Add /sys/kernel/notes")
      Reviewed-by: default avatarJuergen Gross <jgross@suse.com>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a4e7ff1a
    • Rafael J. Wysocki's avatar
      ACPI: scan: Fix device check notification handling · 47a429a5
      Rafael J. Wysocki authored
      
      [ Upstream commit 793551c9 ]
      
      It is generally invalid to fail a Device Check notification if the scan
      handler has not been attached to the given device after a bus rescan,
      because there may be valid reasons for the scan handler to refuse
      attaching to the device (for example, the device is not ready).
      
      For this reason, modify acpi_scan_device_check() to return 0 in that
      case without printing a warning.
      
      While at it, reduce the log level of the "already enumerated" message
      in the same function, because it is only interesting when debugging
      notification handling
      
      Fixes: 443fc820 ("ACPI / hotplug: Rework generic code to handle suprise removals")
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      47a429a5
    • Rafał Miłecki's avatar
      arm64: dts: marvell: reorder crypto interrupts on Armada SoCs · 5f99b46d
      Rafał Miłecki authored
      [ Upstream commit ec55a221 ]
      
      Match order specified in binding documentation. It says "mem" should be
      the last interrupt.
      
      This fixes:
      arch/arm64/boot/dts/marvell/armada-3720-db.dtb: crypto@90000: interrupt-names:0: 'ring0' was expected
              from schema $id: http://devicetree.org/schemas/crypto/inside-secure,safexcel.yaml#
      arch/arm64/boot/dts/marvell/armada-3720-db.dtb: crypto@90000: interrupt-names:1: 'ring1' was expected
              from schema $id: http://devicetree.org/schemas/crypto/inside-secure,safexcel.yaml#
      arch/arm64/boot/dts/marvell/armada-3720-db.dtb: crypto@90000: interrupt-names:2: 'ring2' was expected
              from schema $id: http://devicetree.org/schemas/crypto/inside-secure,safexcel.yaml#
      arch/arm64/boot/dts/marvell/armada-3720-db.dtb: crypto@90000: interrupt-names:3: 'ring3' was expected
              from schema $id: http://devicetree.org/schemas/crypto/inside-secure,safexcel.yaml#
      arch/arm64/boot/dts/marvell/armada-3720-db.dtb: crypto@90000: interrupt-names:4: 'eip' was expected
              from schema $id: http://devicetree.org/schemas/crypto/inside-secure,safexcel.yaml#
      arch/arm64/boot/dts/marvell/armada-3720-db.dtb: crypto@90000: interrupt-names:5: 'mem' was expected
              from schema $id: http://devicetree.org/schemas/crypto/inside-secure,safexcel.yaml#
      
      
      
      Signed-off-by: default avatarRafał Miłecki <rafal@milecki.pl>
      Signed-off-by: default avatarGregory CLEMENT <gregory.clement@bootlin.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5f99b46d
    • Michal Vokáč's avatar
      ARM: dts: imx6dl-yapp4: Move the internal switch PHYs under the switch node · 46792f9b
      Michal Vokáč authored
      
      [ Upstream commit 79978bff ]
      
      We identified that the PHYs actually do not work since commit 7da7b84f
      ("ARM: dts: imx6dl-yapp4: Move phy reset into switch node") as
      a coincidence of several circumstances.
      
      The reset signal is kept asserted by a pull-down resistor on the board
      unless it is deasserted by GPIO from the SoC. This is to keep the switch
      dead until it is configured properly by the kernel and user space.
      
      Prior to the referenced commit the switch was reset by the FEC driver
      and the reset GPIO was actively deasserted. The mdio-bus was scanned
      and the attached switch and its PHYs were found and configured.
      
      With the referenced commit the switch is reset by the qca8k driver.
      Because of another bug in the qca8k driver, functionality of the reset
      pin depends on its pre-kernel configuration. See commit c44fc98f
      ("net: dsa: qca8k: fix illegal usage of GPIO")
      
      The problem did not appear until we removed support for the switch
      and configuration of its reset pin from the bootloader.
      
      To fix that, properly describe the internal mdio-bus configuration of
      the qca8334 switch. The PHYs are internal to the switch and sit on its
      internal mdio-bus.
      
      Fixes: 7da7b84f ("ARM: dts: imx6dl-yapp4: Move phy reset into switch node")
      Signed-off-by: default avatarMichal Vokáč <michal.vokac@ysoft.com>
      Signed-off-by: default avatarShawn Guo <shawnguo@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      46792f9b
    • Michal Vokáč's avatar
      ARM: dts: imx6dl-yapp4: Fix typo in the QCA switch register address · 2d1e5157
      Michal Vokáč authored
      
      [ Upstream commit 023bd910 ]
      
      This change does not have any functional effect. The switch works just
      fine without this patch as it has full access to all the addresses
      on the bus. This is simply a clean-up to set the node name address
      and reg address to the same value.
      
      Fixes: 15b43e49 ("ARM: dts: imx6dl-yapp4: Use correct pseudo PHY address for the switch")
      Signed-off-by: default avatarMichal Vokáč <michal.vokac@ysoft.com>
      Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarShawn Guo <shawnguo@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2d1e5157
    • Michal Vokáč's avatar
      ARM: dts: imx6dl-yapp4: Move phy reset into switch node · 23d05494
      Michal Vokáč authored
      
      [ Upstream commit 7da7b84f ]
      
      Drop the phy-reset-duration and phy-reset-gpios deprecated properties and
      move reset-gpios under the switch node.
      
      Signed-off-by: default avatarMichal Vokáč <michal.vokac@ysoft.com>
      Signed-off-by: default avatarShawn Guo <shawnguo@kernel.org>
      Stable-dep-of: 023bd910 ("ARM: dts: imx6dl-yapp4: Fix typo in the QCA switch register address")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      23d05494
    • Geert Uytterhoeven's avatar
      ARM: dts: arm: realview: Fix development chip ROM compatible value · 229563e2
      Geert Uytterhoeven authored
      
      [ Upstream commit 3baa4c51 ]
      
      When the development chip ROM was added, the "direct-mapped" compatible
      value was already obsolete.  In addition, the device node lacked the
      accompanying "probe-type" property, causing the old physmap_of_core
      driver to fall back to trying all available probe types.
      Unfortunately this fallback was lost when the DT and pdata cases were
      merged.
      
      Fix this by using the modern "mtd-rom" compatible value instead.
      
      Fixes: 5c3f5edb ("ARM: realview: add flash devices to the PB1176 DTS")
      Fixes: 642b1e8d ("mtd: maps: Merge physmap_of.c into physmap-core.c")
      Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      229563e2
    • Kamal Heib's avatar
      net: ena: Remove ena_select_queue · 2478026f
      Kamal Heib authored
      
      [ Upstream commit 78e886ba ]
      
      Avoid the following warnings by removing the ena_select_queue() function
      and rely on the net core to do the queue selection, The issue happen
      when an skb received from an interface with more queues than ena is
      forwarded to the ena interface.
      
      [ 1176.159959] eth0 selects TX queue 11, but real number of TX queues is 8
      [ 1176.863976] eth0 selects TX queue 14, but real number of TX queues is 8
      [ 1180.767877] eth0 selects TX queue 14, but real number of TX queues is 8
      [ 1188.703742] eth0 selects TX queue 14, but real number of TX queues is 8
      
      Fixes: 1738cd3e ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
      Signed-off-by: default avatarKamal Heib <kheib@redhat.com>
      Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2478026f
    • Arnd Bergmann's avatar
      wifi: brcmsmac: avoid function pointer casts · 98d186a1
      Arnd Bergmann authored
      
      [ Upstream commit e1ea6db3 ]
      
      An old cleanup went a little too far and causes a warning with clang-16
      and higher as it breaks control flow integrity (KCFI) rules:
      
      drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c:64:34: error: cast from 'void (*)(struct brcms_phy *)' to 'void (*)(void *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict]
         64 |                         brcms_init_timer(physhim->wl, (void (*)(void *))fn,
            |                                                       ^~~~~~~~~~~~~~~~~~~~
      
      Change this one instance back to passing a void pointer so it can be
      used with the timer callback interface.
      
      Fixes: d89a4c80 ("staging: brcm80211: removed void * from softmac phy")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Acked-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
      Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
      Link: https://msgid.link/20240213100548.457854-1-arnd@kernel.org
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      98d186a1
    • Mario Limonciello's avatar
      iommu/amd: Mark interrupt as managed · fb7601eb
      Mario Limonciello authored
      [ Upstream commit 0feda94c ]
      
      On many systems that have an AMD IOMMU the following sequence of
      warnings is observed during bootup.
      
      ```
      pci 0000:00:00.2  can't derive routing for PCI INT A
      pci 0000:00:00.2: PCI INT A: not connected
      ```
      
      This series of events happens because of the IOMMU initialization
      sequence order and the lack of _PRT entries for the IOMMU.
      
      During initialization the IOMMU driver first enables the PCI device
      using pci_enable_device().  This will call acpi_pci_irq_enable()
      which will check if the interrupt is declared in a PCI routing table
      (_PRT) entry. According to the PCI spec [1] these routing entries
      are only required under PCI root bridges:
      	The _PRT object is required under all PCI root bridges
      
      The IOMMU is directly connected to the root complex, so there is no
      parent bridge to look for a _PRT entry. The first warning is emitted
      since no entry could be found in the hierarchy. The second warning is
      then emitted because the interrupt hasn't yet been configured to any
      value.  The pin was configured in pci_read_irq() but the byte in
      PCI_INTERRUPT_LINE return 0xff which means "Unknown".
      
      After that sequence of events pci_enable_msi() is called and this
      will allocate an interrupt.
      
      That is both of these warnings are totally harmless because the IOMMU
      uses MSI for interrupts.  To avoid even trying to probe for a _PRT
      entry mark the IOMMU as IRQ managed. This avoids both warnings.
      
      Link: https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/06_Device_Configuration/Device_Configuration.html?highlight=_prt#prt-pci-routing-table
      
       [1]
      Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
      Fixes: cffe0a2b ("x86, irq: Keep balance of IOAPIC pin reference count")
      Reviewed-by: default avatarVasant Hegde <vasant.hegde@amd.com>
      Link: https://lore.kernel.org/r/20240122233400.1802-1-mario.limonciello@amd.com
      
      
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fb7601eb
    • Peter Robinson's avatar
      bus: tegra-aconnect: Update dependency to ARCH_TEGRA · be8c5339
      Peter Robinson authored
      
      [ Upstream commit 4acd21a4 ]
      
      Update the architecture dependency to be the generic Tegra
      because the driver works on the four latest Tegra generations
      not just Tegra210, if you build a kernel with a specific
      ARCH_TEGRA_xxx_SOC option that excludes Tegra210 you don't get
      this driver.
      
      Fixes: 46a88534 ("bus: Add support for Tegra ACONNECT")
      Signed-off-by: default avatarPeter Robinson <pbrobinson@gmail.com>
      Cc: Jon Hunter <jonathanh@nvidia.com>
      Cc: Thierry Reding <treding@nvidia.com>
      Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      be8c5339
    • Armin Wolf's avatar
      ACPI: processor_idle: Fix memory leak in acpi_processor_power_exit() · c2a30c81
      Armin Wolf authored
      
      [ Upstream commit e18afcb7 ]
      
      After unregistering the CPU idle device, the memory associated with
      it is not freed, leading to a memory leak:
      
      unreferenced object 0xffff896282f6c000 (size 1024):
        comm "swapper/0", pid 1, jiffies 4294893170
        hex dump (first 32 bytes):
          00 00 00 00 0b 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        backtrace (crc 8836a742):
          [<ffffffff993495ed>] kmalloc_trace+0x29d/0x340
          [<ffffffff9972f3b3>] acpi_processor_power_init+0xf3/0x1c0
          [<ffffffff9972d263>] __acpi_processor_start+0xd3/0xf0
          [<ffffffff9972d2bc>] acpi_processor_start+0x2c/0x50
          [<ffffffff99805872>] really_probe+0xe2/0x480
          [<ffffffff99805c98>] __driver_probe_device+0x78/0x160
          [<ffffffff99805daf>] driver_probe_device+0x1f/0x90
          [<ffffffff9980601e>] __driver_attach+0xce/0x1c0
          [<ffffffff99803170>] bus_for_each_dev+0x70/0xc0
          [<ffffffff99804822>] bus_add_driver+0x112/0x210
          [<ffffffff99807245>] driver_register+0x55/0x100
          [<ffffffff9aee4acb>] acpi_processor_driver_init+0x3b/0xc0
          [<ffffffff990012d1>] do_one_initcall+0x41/0x300
          [<ffffffff9ae7c4b0>] kernel_init_freeable+0x320/0x470
          [<ffffffff99b231f6>] kernel_init+0x16/0x1b0
          [<ffffffff99042e6d>] ret_from_fork+0x2d/0x50
      
      Fix this by freeing the CPU idle device after unregistering it.
      
      Fixes: 3d339dcb ("cpuidle / ACPI : move cpuidle_device field out of the acpi_processor_power structure")
      Signed-off-by: default avatarArmin Wolf <W_Armin@gmx.de>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c2a30c81
    • Alexis Lothoré's avatar
      wifi: wilc1000: prevent use-after-free on vif when cleaning up all interfaces · 5956f420
      Alexis Lothoré authored
      [ Upstream commit cb5942b7 ]
      
      wilc_netdev_cleanup currently triggers a KASAN warning, which can be
      observed on interface registration error path, or simply by
      removing the module/unbinding device from driver:
      
      echo spi0.1 > /sys/bus/spi/drivers/wilc1000_spi/unbind
      
      ==================================================================
      BUG: KASAN: slab-use-after-free in wilc_netdev_cleanup+0x508/0x5cc
      Read of size 4 at addr c54d1ce8 by task sh/86
      
      CPU: 0 PID: 86 Comm: sh Not tainted 6.8.0-rc1+ #117
      Hardware name: Atmel SAMA5
       unwind_backtrace from show_stack+0x18/0x1c
       show_stack from dump_stack_lvl+0x34/0x58
       dump_stack_lvl from print_report+0x154/0x500
       print_report from kasan_report+0xac/0xd8
       kasan_report from wilc_netdev_cleanup+0x508/0x5cc
       wilc_netdev_cleanup from wilc_bus_remove+0xc8/0xec
       wilc_bus_remove from spi_remove+0x8c/0xac
       spi_remove from device_release_driver_internal+0x434/0x5f8
       device_release_driver_internal from unbind_store+0xbc/0x108
       unbind_store from kernfs_fop_write_iter+0x398/0x584
       kernfs_fop_write_iter from vfs_write+0x728/0xf88
       vfs_write from ksys_write+0x110/0x1e4
       ksys_write from ret_fast_syscall+0x0/0x1c
      
      [...]
      
      Allocated by task 1:
       kasan_save_track+0x30/0x5c
       __kasan_kmalloc+0x8c/0x94
       __kmalloc_node+0x1cc/0x3e4
       kvmalloc_node+0x48/0x180
       alloc_netdev_mqs+0x68/0x11dc
       alloc_etherdev_mqs+0x28/0x34
       wilc_netdev_ifc_init+0x34/0x8ec
       wilc_cfg80211_init+0x690/0x910
       wilc_bus_probe+0xe0/0x4a0
       spi_probe+0x158/0x1b0
       really_probe+0x270/0xdf4
       __driver_probe_device+0x1dc/0x580
       driver_probe_device+0x60/0x140
       __driver_attach+0x228/0x5d4
       bus_for_each_dev+0x13c/0x1a8
       bus_add_driver+0x2a0/0x608
       driver_register+0x24c/0x578
       do_one_initcall+0x180/0x310
       kernel_init_freeable+0x424/0x484
       kernel_init+0x20/0x148
       ret_from_fork+0x14/0x28
      
      Freed by task 86:
       kasan_save_track+0x30/0x5c
       kasan_save_free_info+0x38/0x58
       __kasan_slab_free+0xe4/0x140
       kfree+0xb0/0x238
       device_release+0xc0/0x2a8
       kobject_put+0x1d4/0x46c
       netdev_run_todo+0x8fc/0x11d0
       wilc_netdev_cleanup+0x1e4/0x5cc
       wilc_bus_remove+0xc8/0xec
       spi_remove+0x8c/0xac
       device_release_driver_internal+0x434/0x5f8
       unbind_store+0xbc/0x108
       kernfs_fop_write_iter+0x398/0x584
       vfs_write+0x728/0xf88
       ksys_write+0x110/0x1e4
       ret_fast_syscall+0x0/0x1c
       [...]
      
      David Mosberger-Tan initial investigation [1] showed that this
      use-after-free is due to netdevice unregistration during vif list
      traversal. When unregistering a net device, since the needs_free_netdev has
      been set to true during registration, the netdevice object is also freed,
      and as a consequence, the corresponding vif object too, since it is
      attached to it as private netdevice data. The next occurrence of the loop
      then tries to access freed vif pointer to the list to move forward in the
      list.
      
      Fix this use-after-free thanks to two mechanisms:
      - navigate in the list with list_for_each_entry_safe, which allows to
        safely modify the list as we go through each element. For each element,
        remove it from the list with list_del_rcu
      - make sure to wait for RCU grace period end after each vif removal to make
        sure it is safe to free the corresponding vif too (through
        unregister_netdev)
      
      Since we are in a RCU "modifier" path (not a "reader" path), and because
      such path is expected not to be concurrent to any other modifier (we are
      using the vif_mutex lock), we do not need to use RCU list API, that's why
      we can benefit from list_for_each_entry_safe.
      
      [1] https://lore.kernel.org/linux-wireless/ab077dbe58b1ea5de0a3b2ca21f275a07af967d2.camel@egauge.net/
      
      
      
      Fixes: 8399918f ("staging: wilc1000: use RCU list to maintain vif interfaces list")
      Signed-off-by: default avatarAlexis Lothoré <alexis.lothore@bootlin.com>
      Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
      Link: https://msgid.link/20240212-wilc_rework_deinit-v1-1-9203ae56c27f@bootlin.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5956f420
    • Christophe JAILLET's avatar
      wireless: Remove redundant 'flush_workqueue()' calls · 115252fc
      Christophe JAILLET authored
      
      [ Upstream commit ff1cc2fa ]
      
      'destroy_workqueue()' already drains the queue before destroying it, so
      there is no need to flush it explicitly.
      
      Remove the redundant 'flush_workqueue()' calls.
      
      This was generated with coccinelle:
      
      @@
      expression E;
      @@
      - 	flush_workqueue(E);
      	destroy_workqueue(E);
      
      Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      Link: https://lore.kernel.org/r/0855d51423578ad019c0264dad3fe47a2e8af9c7.1633849511.git.christophe.jaillet@wanadoo.fr
      
      
      Stable-dep-of: cb5942b7 ("wifi: wilc1000: prevent use-after-free on vif when cleaning up all interfaces")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      115252fc
Loading