Skip to content
Snippets Groups Projects
  1. Oct 03, 2024
  2. Oct 02, 2024
    • Al Viro's avatar
      move asm/unaligned.h to linux/unaligned.h · 5f60d5f6
      Al Viro authored
      asm/unaligned.h is always an include of asm-generic/unaligned.h;
      might as well move that thing to linux/unaligned.h and include
      that - there's nothing arch-specific in that header.
      
      auto-generated by the following:
      
      for i in `git grep -l -w asm/unaligned.h`; do
      	sed -i -e "s/asm\/unaligned.h/linux\/unaligned.h/" $i
      done
      for i in `git grep -l -w asm-generic/unaligned.h`; do
      	sed -i -e "s/asm-generic\/unaligned.h/linux\/unaligned.h/" $i
      done
      git mv include/asm-generic/unaligned.h include/linux/unaligned.h
      git mv tools/include/asm-generic/unaligned.h tools/include/linux/unaligned.h
      sed -i -e "/unaligned.h/d" include/asm-generic/Kbuild
      sed -i -e "s/__ASM_GENERIC/__LINUX/" include/linux/unaligned.h tools/include/linux/unaligned.h
      5f60d5f6
  3. Oct 01, 2024
    • Anton Danilov's avatar
      ipv4: ip_gre: Fix drops of small packets in ipgre_xmit · c4a14f6d
      Anton Danilov authored and Paolo Abeni's avatar Paolo Abeni committed
      
      Regression Description:
      
      Depending on the options specified for the GRE tunnel device, small
      packets may be dropped. This occurs because the pskb_network_may_pull
      function fails due to the packet's insufficient length.
      
      For example, if only the okey option is specified for the tunnel device,
      original (before encapsulation) packets smaller than 28 bytes (including
      the IPv4 header) will be dropped. This happens because the required
      length is calculated relative to the network header, not the skb->head.
      
      Here is how the required length is computed and checked:
      
      * The pull_len variable is set to 28 bytes, consisting of:
        * IPv4 header: 20 bytes
        * GRE header with Key field: 8 bytes
      
      * The pskb_network_may_pull function adds the network offset, shifting
      the checkable space further to the beginning of the network header and
      extending it to the beginning of the packet. As a result, the end of
      the checkable space occurs beyond the actual end of the packet.
      
      Instead of ensuring that 28 bytes are present in skb->head, the function
      is requesting these 28 bytes starting from the network header. For small
      packets, this requested length exceeds the actual packet size, causing
      the check to fail and the packets to be dropped.
      
      This issue affects both locally originated and forwarded packets in
      DMVPN-like setups.
      
      How to reproduce (for local originated packets):
      
        ip link add dev gre1 type gre ikey 1.9.8.4 okey 1.9.8.4 \
                local <your-ip> remote 0.0.0.0
      
        ip link set mtu 1400 dev gre1
        ip link set up dev gre1
        ip address add 192.168.13.1/24 dev gre1
        ip neighbor add 192.168.13.2 lladdr <remote-ip> dev gre1
        ping -s 1374 -c 10 192.168.13.2
        tcpdump -vni gre1
        tcpdump -vni <your-ext-iface> 'ip proto 47'
        ip -s -s -d link show dev gre1
      
      Solution:
      
      Use the pskb_may_pull function instead the pskb_network_may_pull.
      
      Fixes: 80d875cf ("ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()")
      Signed-off-by: default avatarAnton Danilov <littlesmilingcloud@gmail.com>
      Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
      Link: https://patch.msgid.link/20240924235158.106062-1-littlesmilingcloud@gmail.com
      
      
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      c4a14f6d
    • Eric Dumazet's avatar
      net: add more sanity checks to qdisc_pkt_len_init() · ab9a9a9e
      Eric Dumazet authored and Paolo Abeni's avatar Paolo Abeni committed
      
      One path takes care of SKB_GSO_DODGY, assuming
      skb->len is bigger than hdr_len.
      
      virtio_net_hdr_to_skb() does not fully dissect TCP headers,
      it only make sure it is at least 20 bytes.
      
      It is possible for an user to provide a malicious 'GSO' packet,
      total length of 80 bytes.
      
      - 20 bytes of IPv4 header
      - 60 bytes TCP header
      - a small gso_size like 8
      
      virtio_net_hdr_to_skb() would declare this packet as a normal
      GSO packet, because it would see 40 bytes of payload,
      bigger than gso_size.
      
      We need to make detect this case to not underflow
      qdisc_skb_cb(skb)->pkt_len.
      
      Fixes: 1def9238 ("net_sched: more precise pkt_len computation")
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      ab9a9a9e
    • Eric Dumazet's avatar
      net: avoid potential underflow in qdisc_pkt_len_init() with UFO · c20029db
      Eric Dumazet authored and Paolo Abeni's avatar Paolo Abeni committed
      
      After commit 7c6d2ecb ("net: be more gentle about silly gso
      requests coming from user") virtio_net_hdr_to_skb() had sanity check
      to detect malicious attempts from user space to cook a bad GSO packet.
      
      Then commit cf9acc90 ("net: virtio_net_hdr_to_skb: count
      transport header in UFO") while fixing one issue, allowed user space
      to cook a GSO packet with the following characteristic :
      
      IPv4 SKB_GSO_UDP, gso_size=3, skb->len = 28.
      
      When this packet arrives in qdisc_pkt_len_init(), we end up
      with hdr_len = 28 (IPv4 header + UDP header), matching skb->len
      
      Then the following sets gso_segs to 0 :
      
      gso_segs = DIV_ROUND_UP(skb->len - hdr_len,
                              shinfo->gso_size);
      
      Then later we set qdisc_skb_cb(skb)->pkt_len to back to zero :/
      
      qdisc_skb_cb(skb)->pkt_len += (gso_segs - 1) * hdr_len;
      
      This leads to the following crash in fq_codel [1]
      
      qdisc_pkt_len_init() is best effort, we only want an estimation
      of the bytes sent on the wire, not crashing the kernel.
      
      This patch is fixing this particular issue, a following one
      adds more sanity checks for another potential bug.
      
      [1]
      [   70.724101] BUG: kernel NULL pointer dereference, address: 0000000000000000
      [   70.724561] #PF: supervisor read access in kernel mode
      [   70.724561] #PF: error_code(0x0000) - not-present page
      [   70.724561] PGD 10ac61067 P4D 10ac61067 PUD 107ee2067 PMD 0
      [   70.724561] Oops: Oops: 0000 [#1] SMP NOPTI
      [   70.724561] CPU: 11 UID: 0 PID: 2163 Comm: b358537762 Not tainted 6.11.0-virtme #991
      [   70.724561] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
      [   70.724561] RIP: 0010:fq_codel_enqueue (net/sched/sch_fq_codel.c:120 net/sched/sch_fq_codel.c:168 net/sched/sch_fq_codel.c:230) sch_fq_codel
      [ 70.724561] Code: 24 08 49 c1 e1 06 44 89 7c 24 18 45 31 ed 45 31 c0 31 ff 89 44 24 14 4c 03 8b 90 01 00 00 eb 04 39 ca 73 37 4d 8b 39 83 c7 01 <49> 8b 17 49 89 11 41 8b 57 28 45 8b 5f 34 49 c7 07 00 00 00 00 49
      All code
      ========
         0:	24 08                	and    $0x8,%al
         2:	49 c1 e1 06          	shl    $0x6,%r9
         6:	44 89 7c 24 18       	mov    %r15d,0x18(%rsp)
         b:	45 31 ed             	xor    %r13d,%r13d
         e:	45 31 c0             	xor    %r8d,%r8d
        11:	31 ff                	xor    %edi,%edi
        13:	89 44 24 14          	mov    %eax,0x14(%rsp)
        17:	4c 03 8b 90 01 00 00 	add    0x190(%rbx),%r9
        1e:	eb 04                	jmp    0x24
        20:	39 ca                	cmp    %ecx,%edx
        22:	73 37                	jae    0x5b
        24:	4d 8b 39             	mov    (%r9),%r15
        27:	83 c7 01             	add    $0x1,%edi
        2a:*	49 8b 17             	mov    (%r15),%rdx		<-- trapping instruction
        2d:	49 89 11             	mov    %rdx,(%r9)
        30:	41 8b 57 28          	mov    0x28(%r15),%edx
        34:	45 8b 5f 34          	mov    0x34(%r15),%r11d
        38:	49 c7 07 00 00 00 00 	movq   $0x0,(%r15)
        3f:	49                   	rex.WB
      
      Code starting with the faulting instruction
      ===========================================
         0:	49 8b 17             	mov    (%r15),%rdx
         3:	49 89 11             	mov    %rdx,(%r9)
         6:	41 8b 57 28          	mov    0x28(%r15),%edx
         a:	45 8b 5f 34          	mov    0x34(%r15),%r11d
         e:	49 c7 07 00 00 00 00 	movq   $0x0,(%r15)
        15:	49                   	rex.WB
      [   70.724561] RSP: 0018:ffff95ae85e6fb90 EFLAGS: 00000202
      [   70.724561] RAX: 0000000002000000 RBX: ffff95ae841de000 RCX: 0000000000000000
      [   70.724561] RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000001
      [   70.724561] RBP: ffff95ae85e6fbf8 R08: 0000000000000000 R09: ffff95b710a30000
      [   70.724561] R10: 0000000000000000 R11: bdf289445ce31881 R12: ffff95ae85e6fc58
      [   70.724561] R13: 0000000000000000 R14: 0000000000000040 R15: 0000000000000000
      [   70.724561] FS:  000000002c5c1380(0000) GS:ffff95bd7fcc0000(0000) knlGS:0000000000000000
      [   70.724561] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [   70.724561] CR2: 0000000000000000 CR3: 000000010c568000 CR4: 00000000000006f0
      [   70.724561] Call Trace:
      [   70.724561]  <TASK>
      [   70.724561] ? __die (arch/x86/kernel/dumpstack.c:421 arch/x86/kernel/dumpstack.c:434)
      [   70.724561] ? page_fault_oops (arch/x86/mm/fault.c:715)
      [   70.724561] ? exc_page_fault (./arch/x86/include/asm/irqflags.h:26 ./arch/x86/include/asm/irqflags.h:87 ./arch/x86/include/asm/irqflags.h:147 arch/x86/mm/fault.c:1489 arch/x86/mm/fault.c:1539)
      [   70.724561] ? asm_exc_page_fault (./arch/x86/include/asm/idtentry.h:623)
      [   70.724561] ? fq_codel_enqueue (net/sched/sch_fq_codel.c:120 net/sched/sch_fq_codel.c:168 net/sched/sch_fq_codel.c:230) sch_fq_codel
      [   70.724561] dev_qdisc_enqueue (net/core/dev.c:3784)
      [   70.724561] __dev_queue_xmit (net/core/dev.c:3880 (discriminator 2) net/core/dev.c:4390 (discriminator 2))
      [   70.724561] ? irqentry_enter (kernel/entry/common.c:237)
      [   70.724561] ? sysvec_apic_timer_interrupt (./arch/x86/include/asm/hardirq.h:74 (discriminator 2) arch/x86/kernel/apic/apic.c:1043 (discriminator 2) arch/x86/kernel/apic/apic.c:1043 (discriminator 2))
      [   70.724561] ? trace_hardirqs_on (kernel/trace/trace_preemptirq.c:58 (discriminator 4))
      [   70.724561] ? asm_sysvec_apic_timer_interrupt (./arch/x86/include/asm/idtentry.h:702)
      [   70.724561] ? virtio_net_hdr_to_skb.constprop.0 (./include/linux/virtio_net.h:129 (discriminator 1))
      [   70.724561] packet_sendmsg (net/packet/af_packet.c:3145 (discriminator 1) net/packet/af_packet.c:3177 (discriminator 1))
      [   70.724561] ? _raw_spin_lock_bh (./arch/x86/include/asm/atomic.h:107 (discriminator 4) ./include/linux/atomic/atomic-arch-fallback.h:2170 (discriminator 4) ./include/linux/atomic/atomic-instrumented.h:1302 (discriminator 4) ./include/asm-generic/qspinlock.h:111 (discriminator 4) ./include/linux/spinlock.h:187 (discriminator 4) ./include/linux/spinlock_api_smp.h:127 (discriminator 4) kernel/locking/spinlock.c:178 (discriminator 4))
      [   70.724561] ? netdev_name_node_lookup_rcu (net/core/dev.c:325 (discriminator 1))
      [   70.724561] __sys_sendto (net/socket.c:730 (discriminator 1) net/socket.c:745 (discriminator 1) net/socket.c:2210 (discriminator 1))
      [   70.724561] ? __sys_setsockopt (./include/linux/file.h:34 net/socket.c:2355)
      [   70.724561] __x64_sys_sendto (net/socket.c:2222 (discriminator 1) net/socket.c:2218 (discriminator 1) net/socket.c:2218 (discriminator 1))
      [   70.724561] do_syscall_64 (arch/x86/entry/common.c:52 (discriminator 1) arch/x86/entry/common.c:83 (discriminator 1))
      [   70.724561] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
      [   70.724561] RIP: 0033:0x41ae09
      
      Fixes: cf9acc90 ("net: virtio_net_hdr_to_skb: count transport header in UFO")
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Cc: Jonathan Davies <jonathan.davies@nutanix.com>
      Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
      Reviewed-by: default avatarJonathan Davies <jonathan.davies@nutanix.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      c20029db
    • Daniel Borkmann's avatar
      net: Fix gso_features_check to check for both dev->gso_{ipv4_,}max_size · e609c959
      Daniel Borkmann authored and Paolo Abeni's avatar Paolo Abeni committed
      
      Commit 24ab059d ("net: check dev->gso_max_size in gso_features_check()")
      added a dev->gso_max_size test to gso_features_check() in order to fall
      back to GSO when needed.
      
      This was added as it was noticed that some drivers could misbehave if TSO
      packets get too big. However, the check doesn't respect dev->gso_ipv4_max_size
      limit. For instance, a device could be configured with BIG TCP for IPv4,
      but not IPv6.
      
      Therefore, add a netif_get_gso_max_size() equivalent to netif_get_gro_max_size()
      and use the helper to respect both limits before falling back to GSO engine.
      
      Fixes: 24ab059d ("net: check dev->gso_max_size in gso_features_check()")
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Cc: Eric Dumazet <edumazet@google.com>
      Cc: Paolo Abeni <pabeni@redhat.com>
      Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
      Link: https://patch.msgid.link/20240923212242.15669-2-daniel@iogearbox.net
      
      
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      e609c959
    • Daniel Borkmann's avatar
      net: Add netif_get_gro_max_size helper for GRO · e8d4d34d
      Daniel Borkmann authored and Paolo Abeni's avatar Paolo Abeni committed
      
      Add a small netif_get_gro_max_size() helper which returns the maximum IPv4
      or IPv6 GRO size of the netdevice.
      
      We later add a netif_get_gso_max_size() equivalent as well for GSO, so that
      these helpers can be used consistently instead of open-coded checks.
      
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Cc: Eric Dumazet <edumazet@google.com>
      Cc: Paolo Abeni <pabeni@redhat.com>
      Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
      Link: https://patch.msgid.link/20240923212242.15669-1-daniel@iogearbox.net
      
      
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      e8d4d34d
    • Vladimir Oltean's avatar
      net: dsa: improve shutdown sequence · 6c24a03a
      Vladimir Oltean authored and Paolo Abeni's avatar Paolo Abeni committed
      
      Alexander Sverdlin presents 2 problems during shutdown with the
      lan9303 driver. One is specific to lan9303 and the other just happens
      to reproduce there.
      
      The first problem is that lan9303 is unique among DSA drivers in that it
      calls dev_get_drvdata() at "arbitrary runtime" (not probe, not shutdown,
      not remove):
      
      phy_state_machine()
      -> ...
         -> dsa_user_phy_read()
            -> ds->ops->phy_read()
               -> lan9303_phy_read()
                  -> chip->ops->phy_read()
                     -> lan9303_mdio_phy_read()
                        -> dev_get_drvdata()
      
      But we never stop the phy_state_machine(), so it may continue to run
      after dsa_switch_shutdown(). Our common pattern in all DSA drivers is
      to set drvdata to NULL to suppress the remove() method that may come
      afterwards. But in this case it will result in an NPD.
      
      The second problem is that the way in which we set
      dp->conduit->dsa_ptr = NULL; is concurrent with receive packet
      processing. dsa_switch_rcv() checks once whether dev->dsa_ptr is NULL,
      but afterwards, rather than continuing to use that non-NULL value,
      dev->dsa_ptr is dereferenced again and again without NULL checks:
      dsa_conduit_find_user() and many other places. In between dereferences,
      there is no locking to ensure that what was valid once continues to be
      valid.
      
      Both problems have the common aspect that closing the conduit interface
      solves them.
      
      In the first case, dev_close(conduit) triggers the NETDEV_GOING_DOWN
      event in dsa_user_netdevice_event() which closes user ports as well.
      dsa_port_disable_rt() calls phylink_stop(), which synchronously stops
      the phylink state machine, and ds->ops->phy_read() will thus no longer
      call into the driver after this point.
      
      In the second case, dev_close(conduit) should do this, as per
      Documentation/networking/driver.rst:
      
      | Quiescence
      | ----------
      |
      | After the ndo_stop routine has been called, the hardware must
      | not receive or transmit any data.  All in flight packets must
      | be aborted. If necessary, poll or wait for completion of
      | any reset commands.
      
      So it should be sufficient to ensure that later, when we zeroize
      conduit->dsa_ptr, there will be no concurrent dsa_switch_rcv() call
      on this conduit.
      
      The addition of the netif_device_detach() function is to ensure that
      ioctls, rtnetlinks and ethtool requests on the user ports no longer
      propagate down to the driver - we're no longer prepared to handle them.
      
      The race condition actually did not exist when commit 0650bf52
      ("net: dsa: be compatible with masters which unregister on shutdown")
      first introduced dsa_switch_shutdown(). It was created later, when we
      stopped unregistering the user interfaces from a bad spot, and we just
      replaced that sequence with a racy zeroization of conduit->dsa_ptr
      (one which doesn't ensure that the interfaces aren't up).
      
      Reported-by: default avatarAlexander Sverdlin <alexander.sverdlin@siemens.com>
      Closes: https://lore.kernel.org/netdev/2d2e3bba17203c14a5ffdabc174e3b6bbb9ad438.camel@siemens.com/
      Closes: https://lore.kernel.org/netdev/c1bf4de54e829111e0e4a70e7bd1cf523c9550ff.camel@siemens.com/
      
      
      Fixes: ee534378 ("net: dsa: fix panic when DSA master device unbinds on shutdown")
      Reviewed-by: default avatarAlexander Sverdlin <alexander.sverdlin@siemens.com>
      Tested-by: default avatarAlexander Sverdlin <alexander.sverdlin@siemens.com>
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Link: https://patch.msgid.link/20240913203549.3081071-1-vladimir.oltean@nxp.com
      
      
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      6c24a03a
  4. Sep 27, 2024
    • Al Viro's avatar
      [tree-wide] finally take no_llseek out · cb787f4a
      Al Viro authored
      
      no_llseek had been defined to NULL two years ago, in commit 868941b1
      ("fs: remove no_llseek")
      
      To quote that commit,
      
        At -rc1 we'll need do a mechanical removal of no_llseek -
      
        git grep -l -w no_llseek | grep -v porting.rst | while read i; do
      	sed -i '/\<no_llseek\>/d' $i
        done
      
        would do it.
      
      Unfortunately, that hadn't been done.  Linus, could you do that now, so
      that we could finally put that thing to rest? All instances are of the
      form
      	.llseek = no_llseek,
      so it's obviously safe.
      
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      cb787f4a
    • Luiz Augusto von Dentz's avatar
      Bluetooth: hci_event: Align BR/EDR JUST_WORKS paring with LE · b25e11f9
      Luiz Augusto von Dentz authored
      
      This aligned BR/EDR JUST_WORKS method with LE which since 92516cd9
      ("Bluetooth: Always request for user confirmation for Just Works")
      always request user confirmation with confirm_hint set since the
      likes of bluetoothd have dedicated policy around JUST_WORKS method
      (e.g. main.conf:JustWorksRepairing).
      
      CVE: CVE-2024-8805
      Cc: stable@vger.kernel.org
      Fixes: ba15a58b ("Bluetooth: Fix SSP acceptor just-works confirmation without MITM")
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      Tested-by: default avatarKiran K <kiran.k@intel.com>
      b25e11f9
    • Luiz Augusto von Dentz's avatar
      Bluetooth: L2CAP: Fix uaf in l2cap_connect · 333b4fd1
      Luiz Augusto von Dentz authored
      
      [Syzbot reported]
      BUG: KASAN: slab-use-after-free in l2cap_connect.constprop.0+0x10d8/0x1270 net/bluetooth/l2cap_core.c:3949
      Read of size 8 at addr ffff8880241e9800 by task kworker/u9:0/54
      
      CPU: 0 UID: 0 PID: 54 Comm: kworker/u9:0 Not tainted 6.11.0-rc6-syzkaller-00268-g788220eee30d #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/06/2024
      Workqueue: hci2 hci_rx_work
      Call Trace:
       <TASK>
       __dump_stack lib/dump_stack.c:93 [inline]
       dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:119
       print_address_description mm/kasan/report.c:377 [inline]
       print_report+0xc3/0x620 mm/kasan/report.c:488
       kasan_report+0xd9/0x110 mm/kasan/report.c:601
       l2cap_connect.constprop.0+0x10d8/0x1270 net/bluetooth/l2cap_core.c:3949
       l2cap_connect_req net/bluetooth/l2cap_core.c:4080 [inline]
       l2cap_bredr_sig_cmd net/bluetooth/l2cap_core.c:4772 [inline]
       l2cap_sig_channel net/bluetooth/l2cap_core.c:5543 [inline]
       l2cap_recv_frame+0xf0b/0x8eb0 net/bluetooth/l2cap_core.c:6825
       l2cap_recv_acldata+0x9b4/0xb70 net/bluetooth/l2cap_core.c:7514
       hci_acldata_packet net/bluetooth/hci_core.c:3791 [inline]
       hci_rx_work+0xaab/0x1610 net/bluetooth/hci_core.c:4028
       process_one_work+0x9c5/0x1b40 kernel/workqueue.c:3231
       process_scheduled_works kernel/workqueue.c:3312 [inline]
       worker_thread+0x6c8/0xed0 kernel/workqueue.c:3389
       kthread+0x2c1/0x3a0 kernel/kthread.c:389
       ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147
       ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
      ...
      
      Freed by task 5245:
       kasan_save_stack+0x33/0x60 mm/kasan/common.c:47
       kasan_save_track+0x14/0x30 mm/kasan/common.c:68
       kasan_save_free_info+0x3b/0x60 mm/kasan/generic.c:579
       poison_slab_object+0xf7/0x160 mm/kasan/common.c:240
       __kasan_slab_free+0x32/0x50 mm/kasan/common.c:256
       kasan_slab_free include/linux/kasan.h:184 [inline]
       slab_free_hook mm/slub.c:2256 [inline]
       slab_free mm/slub.c:4477 [inline]
       kfree+0x12a/0x3b0 mm/slub.c:4598
       l2cap_conn_free net/bluetooth/l2cap_core.c:1810 [inline]
       kref_put include/linux/kref.h:65 [inline]
       l2cap_conn_put net/bluetooth/l2cap_core.c:1822 [inline]
       l2cap_conn_del+0x59d/0x730 net/bluetooth/l2cap_core.c:1802
       l2cap_connect_cfm+0x9e6/0xf80 net/bluetooth/l2cap_core.c:7241
       hci_connect_cfm include/net/bluetooth/hci_core.h:1960 [inline]
       hci_conn_failed+0x1c3/0x370 net/bluetooth/hci_conn.c:1265
       hci_abort_conn_sync+0x75a/0xb50 net/bluetooth/hci_sync.c:5583
       abort_conn_sync+0x197/0x360 net/bluetooth/hci_conn.c:2917
       hci_cmd_sync_work+0x1a4/0x410 net/bluetooth/hci_sync.c:328
       process_one_work+0x9c5/0x1b40 kernel/workqueue.c:3231
       process_scheduled_works kernel/workqueue.c:3312 [inline]
       worker_thread+0x6c8/0xed0 kernel/workqueue.c:3389
       kthread+0x2c1/0x3a0 kernel/kthread.c:389
       ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147
       ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
      
      Reported-by: default avatar <syzbot+c12e2f941af1feb5632c@syzkaller.appspotmail.com>
      Tested-by: default avatar <syzbot+c12e2f941af1feb5632c@syzkaller.appspotmail.com>
      Closes: https://syzkaller.appspot.com/bug?extid=c12e2f941af1feb5632c
      
      
      Fixes: 7b064eda ("Bluetooth: Fix authentication if acl data comes before remote feature evt")
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      333b4fd1
    • Luiz Augusto von Dentz's avatar
      Bluetooth: MGMT: Fix possible crash on mgmt_index_removed · f53e1c9c
      Luiz Augusto von Dentz authored
      
      If mgmt_index_removed is called while there are commands queued on
      cmd_sync it could lead to crashes like the bellow trace:
      
      0x0000053D: __list_del_entry_valid_or_report+0x98/0xdc
      0x0000053D: mgmt_pending_remove+0x18/0x58 [bluetooth]
      0x0000053E: mgmt_remove_adv_monitor_complete+0x80/0x108 [bluetooth]
      0x0000053E: hci_cmd_sync_work+0xbc/0x164 [bluetooth]
      
      So while handling mgmt_index_removed this attempts to dequeue
      commands passed as user_data to cmd_sync.
      
      Fixes: 7cf5c297 ("Bluetooth: hci_sync: Refactor remove Adv Monitor")
      Reported-by: default avatarjiaymao <quic_jiaymao@quicinc.com>
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      f53e1c9c
    • Eric Dumazet's avatar
      netfilter: nf_tables: prevent nf_skb_duplicated corruption · 92ceba94
      Eric Dumazet authored
      
      syzbot found that nf_dup_ipv4() or nf_dup_ipv6() could write
      per-cpu variable nf_skb_duplicated in an unsafe way [1].
      
      Disabling preemption as hinted by the splat is not enough,
      we have to disable soft interrupts as well.
      
      [1]
      BUG: using __this_cpu_write() in preemptible [00000000] code: syz.4.282/6316
       caller is nf_dup_ipv4+0x651/0x8f0 net/ipv4/netfilter/nf_dup_ipv4.c:87
      CPU: 0 UID: 0 PID: 6316 Comm: syz.4.282 Not tainted 6.11.0-rc7-syzkaller-00104-g7052622fccb1 #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/06/2024
      Call Trace:
       <TASK>
        __dump_stack lib/dump_stack.c:93 [inline]
        dump_stack_lvl+0x241/0x360 lib/dump_stack.c:119
        check_preemption_disabled+0x10e/0x120 lib/smp_processor_id.c:49
        nf_dup_ipv4+0x651/0x8f0 net/ipv4/netfilter/nf_dup_ipv4.c:87
        nft_dup_ipv4_eval+0x1db/0x300 net/ipv4/netfilter/nft_dup_ipv4.c:30
        expr_call_ops_eval net/netfilter/nf_tables_core.c:240 [inline]
        nft_do_chain+0x4ad/0x1da0 net/netfilter/nf_tables_core.c:288
        nft_do_chain_ipv4+0x202/0x320 net/netfilter/nft_chain_filter.c:23
        nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline]
        nf_hook_slow+0xc3/0x220 net/netfilter/core.c:626
        nf_hook+0x2c4/0x450 include/linux/netfilter.h:269
        NF_HOOK_COND include/linux/netfilter.h:302 [inline]
        ip_output+0x185/0x230 net/ipv4/ip_output.c:433
        ip_local_out net/ipv4/ip_output.c:129 [inline]
        ip_send_skb+0x74/0x100 net/ipv4/ip_output.c:1495
        udp_send_skb+0xacf/0x1650 net/ipv4/udp.c:981
        udp_sendmsg+0x1c21/0x2a60 net/ipv4/udp.c:1269
        sock_sendmsg_nosec net/socket.c:730 [inline]
        __sock_sendmsg+0x1a6/0x270 net/socket.c:745
        ____sys_sendmsg+0x525/0x7d0 net/socket.c:2597
        ___sys_sendmsg net/socket.c:2651 [inline]
        __sys_sendmmsg+0x3b2/0x740 net/socket.c:2737
        __do_sys_sendmmsg net/socket.c:2766 [inline]
        __se_sys_sendmmsg net/socket.c:2763 [inline]
        __x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2763
        do_syscall_x64 arch/x86/entry/common.c:52 [inline]
        do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
      RIP: 0033:0x7f4ce4f7def9
      Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48
      RSP: 002b:00007f4ce5d4a038 EFLAGS: 00000246 ORIG_RAX: 0000000000000133
      RAX: ffffffffffffffda RBX: 00007f4ce5135f80 RCX: 00007f4ce4f7def9
      RDX: 0000000000000001 RSI: 0000000020005d40 RDI: 0000000000000006
      RBP: 00007f4ce4ff0b76 R08: 0000000000000000 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
      R13: 0000000000000000 R14: 00007f4ce5135f80 R15: 00007ffd4cbc6d68
       </TASK>
      
      Fixes: d877f071 ("netfilter: nf_tables: add nft_dup expression")
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      92ceba94
  5. Sep 26, 2024
    • Florian Westphal's avatar
      netfilter: nfnetlink_queue: remove old clash resolution logic · 8af79d3e
      Florian Westphal authored
      
      For historical reasons there are two clash resolution spots in
      netfilter, one in nfnetlink_queue and one in conntrack core.
      
      nfnetlink_queue one was added first: If a colliding entry is found, NAT
      NAT transformation is reversed by calling nat engine again with altered
      tuple.
      
      See commit 368982cd ("netfilter: nfnetlink_queue: resolve clash for
      unconfirmed conntracks") for details.
      
      One problem is that nf_reroute() won't take an action if the queueing
      doesn't occur in the OUTPUT hook, i.e. when queueing in forward or
      postrouting, packet will be sent via the wrong path.
      
      Another problem is that the scenario addressed (2nd UDP packet sent with
      identical addresses while first packet is still being processed) can also
      occur without any nfqueue involvement due to threaded resolvers doing
      A and AAAA requests back-to-back.
      
      This lead us to add clash resolution logic to the conntrack core, see
      commit 6a757c07 ("netfilter: conntrack: allow insertion of clashing
      entries").  Instead of fixing the nfqueue based logic, lets remove it
      and let conntrack core handle this instead.
      
      Retain the ->update hook for sake of nfqueue based conntrack helpers.
      We could axe this hook completely but we'd have to split confirm and
      helper logic again, see commit ee04805f ("netfilter: conntrack: make
      conntrack userspace helpers work again").
      
      This SHOULD NOT be backported to kernels earlier than v5.6; they lack
      adequate clash resolution handling.
      
      Patch was originally written by Pablo Neira Ayuso.
      
      Reported-by: default avatarAntonio Ojea <aojea@google.com>
      Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1766
      
      
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Tested-by: default avatarAntonio Ojea <aojea@google.com>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      8af79d3e
    • Pablo Neira Ayuso's avatar
      netfilter: nf_tables: missing objects with no memcg accounting · 69e687ce
      Pablo Neira Ayuso authored
      
      Several ruleset objects are still not using GFP_KERNEL_ACCOUNT for
      memory accounting, update them. This includes:
      
      - catchall elements
      - compat match large info area
      - log prefix
      - meta secctx
      - numgen counters
      - pipapo set backend datastructure
      - tunnel private objects
      
      Fixes: 33758c89 ("memcg: enable accounting for nft objects")
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      69e687ce
    • Pablo Neira Ayuso's avatar
      netfilter: nf_tables: use rcu chain hook list iterator from netlink dump path · 4ffcf5ca
      Pablo Neira Ayuso authored
      
      Lockless iteration over hook list is possible from netlink dump path,
      use rcu variant to iterate over the hook list as is done with flowtable
      hooks.
      
      Fixes: b9703ed4 ("netfilter: nf_tables: support for adding new devices to an existing netdev chain")
      Reported-by: default avatarPhil Sutter <phil@nwl.cc>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      4ffcf5ca
    • Simon Horman's avatar
      netfilter: ctnetlink: compile ctnetlink_label_size with CONFIG_NF_CONNTRACK_EVENTS · e1f1ee0e
      Simon Horman authored
      Only provide ctnetlink_label_size when it is used,
      which is when CONFIG_NF_CONNTRACK_EVENTS is configured.
      
      Flagged by clang-18 W=1 builds as:
      
      .../nf_conntrack_netlink.c:385:19: warning: unused function 'ctnetlink_label_size' [-Wunused-function]
        385 | static inline int ctnetlink_label_size(const struct nf_conn *ct)
            |                   ^~~~~~~~~~~~~~~~~~~~
      
      The condition on CONFIG_NF_CONNTRACK_LABELS being removed by
      this patch guards compilation of non-trivial implementations
      of ctnetlink_dump_labels() and ctnetlink_label_size().
      
      However, this is not necessary as each of these functions
      will always return 0 if CONFIG_NF_CONNTRACK_LABELS is not defined
      as each function starts with the equivalent of:
      
      	struct nf_conn_labels *labels = nf_ct_labels_find(ct);
      
      	if (!labels)
      		return 0;
      
      And nf_ct_labels_find always returns NULL if CONFIG_NF_CONNTRACK_LABELS
      is not enabled.  So I believe that the compiler optimises the code away
      in such cases anyway.
      
      Found by inspection.
      Compile tested only.
      
      Originally splitted in two patches, Pablo Neira Ayuso collapsed them and
      added Fixes: tag.
      
      Fixes: 0ceabd83 ("netfilter: ctnetlink: deliver labels to userspace")
      Link: https://lore.kernel.org/netfilter-devel/20240909151712.GZ2097826@kernel.org/
      
      
      Signed-off-by: default avatarSimon Horman <horms@kernel.org>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      e1f1ee0e
    • Simon Horman's avatar
      netfilter: nf_reject: Fix build warning when CONFIG_BRIDGE_NETFILTER=n · fc56878c
      Simon Horman authored
      
      If CONFIG_BRIDGE_NETFILTER is not enabled, which is the case for x86_64
      defconfig, then building nf_reject_ipv4.c and nf_reject_ipv6.c with W=1
      using gcc-14 results in the following warnings, which are treated as
      errors:
      
      net/ipv4/netfilter/nf_reject_ipv4.c: In function 'nf_send_reset':
      net/ipv4/netfilter/nf_reject_ipv4.c:243:23: error: variable 'niph' set but not used [-Werror=unused-but-set-variable]
        243 |         struct iphdr *niph;
            |                       ^~~~
      cc1: all warnings being treated as errors
      net/ipv6/netfilter/nf_reject_ipv6.c: In function 'nf_send_reset6':
      net/ipv6/netfilter/nf_reject_ipv6.c:286:25: error: variable 'ip6h' set but not used [-Werror=unused-but-set-variable]
        286 |         struct ipv6hdr *ip6h;
            |                         ^~~~
      cc1: all warnings being treated as errors
      
      Address this by reducing the scope of these local variables to where
      they are used, which is code only compiled when CONFIG_BRIDGE_NETFILTER
      enabled.
      
      Compile tested and run through netfilter selftests.
      
      Reported-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Closes: https://lore.kernel.org/netfilter-devel/20240906145513.567781-1-andriy.shevchenko@linux.intel.com/
      
      
      Signed-off-by: default avatarSimon Horman <horms@kernel.org>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      fc56878c
    • Phil Sutter's avatar
      netfilter: nf_tables: Keep deleted flowtable hooks until after RCU · 642c89c4
      Phil Sutter authored
      
      Documentation of list_del_rcu() warns callers to not immediately free
      the deleted list item. While it seems not necessary to use the
      RCU-variant of list_del() here in the first place, doing so seems to
      require calling kfree_rcu() on the deleted item as well.
      
      Fixes: 3f0465a9 ("netfilter: nf_tables: dynamically allocate hooks per net_device in flowtables")
      Signed-off-by: default avatarPhil Sutter <phil@nwl.cc>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      642c89c4
    • Andy Shevchenko's avatar
      netfilter: ctnetlink: Guard possible unused functions · 2cadd3b1
      Andy Shevchenko authored
      
      Some of the functions may be unused (CONFIG_NETFILTER_NETLINK_GLUE_CT=n
      and CONFIG_NF_CONNTRACK_EVENTS=n), it prevents kernel builds with clang,
      `make W=1` and CONFIG_WERROR=y:
      
      net/netfilter/nf_conntrack_netlink.c:657:22: error: unused function 'ctnetlink_acct_size' [-Werror,-Wunused-function]
        657 | static inline size_t ctnetlink_acct_size(const struct nf_conn *ct)
            |                      ^~~~~~~~~~~~~~~~~~~
      net/netfilter/nf_conntrack_netlink.c:667:19: error: unused function 'ctnetlink_secctx_size' [-Werror,-Wunused-function]
        667 | static inline int ctnetlink_secctx_size(const struct nf_conn *ct)
            |                   ^~~~~~~~~~~~~~~~~~~~~
      net/netfilter/nf_conntrack_netlink.c:683:22: error: unused function 'ctnetlink_timestamp_size' [-Werror,-Wunused-function]
        683 | static inline size_t ctnetlink_timestamp_size(const struct nf_conn *ct)
            |                      ^~~~~~~~~~~~~~~~~~~~~~~~
      
      Fix this by guarding possible unused functions with ifdeffery.
      
      See also commit 6863f564 ("kbuild: allow Clang to find unused static
      inline functions for W=1 build").
      
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Reviewed-by: default avatarSimon Horman <horms@kernel.org>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      2cadd3b1
    • Florian Westphal's avatar
      netfilter: conntrack: add clash resolution for reverse collisions · a4e6a103
      Florian Westphal authored
      
      Given existing entry:
      ORIGIN: a:b -> c:d
      REPLY:  c:d -> a:b
      
      And colliding entry:
      ORIGIN: c:d -> a:b
      REPLY:  a:b -> c:d
      
      The colliding ct (and the associated skb) get dropped on insert.
      Permit this by checking if the colliding entry matches the reply
      direction.
      
      Happens when both ends send packets at same time, both requests are picked
      up as NEW, rather than NEW for the 'first' and 'ESTABLISHED' for the
      second packet.
      
      This is an esoteric condition, as ruleset must permit NEW connections
      in either direction and both peers must already have a bidirectional
      traffic flow at the time conntrack gets enabled.
      
      Allow the 'reverse' skb to pass and assign the existing (clashing)
      entry.
      
      While at it, also drop the extra 'dying' check, this is already
      tested earlier by the calling function.
      
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      a4e6a103
    • Florian Westphal's avatar
      netfilter: nf_nat: don't try nat source port reallocation for reverse dir clash · d8f84a9b
      Florian Westphal authored
      
      A conntrack entry can be inserted to the connection tracking table if there
      is no existing entry with an identical tuple in either direction.
      
      Example:
      INITIATOR -> NAT/PAT -> RESPONDER
      
      Initiator passes through NAT/PAT ("us") and SNAT is done (saddr rewrite).
      Then, later, NAT/PAT machine itself also wants to connect to RESPONDER.
      
      This will not work if the SNAT done earlier has same IP:PORT source pair.
      
      Conntrack table has:
      ORIGINAL: $IP_INITATOR:$SPORT -> $IP_RESPONDER:$DPORT
      REPLY:    $IP_RESPONDER:$DPORT -> $IP_NAT:$SPORT
      
      and new locally originating connection wants:
      ORIGINAL: $IP_NAT:$SPORT -> $IP_RESPONDER:$DPORT
      REPLY:    $IP_RESPONDER:$DPORT -> $IP_NAT:$SPORT
      
      This is handled by the NAT engine which will do a source port reallocation
      for the locally originating connection that is colliding with an existing
      tuple by attempting a source port rewrite.
      
      This is done even if this new connection attempt did not go through a
      masquerade/snat rule.
      
      There is a rare race condition with connection-less protocols like UDP,
      where we do the port reallocation even though its not needed.
      
      This happens when new packets from the same, pre-existing flow are received
      in both directions at the exact same time on different CPUs after the
      conntrack table was flushed (or conntrack becomes active for first time).
      
      With strict ordering/single cpu, the first packet creates new ct entry and
      second packet is resolved as established reply packet.
      
      With parallel processing, both packets are picked up as new and both get
      their own ct entry.
      
      In this case, the 'reply' packet (picked up as ORIGINAL) can be mangled by
      NAT engine because a port collision is detected.
      
      This change isn't enough to prevent a packet drop later during
      nf_conntrack_confirm(), the existing clash resolution strategy will not
      detect such reverse clash case.  This is resolved by a followup patch.
      
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      d8f84a9b
  6. Sep 25, 2024
    • Luigi Leonardi's avatar
      vsock/virtio: avoid queuing packets when intermediate queue is empty · efcd71af
      Luigi Leonardi authored and Michael S. Tsirkin's avatar Michael S. Tsirkin committed
      
      When the driver needs to send new packets to the device, it always
      queues the new sk_buffs into an intermediate queue (send_pkt_queue)
      and schedules a worker (send_pkt_work) to then queue them into the
      virtqueue exposed to the device.
      
      This increases the chance of batching, but also introduces a lot of
      latency into the communication. So we can optimize this path by
      adding a fast path to be taken when there is no element in the
      intermediate queue, there is space available in the virtqueue,
      and no other process that is sending packets (tx_lock held).
      
      The following benchmarks were run to check improvements in latency and
      throughput. The test bed is a host with Intel i7-10700KF CPU @ 3.80GHz
      and L1 guest running on QEMU/KVM with vhost process and all vCPUs
      pinned individually to pCPUs.
      
      - Latency
         Tool: Fio version 3.37-56
         Mode: pingpong (h-g-h)
         Test runs: 50
         Runtime-per-test: 50s
         Type: SOCK_STREAM
      
      In the following fio benchmark (pingpong mode) the host sends
      a payload to the guest and waits for the same payload back.
      
      fio process pinned both inside the host and the guest system.
      
      Before: Linux 6.9.8
      
      Payload 64B:
      
      	1st perc.	overall		99th perc.
      Before	12.91		16.78		42.24		us
      After	9.77		13.57		39.17		us
      
      Payload 512B:
      
      	1st perc.	overall		99th perc.
      Before	13.35		17.35		41.52		us
      After	10.25		14.11		39.58		us
      
      Payload 4K:
      
      	1st perc.	overall		99th perc.
      Before	14.71		19.87		41.52		us
      After	10.51		14.96		40.81		us
      
      - Throughput
         Tool: iperf-vsock
      
      The size represents the buffer length (-l) to read/write
      P represents the number of parallel streams
      
      P=1
      	4K	64K	128K
      Before	6.87	29.3	29.5 Gb/s
      After	10.5	39.4	39.9 Gb/s
      
      P=2
      	4K	64K	128K
      Before	10.5	32.8	33.2 Gb/s
      After	17.8	47.7	48.5 Gb/s
      
      P=4
      	4K	64K	128K
      Before	12.7	33.6	34.2 Gb/s
      After	16.9	48.1	50.5 Gb/s
      
      The performance improvement is related to this optimization,
      I used a ebpf kretprobe on virtio_transport_send_skb to check
      that each packet was sent directly to the virtqueue
      
      Co-developed-by: default avatarMarco Pinna <marco.pinn95@gmail.com>
      Signed-off-by: default avatarMarco Pinna <marco.pinn95@gmail.com>
      Signed-off-by: default avatarLuigi Leonardi <luigi.leonardi@outlook.com>
      Message-Id: <20240730-pinna-v4-2-5c9179164db5@outlook.com>
      Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
      efcd71af
    • Marco Pinna's avatar
      vsock/virtio: refactor virtio_transport_send_pkt_work · 26618da3
      Marco Pinna authored and Michael S. Tsirkin's avatar Michael S. Tsirkin committed
      
      Preliminary patch to introduce an optimization to the
      enqueue system.
      
      All the code used to enqueue a packet into the virtqueue
      is removed from virtio_transport_send_pkt_work()
      and moved to the new virtio_transport_send_skb() function.
      
      Co-developed-by: default avatarLuigi Leonardi <luigi.leonardi@outlook.com>
      Signed-off-by: default avatarLuigi Leonardi <luigi.leonardi@outlook.com>
      Signed-off-by: default avatarMarco Pinna <marco.pinn95@gmail.com>
      Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
      Message-Id: <20240730-pinna-v4-1-5c9179164db5@outlook.com>
      Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      26618da3
  7. Sep 24, 2024
  8. Sep 23, 2024
  9. Sep 22, 2024
  10. Sep 20, 2024
Loading