Changelog in Linux kernel 5.15.224

 
ALSA: caiaq: unregister the input device when probe fails [+ + +]
Author: Nguyen Ngoc Thang <[email protected]>
Date:   Sat Sep 26 00:07:17 2026 +0700

    ALSA: caiaq: unregister the input device when probe fails
    
    commit 0b7bd20f6379bc5e431fd74d866390f5b5b63f3c upstream.
    
    setup_card() registers the input device, whose name and phys point into
    struct snd_usb_caiaqdev, and then goes on to snd_card_register() and
    snd_usb_caiaq_control_init(). If either fails, snd_probe() calls
    snd_card_free(), which frees the device state but leaves the input
    device registered: card_free() only clears the pointer, and the input
    device is unregistered from snd_disconnect() alone. Reading its "uevent"
    attribute afterwards dereferences freed memory:
    
      BUG: KASAN: slab-use-after-free in string+0x4a9/0x4f0
      Read of size 1 at addr ffff8880208f5043 by task caiaq/4967
       add_uevent_var+0x183/0x3a0
       input_dev_uevent+0x162/0x900
       dev_uevent+0x2f1/0x870
       uevent_show+0x1ca/0x3a0
       ...
    
    Unregister the input device on the probe error path, as
    snd_disconnect() does. snd_usb_caiaq_input_disconnect() is a no-op when
    no input device was registered.
    
    Reproduced with a raw-gadget Audio Kontrol 1 and a temporary hack that
    makes snd_usb_caiaq_control_init() fail.
    
    Fixes: 28abd224db4a ("ALSA: caiaq: Handle probe errors properly")
    Cc: [email protected]
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=2a123f6269da57ffefaa
    Signed-off-by: Nguyen Ngoc Thang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ALSA: line6: reject oversized playback packets [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Fri Sep 18 16:40:14 2026 -0700

    ALSA: line6: reject oversized playback packets
    
    commit 61b0a5a114fa4552892da5c0ff2f42e63bf08c6b upstream.
    
    Each playback URB is handed a slice of out.buffer that is exactly
    LINE6_ISO_PACKETS * max_packet_size_out bytes, sized from the OUT
    endpoint, but the number of bytes written into that slice is never
    compared against it.
    
    submit_audio_out_urb() takes the frame count from prev_fsize, which
    audio_in_callback() derived from the *IN* endpoint's received packet
    length, and rescales it with the playback frame size; when prev_fsize is
    still zero it synthesizes a length from the sample rate instead.  On a
    device declaring a large IN wMaxPacketSize and a small OUT
    wMaxPacketSize, the resulting memcpy(), or the memset() when the
    playback stream is idle, runs past its slice and, as the reproducer
    below shows, beyond the allocation.
    
    usb_submit_urb() is not a backstop.  max_packet_size_out comes from
    usb_maxpacket(), which returns only the low 11 bits of wMaxPacketSize,
    while USB core validates a high-speed isochronous length against that
    base scaled by usb_endpoint_maxp_mult().  A length of up to three times
    the allocated slice is therefore accepted, and even a rejected URB is
    only rejected after the write.
    
    Reject a packet that does not fit the slice the driver allocated for it.
    Clamping it instead would silently shorten the capture-derived rate
    feedback and desynchronize the two streams.
    
      BUG: KASAN: slab-out-of-bounds in submit_audio_out_urb (sound/usb/line6/playback.c:229)
      Write of size 1024 at addr ffff888100bbd400 by task kworker/1:2/5002
      Workqueue: events line6_startup_work
      Call Trace:
       __asan_memcpy (mm/kasan/shadow.c:106)
       submit_audio_out_urb (sound/usb/line6/playback.c:229)
       line6_submit_audio_out_all_urbs (sound/usb/line6/playback.c:291)
       line6_stream_start (sound/usb/line6/pcm.c:194)
       line6_pcm_acquire (sound/usb/line6/pcm.c:337)
       line6_startup_work (sound/usb/line6/driver.c:728)
       process_one_work (kernel/workqueue.c:3396)
       worker_thread (kernel/workqueue.c:3479 kernel/workqueue.c:3560)
       kthread (kernel/kthread.c:436)
       ret_from_fork (arch/x86/kernel/process.c:158)
       ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
    
      The buggy address belongs to the object at ffff888100bbd400
       which belongs to the cache kmalloc-256 of size 256
      The buggy address is located 0 bytes inside of
       allocated 256-byte region [ffff888100bbd400, ffff888100bbd500)
    
    Cc: [email protected]
    Fixes: 7a0f55aeeb8f ("ALSA: line6: Support assymetrical in/out configurations")
    Reported-by: <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ALSA: seq: Serialize compat port-info ioctls [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Mon Oct 5 20:10:09 2026 -0400

    ALSA: seq: Serialize compat port-info ioctls
    
    [ Upstream commit 95b2e0361c88753afa030c10698be0a1a5b67650 ]
    
    The native sequencer ioctl path serializes handler calls with
    client->ioctl_mutex, but the translated port-info compat path invokes the
    same handlers through snd_seq_kernel_client_ctl() without taking that
    mutex.
    
    This lets concurrent compat CREATE_PORT requests pass the port-count
    check before any request reaches the serialized insertion. The computed
    integer port index can then exceed the address field range and wrap to an
    existing index. Subsequent subscriber teardown can resolve the duplicate
    address to the wrong port and access a freed subscriber.
    
    Take ioctl_mutex while dispatching converted port-info requests, matching
    the native ioctl path. All translated port-info commands share this
    helper, so their accesses to the client port state are serialized as
    well.
    
    Fixes: b3defb791b26 ("ALSA: seq: Make ioctls race-free")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6-sol gpt-6-astra
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Bruno Produit <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    [ sashal: Replaced scoped_guard() with explicit mutex_lock() and mutex_unlock() calls for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: ua101: reject mismatched capture/playback packet sizes [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Fri Sep 18 15:57:53 2026 -0700

    ALSA: ua101: reject mismatched capture/playback packet sizes
    
    commit 86f86e6fdedc33c5b8d38b9208b350f8accf57ee upstream.
    
    detect_usb_format() cross-checks bSubframeSize, bBitResolution and
    tSamFreq between the capture and playback interfaces, but never relates
    the two endpoints' wMaxPacketSize and bNrChannels.  Each playback URB
    gets a buffer of ua->playback.max_packet_bytes, while the number of
    bytes written into it is derived from the capture stream:
    capture_urb_complete() computes frames from the received capture packet
    and capture.frame_bytes, and start_usb_playback() and playback_work()
    multiply that by playback.frame_bytes.
    
    A device declaring a large capture wMaxPacketSize with few capture
    channels and a small playback wMaxPacketSize with many playback channels
    therefore memset()s and memcpy()s past the end of the playback buffer,
    in open() of the PCM node the driver registers during probe.
    usb_submit_urb() rejects the over-long iso_frame_desc[0].length with
    -EMSGSIZE, but only after the write.
    
    Reject such descriptors at probe time.  Genuine UA-101/UA-1000 hardware
    declares proportional packet sizes and is unaffected.
    
      BUG: KASAN: slab-out-of-bounds in start_usb_playback (sound/usb/misc/ua101.c:586)
      Write of size 2048 at addr ffff8881098f3c00 by task exploit/5021
      Call Trace:
       __asan_memset (mm/kasan/shadow.c:84)
       start_usb_playback (sound/usb/misc/ua101.c:586)
       playback_pcm_open (sound/usb/misc/ua101.c:679)
       snd_pcm_open_substream (sound/core/pcm_native.c:2829)
       snd_pcm_open (sound/core/pcm_native.c:2865 sound/core/pcm_native.c:2932)
       snd_pcm_playback_open (sound/core/pcm_native.c:2891)
       snd_open (sound/core/sound.c:166)
       chrdev_open (fs/char_dev.c:411)
       do_dentry_open (fs/open.c:996)
       vfs_open (fs/open.c:1101)
       path_openat (fs/namei.c:4837 fs/namei.c:5000)
       do_file_open (fs/namei.c:5029)
       do_sys_openat2 (fs/open.c:1417)
       __x64_sys_openat (fs/open.c:1423 fs/open.c:1439 fs/open.c:1434)
       do_syscall_64 (arch/x86/entry/syscall_64.c:61 arch/x86/entry/syscall_64.c:84)
       entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
    
      The buggy address belongs to the object at ffff8881098f3c00
       which belongs to the cache kmalloc-192 of size 192
      The buggy address is located 0 bytes inside of
       allocated 168-byte region [ffff8881098f3c00, ffff8881098f3ca8)
    
    Cc: [email protected]
    Fixes: 63978ab3e3e9 ("sound: add Edirol UA-101 support")
    Reported-by: <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ALSA: usb-audio: Apply IGNORE_CTL_ERROR quirk to all Audient devices [+ + +]
Author: Takashi Iwai <[email protected]>
Date:   Tue Sep 29 16:41:26 2026 +0200

    ALSA: usb-audio: Apply IGNORE_CTL_ERROR quirk to all Audient devices
    
    [ Upstream commit a154f7b9f197b3d5e41fa3ad62083f5aa93b1fe8 ]
    
    Faaris reported a problem with Audient EVO4 device and it turned out
    to be a regression by the recent fix commit 87a6f2fa6e6c ("ALSA:
    usb-audio: Propagate write errors in generic mixer put callbacks").
    It exhibited that the hardware gives errors at accessing the mixer
    unit 10 on certain channels, and the change above made it a fatal
    error.
    
    We had already a quirk for Audient iD14 to work around such errors
    from the mixer controls, and we can simply apply the same for EVO4.
    OTOH, it's highly possible that other Audient devices suffer from the
    same issue; they must be using similar firmware, after all.
    
    So, in this patch, we apply the quirk generically to all devices with
    the vendor ID Audient (2708), instead.  Ignoring the control error
    isn't usually less critical than overreaction to the firmware
    misbehavior.
    
    Fixes: 87a6f2fa6e6c ("ALSA: usb-audio: Propagate write errors in generic mixer put callbacks")
    Reported-and-tested-by: Faaris Ansari <[email protected]>
    Closes: https://lore.kernel.org/CANBVYRCL=8QdLxGg4S6qrahrFtwJxhv-aSGpW7-1S=+iOe4ZGA@mail.gmail.com
    Cc: <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: usb-audio: Clamp implicit feedback packet count to URB capacity [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Tue Sep 22 09:30:41 2026 -0400

    ALSA: usb-audio: Clamp implicit feedback packet count to URB capacity
    
    [ Upstream commit 76a986c980bb502c7688d605ac7a67fd257a9a1b ]
    
    data_ep_set_params() allocates each data URB for exactly u->packets
    isochronous frames, so urb->iso_frame_desc[] has u->packets slots and
    ctx->packets is the driver's only record of that limit. For an implicit
    feedback sink, snd_usb_queue_pending_output_urbs() overwrites it with the
    sync source's packet count, which is calculated independently from the
    capture endpoint's parameters. When that count is larger,
    prepare_playback_urb() and prepare_silent_urb() can write
    iso_frame_desc[] past the allocation; their existing bounds limit payload
    bytes, not the descriptor index.
    
    The reproducer uses a high-speed UAC2 device declaring bInterval 1 for
    implicit feedback capture (8 packets) and bInterval 4 for playback
    (1 packet). On the first capture completion after the stream starts, it
    accesses seven descriptors spanning 112 bytes beyond the one-packet URB:
    
      BUG: KASAN: slab-out-of-bounds in prepare_playback_urb (sound/usb/pcm.c:1560)
      Write of size 4 at addr ffff88801e696ad0 by task vhci_rx/178
       prepare_playback_urb (sound/usb/pcm.c:1560)
       prepare_outbound_urb (sound/usb/endpoint.c:340)
       snd_usb_queue_pending_output_urbs (sound/usb/endpoint.c:501)
       snd_complete_urb (sound/usb/endpoint.c:1834)
       __usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1657)
       usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1741)
       vhci_rx_loop (drivers/usb/usbip/vhci_rx.c:107)
       kthread (kernel/kthread.c:436)
      The buggy address belongs to the object at ffff88801e696a00
       which belongs to the cache kmalloc-256 of size 256
      The buggy address is located 0 bytes to the right of
       allocated 208-byte region [ffff88801e696a00, ffff88801e696ad0)
    
    Record the allocated packet count per endpoint and clamp both the adopted
    count and the packet-size copy to it. Fold the Format Type II delimiter
    into urb_packs before the allocation loop so the recorded limit matches
    every URB.
    
    Fixes: cf044e441902 ("ALSA: usb-audio: Update the number of packets properly at receiving")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/22xPn8drvIUtYgVeQnBiNqXuevOTpBAjepLz%40bugs.sh/
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: usb-audio: Optimize the copy of packet sizes for implicit fb handling [+ + +]
Author: Takashi Iwai <[email protected]>
Date:   Tue Sep 22 09:30:40 2026 -0400

    ALSA: usb-audio: Optimize the copy of packet sizes for implicit fb handling
    
    [ Upstream commit 36adb51ac0b19edb32ffeea3fe66b174bad25ead ]
    
    We did manual copies over loop for the packet data update of the
    implicit feedback, but this can be optimized with a simple memcpy().
    
    Along with it, change the data type of snd_usb_packet_info struct to
    align with other (from uint32_t to int).
    
    No functional changes but only code optimizations.
    
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Stable-dep-of: 76a986c980bb ("ALSA: usb-audio: Clamp implicit feedback packet count to URB capacity")
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: virtio: reset device before deleting virtqueues [+ + +]
Author: Yuho Choi <[email protected]>
Date:   Tue Sep 22 08:19:19 2026 -0400

    ALSA: virtio: reset device before deleting virtqueues
    
    [ Upstream commit 6c05d00af307560e6a9f1631d6270d3df5aa2272 ]
    
    virtsnd_remove() and virtsnd_freeze() delete the virtqueues before
    resetting the device. del_vqs() frees the vring backing, but does not
    provide a generic device quiesce operation. In particular, modern
    virtio-pci keeps enabled queues active until the device is reset.
    
    Reset the device before deleting the virtqueues so it can no longer
    access the vring memory when that memory is released. This also covers
    probe failures after DRIVER_OK, which unwind through virtsnd_remove().
    
    Fixes: de3a9980d8c3 ("ALSA: virtio: add virtio sound driver")
    Fixes: 575483e90a32 ("ALSA: virtio: introduce device suspend/resume support")
    Cc: [email protected]
    Signed-off-by: Yuho Choi <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    [ Replaced virtio_reset_device(vdev) calls with vdev->config->reset(vdev) for the older API. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
apparmor: fix out-of-bounds write when null terminating a label vec [+ + +]
Author: Hyunwoo Kim <[email protected]>
Date:   Fri Sep 4 07:02:26 2026 -0400

    apparmor: fix out-of-bounds write when null terminating a label vec
    
    [ Upstream commit 9f1e40193eef7f047e6b77cfb4b4cafdecd7a123 ]
    
    aa_vec_unique() null terminates at vec[n - dups] when VEC_FLAG_TERMINATE
    is passed. If the components are all distinct no duplicates are dropped,
    dups is 0 and the terminator goes to vec[n], so the caller has to provide
    room for n + 1 entries.
    
    aa_label_strn_parse() sets up its vector with vec_setup(profile, vec, len,
    gfp) and then calls aa_vec_unique(vec, len, VEC_FLAG_TERMINATE), but
    vec_setup() does not reserve the terminator entry. Up to LOCAL_VEC_ENTRIES
    it uses the local array of LOCAL_VEC_ENTRIES pointers, above that it
    allocates exactly len pointers. The terminator therefore lands one entry
    past the end of the local array when len is LOCAL_VEC_ENTRIES, and one
    entry past the end of the allocation when len is larger.
    
    len comes from the number of "//&" separated components in the label name
    and label_count_strn_entries() does not bound it. An unprivileged task
    reaches the parse by writing to /proc/self/attr/apparmor/current or through
    lsm_set_self_attr(2), both of which go through do_setattr(), and the name
    is parsed before the change_profile permission is checked.
    The query_label() path behind the securityfs .access file, which is
    mode 0666, performs no permission check at all. Every component has to
    resolve to a loaded profile, so a system with policy loaded is required.
    
    The other two VEC_FLAG_TERMINATE users work on a label vec that
    aa_label_alloc() has already sized with "+ 1 for null terminator entry on
    vec". Reserve the same entry in vec_setup() and DEFINE_VEC(). Passing
    len + 1 from the caller instead would move len == LOCAL_VEC_ENTRIES out of
    the local array and into kzalloc().
    
    Fixes: f1bd904175e8 ("apparmor: add the base fns() for domain labels")
    Cc: [email protected]
    Signed-off-by: Hyunwoo Kim <[email protected]>
    Signed-off-by: John Johansen <[email protected]>
    [ replaced unavailable kzalloc_objs() with equivalent kcalloc() allocation ]
    Signed-off-by: Sasha Levin <[email protected]>

 
arm64: allow pte_offset_map() to fail [+ + +]
Author: Hugh Dickins <[email protected]>
Date:   Thu Sep 10 15:08:36 2026 -0400

    arm64: allow pte_offset_map() to fail
    
    [ Upstream commit 52924726f4c06b3f77de75fb665e6efd8e777d07 ]
    
    In rare transient cases, not yet made possible, pte_offset_map() and
    pte_offset_map_lock() may not find a page table: handle appropriately.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Hugh Dickins <[email protected]>
    Acked-by: Catalin Marinas <[email protected]>
    Cc: Alexander Gordeev <[email protected]>
    Cc: Alexandre Ghiti <[email protected]>
    Cc: Aneesh Kumar K.V <[email protected]>
    Cc: Christian Borntraeger <[email protected]>
    Cc: Chris Zankel <[email protected]>
    Cc: Claudio Imbrenda <[email protected]>
    Cc: David Hildenbrand <[email protected]>
    Cc: "David S. Miller" <[email protected]>
    Cc: Geert Uytterhoeven <[email protected]>
    Cc: Greg Ungerer <[email protected]>
    Cc: Heiko Carstens <[email protected]>
    Cc: Helge Deller <[email protected]>
    Cc: "H. Peter Anvin" <[email protected]>
    Cc: Ingo Molnar <[email protected]>
    Cc: John David Anglin <[email protected]>
    Cc: John Paul Adrian Glaubitz <[email protected]>
    Cc: Kirill A. Shutemov <[email protected]>
    Cc: Matthew Wilcox (Oracle) <[email protected]>
    Cc: Max Filippov <[email protected]>
    Cc: Michael Ellerman <[email protected]>
    Cc: Michal Simek <[email protected]>
    Cc: Mike Kravetz <[email protected]>
    Cc: Mike Rapoport (IBM) <[email protected]>
    Cc: Palmer Dabbelt <[email protected]>
    Cc: Peter Zijlstra <[email protected]>
    Cc: Qi Zheng <[email protected]>
    Cc: Russell King <[email protected]>
    Cc: Suren Baghdasaryan <[email protected]>
    Cc: Thomas Bogendoerfer <[email protected]>
    Cc: Thomas Gleixner <[email protected]>
    Cc: Will Deacon <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Stable-dep-of: a77644d009de ("arm64: mm: Fix the lockless page-table walk in show_pte()")
    Signed-off-by: Sasha Levin <[email protected]>

arm64: dts: qcom: sdm845-db845c: Mark cont splash memory region as reserved [+ + +]
Author: Amit Pundir <[email protected]>
Date:   Wed Jul 26 18:57:19 2023 +0530

    arm64: dts: qcom: sdm845-db845c: Mark cont splash memory region as reserved
    
    [ Upstream commit 110e70fccce4f22b53986ae797d665ffb1950aa6 ]
    
    Adding a reserved memory region for the framebuffer memory
    (the splash memory region set up by the bootloader).
    
    It fixes a kernel panic (arm-smmu: Unhandled context fault
    at this particular memory region) reported on DB845c running
    v5.10.y.
    
    Cc: [email protected] # v5.10+
    Reviewed-by: Caleb Connolly <[email protected]>
    Signed-off-by: Amit Pundir <[email protected]>
    Acked-by: Krzysztof Kozlowski <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Bjorn Andersson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

arm64: errata: Add Cortex-A725 erratum 3821522 workaround [+ + +]
Author: Beata Michalska <[email protected]>
Date:   Tue Oct 6 15:14:29 2026 +0200

    arm64: errata: Add Cortex-A725 erratum 3821522 workaround
    
    [ Upstream commit 45f7304679875eb000d67e194090ee7abd05c89c ]
    
    Cortex-A725 erratum 3821522 affects the CNT_CYCLES event, which can
    incur a significant increment error when a CPU enters and subsequently
    exits WFE or WFI, and may no longer track the system counter
    frequency.
    
    The AMEVCNTR01_EL0 counter is used as the AMU constant counter for
    frequency invariance and CPPC FFH feedback counters. Wire the affected
    Cortex-A725 range into the shared broken AMU constant-counter capability
    so the affected counter is treated as unavailable by returning zero in
    the AMU counter paths. This prevents the broken counter from being used
    as a reference source.
    
    The erratum can also affect PMUv3 users of the CNT_CYCLES event,
    but this workaround intentionally does not change PMU event handling.
    Hiding or rejecting the PMU event from the erratum code would change
    the perf-visible PMU event interface, including raw event selection,
    and would need a separate PMU-specific approach rather than being
    folded into the AMU reference-counter workaround.
    
    Cc: [email protected]
    Signed-off-by: Beata Michalska <[email protected]>
    Reviewed-by: Vladimir Murzin <[email protected]>
    Signed-off-by: Will Deacon <[email protected]>
    Signed-off-by: Beata Michalska <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

arm64: errata: Factor out broken AMU const counter cap [+ + +]
Author: Beata Michalska <[email protected]>
Date:   Tue Oct 6 15:14:28 2026 +0200

    arm64: errata: Factor out broken AMU const counter cap
    
    [ Upstream commit 573371caf7aea8582212da81dcead2c3f48fac4b ]
    
    Move the workaround from the erratum 2457168-specific cpucap to a generic
    broken AMU constant-counter one. This keeps the existing Cortex-A510
    handling unchanged while allowing other errata with similar AMU constant
    counter issue to share the capability bit and call sites.
    
    Signed-off-by: Beata Michalska <[email protected]>
    Reviewed-by: Vladimir Murzin <[email protected]>
    Signed-off-by: Will Deacon <[email protected]>
    [ Beata: Skipped comment updated on amu_read_core_const_ctrs, as that functionality is not available here. Otherwise unmodified. ]
    Signed-off-by: Beata Michalska <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

arm64: mm: Fix the lockless page-table walk in show_pte() [+ + +]
Author: Karl Mehltretter <[email protected]>
Date:   Thu Sep 10 15:08:37 2026 -0400

    arm64: mm: Fix the lockless page-table walk in show_pte()
    
    [ Upstream commit a77644d009dece1104b6fcc6e322b0e4503db0d6 ]
    
    show_pte() walks page tables locklessly and can run with interrupts
    enabled. A concurrent teardown can free a table page while it is being
    walked. It can also clear a parent entry after show_pte() checked it; the
    regular pXd_offset() helpers then reread the cleared entry and can derive a
    bogus lower-level pointer and fault again.
    
    Use the lockless offset helpers with the saved parent entries, as
    gup_fast() does, and pass the saved PMD to pte_offset_map().
    
    For task page tables, arm64 selects MMU_GATHER_RCU_TABLE_FREE. Disable
    local interrupts around the walk to hold off RCU-deferred table frees and
    block the tlb_remove_table_sync_one() IPI until the walk is finished.
    
    Place the IRQ guard after the header print. This does not make the output a
    consistent snapshot, but prevents the task page-table walk from
    dereferencing a released table page or deriving a pointer from a different
    parent value.
    
    Fixes: 1d18c47c735e ("arm64: MMU fault handling and page table management")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <[email protected]>
    Signed-off-by: Will Deacon <[email protected]>
    [ replaced guard(irqsave)() with explicit local_irq_save()/local_irq_restore() calls to avoid declarations after statements. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ASoC: adau1372: allow sleepy powerdown GPIOs [+ + +]
Author: Alvin Šipraga <[email protected]>
Date:   Tue Oct 6 14:55:56 2026 +0200

    ASoC: adau1372: allow sleepy powerdown GPIOs
    
    [ Upstream commit 64dd172bbffe6135d79a06ddad53dd2da4d8bd62 ]
    
    gpiod_set_value() emits a WARN when the GPIO provider indicates that it
    can sleep, as is typical for I2C controlled GPIO expanders. Since the
    powerdown GPIO is only manipulated in process context, use the _cansleep
    variant instead. This lets the driver use sleepy GPIOs to power off the
    chip.
    
    Fixes: 6cd4c6459e47 ("ASoC: Add ADAU1372 audio CODEC support")
    Signed-off-by: Alvin Šipraga <[email protected]>
    Acked-by: Nuno Sá <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: adau1372: fix invalid default state of output ASRC and DAC muxes [+ + +]
Author: Alvin Šipraga <[email protected]>
Date:   Tue Oct 6 14:55:57 2026 +0200

    ASoC: adau1372: fix invalid default state of output ASRC and DAC muxes
    
    [ Upstream commit 36d0e05815ce84266c8b138cd4f84c3feeaf15f4 ]
    
    The chip has strange power-on reset values for the registers that
    control the output ASRC and DAC source muxes - the values are actually
    marked "Reserved" in the datasheet [1]. This means that until the
    underlying kcontrols are modified, the codec will not function as
    expected.
    
    The registers in question are:
    
      register / field       reset value       valid values
    
      ASRCO_SOURCE_0_1       0x10
       ASRC_OUT_SOURCE0      0                 4 .. 16
       ASRC_OUT_SOURCE1      1                 4 .. 16
      ASRCO_SOURCE_2_3       0x10
       ASRC_OUT_SOURCE2      2                 4 .. 16
       ASRC_OUT_SOURCE3      3                 4 .. 16
      DAC_SOURCE_0_1         0x10
       DAC_SOURCE_0          0                 12 .. 13
       DAC_SOURCE_1          1                 12 .. 13
    
    Set some sane defaults during the driver probe:
    
      ADC Decimator0 -> Output ASRC0
      ADC Decimator1 -> Output ASRC1
      ADC Decimator2 -> Output ASRC2
      ADC Decimator3 -> Output ASRC3
      Input ASRC0 -> DAC0
      Input ASRC1 -> DAC1
    
    With this, the chip will behave as advertised by the default kcontrol
    state exposed by the driver.
    
    [1] https://www.analog.com/media/en/technical-documentation/data-sheets/ADAU1372.pdf
    
    Fixes: 6cd4c6459e47 ("ASoC: Add ADAU1372 audio CODEC support")
    Signed-off-by: Alvin Šipraga <[email protected]>
    Acked-by: Nuno Sá <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: codecs: rt274: Fix format setting for 44100 rate [+ + +]
Author: Cezary Rojewski <[email protected]>
Date:   Fri Sep 18 13:17:45 2026 +0200

    ASoC: codecs: rt274: Fix format setting for 44100 rate
    
    [ Upstream commit 6eda8938a790f65bd24fcfaae7b40ad4613fb7a2 ]
    
    As per specification, Sample Base Rate (bit 14)
    shall be set to 1 for 44.1 kHz.
    
    Fixes: c7e79b2b2d2d ("ASoC: rt274: add rt274 codec driver")
    Signed-off-by: Amadeusz Sławiński <[email protected]>
    Signed-off-by: Cezary Rojewski <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: cs42l52: Fix the NG Type Switch bit [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:48 2026 +0900

    ASoC: cs42l52: Fix the NG Type Switch bit
    
    [ Upstream commit 8b08b98796d2da103f2432550c14a7c687e72080 ]
    
    The NG Type Switch enum selects between "Apply Specific" and "Apply
    All", which is the NGALL bit. The datasheet puts NGALL at bit 7 of the
    Noise Gate Control register. The enum uses bit 6, which is NG, the
    noise gate enable owned by the NG Enable Switch. cs42l52.h names it
    CS42L52_NG_ENABLE_SHIFT. cs42l56 has the same Noise Gate register and
    puts its NG All Switch at bit 7.
    
    So changing the noise gate type turns the noise gate on or off, and
    NGALL cannot be set.
    
    Use bit 7.
    
    Fixes: dfe0f98b8d2e ("ASoC: Add support for CS42L52 Codec")
    Link: https://statics.cirrus.com/pubs/proDatasheet/CS42L52_F2.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: cs42l56: Put the Limiter Cushion control on the limiter register [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:47 2026 +0900

    ASoC: cs42l56: Put the Limiter Cushion control on the limiter register
    
    [ Upstream commit 203436d2aeb7093290459e344e1912a418a6ebfd ]
    
    The Limiter Cushion control writes bits 4:2 of the ALC Thresholds
    register. Those bits are ALCMIN, which the ALC MIN control owns. The
    datasheet puts CUSH at bits 4:2 of the Limit Thresholds Control
    register, next to LMAX, which the Limiter MAX control already uses.
    
    So setting the limiter cushion changes the ALC minimum threshold, and
    the cushion itself cannot be set.
    
    Use CS42L56_LIM_THRESHOLD_CTL.
    
    Fixes: 272b5edd3b8f ("ASoC: Add support for CS42L56 CODEC")
    Link: https://statics.cirrus.com/pubs/proDatasheet/CS42L56_F2.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: max98371: Fix the Speaker DHT Min Volume bits [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:50 2026 +0900

    ASoC: max98371: Fix the Speaker DHT Min Volume bits
    
    [ Upstream commit f7934340c56a84fc1b246ebf6b2e806d775f3b54 ]
    
    Register 0x31 holds two 4-bit fields. The datasheet puts SPK_GAIN_MIN
    at bits 7:4 and DHT_VROT_PNT at bits 3:0. The Speaker DHT Min Volume
    and Speaker DHT Rotation Volume controls both use bits 3:0.
    
    So setting the minimum speaker gain changes the DHT rotation point, and
    SPK_GAIN_MIN cannot be set.
    
    Move Speaker DHT Min Volume to bits 7:4.
    
    Fixes: ca2cd6bc6663 ("ASoC: Add max98371 codec driver")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: nau8822: Fix the 128x oversampling switch bits [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:52 2026 +0900

    ASoC: nau8822: Fix the 128x oversampling switch bits
    
    [ Upstream commit 4db45fc1da3d62d0fa6e8f1e457ae92e8741ed07 ]
    
    The DAC and ADC 128x Oversampling Switches use bit 5 of R10 and R14.
    The NAU8822 datasheet register map puts DACOS and ADCOS at bit 3 of
    those registers.
    
    In R14, bit 5 is inside HPF[6:4], which the High Pass Cut Off control
    owns. So turning on ADC oversampling changes the high pass cut-off, and
    the oversampling bit cannot be set. In R10, bit 5 is reserved, so the
    DAC switch has no effect.
    
    Use bit 3 for both.
    
    Fixes: 1e3cb6c321be ("ASoC: nau8822: new codec driver")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: pcm3168a: Fix the DAC zero flag polarity bit [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:49 2026 +0900

    ASoC: pcm3168a: Fix the DAC zero flag polarity bit
    
    [ Upstream commit b26edc925c1cfa0184cd270ed81d4833db045ce0 ]
    
    The DAC Zero Flag Polarity enum uses PCM3168A_DAC_ATSPDA_SHIFT, which
    is bit 6 of register 70. That bit is ATSPDA, the attenuation speed,
    which the DAC Volume Rate Multiplier enum already owns. The datasheet
    puts ZREV, the zero flag polarity, at bit 0. The header defines
    PCM3168A_DAC_ZREV_SHIFT for it, but nothing uses it.
    
    So changing the zero flag polarity changes the attenuation speed, and
    ZREV cannot be set.
    
    Use PCM3168A_DAC_ZREV_SHIFT.
    
    Fixes: a9b17a638af5 ("ASoC: pcm3168a: Add driver for pcm3168a codec")
    Link: https://www.ti.com/lit/ds/symlink/pcm3168a.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Reviewed-by: Cezary Rojewski <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: qcom: lpass-cpu: use DAI table index for playback constraints [+ + +]
Author: Zimeng Li <[email protected]>
Date:   Sun Sep 27 09:09:11 2026 +0800

    ASoC: qcom: lpass-cpu: use DAI table index for playback constraints
    
    commit ca51771c8efde5df05476ac98dd1b2af4e2b149f upstream.
    
    The DAI ID is a hardware port ID and is not necessarily the index of
    the corresponding entry in variant->dai_driver.
    
    When configuring a DAI with LPAIF_I2SCTL_MODE_QUAD01, the probe code
    currently uses dai_id to index variant->dai_driver. This is incorrect
    for platforms where DAI IDs are sparse. For example, the IPQ806x MI2S
    DAI has ID 4 while it is the only entry in the DAI driver table. If
    that DAI is configured for QUAD01 and probe reaches this branch, the
    code writes beyond that single entry via dai_driver[4] instead of
    updating the DAI being processed.
    
    Use the loop index i when updating the current DAI's playback channel
    constraints, while retaining dai_id for indexing the hardware-port
    specific playback SD-line mode array.
    
    This fixes the incorrect DAI table access for platforms where the DAI
    ID does not match its position in the driver table.
    
    Fixes: c223f41c1a52 ("ASoC: qcom: Add four speaker support on MI2S secondary")
    Cc: [email protected]
    Signed-off-by: Zimeng Li <[email protected]>
    Assisted-by: LLM-assisted source analysis
    Reviewed-by: Srinivas Kandagatla <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ASoC: samsung: i2s: enable op_clk in probe to balance runtime PM [+ + +]
Author: Marek Szyprowski <[email protected]>
Date:   Fri Oct 2 11:21:12 2026 +0200

    ASoC: samsung: i2s: enable op_clk in probe to balance runtime PM
    
    [ Upstream commit 7529254014764ae0b8c33d5c61a58f36c65b1a1c ]
    
    The probe function puts the device into the runtime PM active state with
    only the "iis" bus clock enabled, but it also sets priv->op_clk to the
    parent of the RCLK_SRC mux without enabling it. The runtime PM suspend
    callback disables both clocks, so the first runtime suspend after probe
    disables op_clk once more than it was enabled.
    
    On Exynos5250 Arndale both clocks resolve to the same EXYNOS_I2S_BUS gate,
    so this triggers the following warning during boot:
    
     WARNING: drivers/clk/clk.c:1270 at clk_core_disable+0xe4/0x23c, CPU#0: kworker/u8:3/45
     i2s_bus already disabled
     ...
     Workqueue: pm pm_runtime_work
     Call trace:
      ...
      clk_core_disable from clk_disable+0x28/0x34
      clk_disable from i2s_runtime_suspend+0x58/0x68 [snd_soc_i2s]
      i2s_runtime_suspend [snd_soc_i2s] from genpd_runtime_suspend+0xc4/0x298
      genpd_runtime_suspend from __rpm_callback+0x48/0x18c
      __rpm_callback from rpm_callback+0x4c/0x50
      rpm_callback from rpm_suspend+0xf4/0x718
      rpm_suspend from pm_runtime_work+0x9c/0xa0
      ...
    
    Fix this by enabling op_clk in probe right after getting it, so the clock
    state matches the runtime PM active state, and by disabling it in remove.
    
    Fixes: 48279c53fd1d ("ASoC: samsung: i2s: Prevent external abort on exynos5433 I2S1 access")
    Assisted-by: Claude Opus 5.5 <[email protected]>
    Signed-off-by: Marek Szyprowski <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: stm32: spdifrx: fix synchronization state check [+ + +]
Author: Avi Weiss <[email protected]>
Date:   Sun Oct 11 06:54:59 2026 +0300

    ASoC: stm32: spdifrx: fix synchronization state check
    
    [ Upstream commit 0936bbd35a247665c64886135835faa3c3f4f29f ]
    
    The interrupt handler uses a logical AND to check whether SPDIFRX
    was in the SYNC state before clearing errors. Since both SYNC (1)
    and ENABLE (3) are nonzero, this also treats ENABLE as SYNC (and
    any other non-zero value that might be added).
    
    The logical && basically just converts this to check for != 0.
    
    So errors occurring while SPDIFRX is enabled cause the driver
    to retry synch instead of disconnecting the PCM stream.
    
    Fix is to change the logical && to equality (==) and only retry
    when exactly in sync state.
    
    Fixes: 0c93c291321f2 ("ASoC: stm32: spdifrx: retry synchronization in sync state")
    Signed-off-by: Avi Weiss <[email protected]>
    Reviewed-by: Olivier Moysan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: wm8903: Move the DRC QR threshold to the register that holds it [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Sun Sep 20 22:53:27 2026 +0900

    ASoC: wm8903: Move the DRC QR threshold to the register that holds it
    
    [ Upstream commit e31ae4aeb049983fe3be0cf1e12c8074811a7685 ]
    
    The DRC_THRESH_QR field is bits 7 and 6 of DRC_1, but the control sits on
    DRC_0. Its shift and max are right for the field, only the register is
    wrong.
    
    Those bits of DRC_0 belong to DRC_STARTUP_GAIN, which "DRC Startup
    Volume" claims as bits 10 to 6. So the two controls share bits 7 and 6.
    Writing either one moves the other, and the quick release threshold is
    never reached at all.
    
    The six fields of DRC_1 tile it exactly, so there is nowhere else the
    threshold could live. Point the control at DRC_1.
    
    Found by a sweep for two controls claiming the same bits of one
    register. No board with this codec was to hand, the register map is
    the driver's own wm8903.h.
    
    Fixes: f1c0a02f32f8 ("ALSA: ASoC: Add WM8903 CODEC driver")
    Signed-off-by: HyeongJun An <[email protected]>
    Assisted-by: Claude:claude-opus-5
    Reviewed-by: Charles Keepax <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: wm8978: Fix the 128x oversampling switch bits [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:51 2026 +0900

    ASoC: wm8978: Fix the 128x oversampling switch bits
    
    [ Upstream commit d0567ca9a2faa33efbe5ae84ef7b86423a93bffd ]
    
    The DAC and ADC 128x Oversampling Switches use bit 5 of R10 and R14.
    Table 66 of the WM8978 datasheet puts DACOSR128 and ADCOSR128 at bit 3
    of those registers.
    
    In R14, bit 5 is inside HPFCUT[6:4], which the High Pass Cut Off
    control owns. So turning on ADC oversampling changes the high pass
    cut-off, and the oversampling bit cannot be set. In R10, bit 5 is
    reserved, so the DAC switch has no effect.
    
    Use bit 3 for both.
    
    Fixes: 823dba519122 ("ASoC: Fix broken bitfield definitions in WM8978")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
audit: fix exe mark UAF in kill_rules() [+ + +]
Author: Jérémy Jean <[email protected]>
Date:   Tue Sep 22 20:27:35 2026 +0000

    audit: fix exe mark UAF in kill_rules()
    
    commit aa650d87a498844060eecb1d336f4d46f4d1b0b3 upstream.
    
    kill_rules() removes mixed AUDIT_DIR and AUDIT_EXE rules when an audit
    tree is pruned. It drops entry->rule.exe before removing the rule from
    the RCU-visible filter lists.
    
    After a rule has been installed with AUDIT_ADD_RULE, which requires
    CAP_AUDIT_CONTROL, removing the watched directory can race with another
    task that is still evaluating the rule. In that case, fsnotify can free
    the executable mark before the reader reaches audit_mark_compare(),
    causing a use-after-free.
    
    KASAN reports:
    
        BUG: KASAN: slab-use-after-free in audit_mark_compare+0x8d/0xa0
    
    Unlink the published rules from the RCU-visible lists and retain them
    on tree->rules for cleanup. If any rule has an executable mark, wait for
    a single RCU grace period before removing the marks and scheduling the
    entries for freeing. Otherwise, call_rcu() already provides the required
    deferred freeing without a synchronous wait.
    
    Cc: [email protected]
    Fixes: 34d99af52ad4 ("audit: implement audit by executable")
    Assisted-by: Codex:gpt-5
    Signed-off-by: Jérémy Jean <[email protected]>
    Reviewed-by: Ricardo Robaina <[email protected]>
    Tested-by: Ricardo Robaina <[email protected]>
    Reviewed-by: Bradley Morgan <[email protected]>
    Signed-off-by: Paul Moore <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
autofs: ignore notification errors from a replaced pipe [+ + +]
Author: Sung Byeongchan <[email protected]>
Date:   Thu Oct 8 02:35:42 2026 +0900

    autofs: ignore notification errors from a replaced pipe
    
    commit 65676cd4203c0e41a94caf54080a7f0a95434bda upstream.
    
    autofs_notify_daemon() takes a reference to the current notification
    pipe under wq_mutex, then drops the mutex before writing the request. The
    write can block while the daemon enters catatonic mode and installs a
    replacement pipe.
    
    If the old pipe's reader is then closed, the delayed write returns -EPIPE
    and the generic error path enters catatonic mode again. That transition
    acts on the current superblock state, closes the replacement pipe, and
    releases the new daemon generation's wait queues.
    
    Only enter catatonic mode when the pipe which failed is still the current
    pipe. Factor the already-locked transition so the identity check and state
    change are atomic with respect to another replacement.
    
    This was reproduced on v7.3-rc5-337-gff47652a4b66c in a local QEMU guest.
    An unprivileged UID 65534 lookup filled the old packet pipe before a
    normal CATATONIC/SETPIPEFD restart. On the unmodified kernel, the new pipe
    received HUP and both a pending victim lookup and a later lookup failed
    with ENOENT in two out of two fresh-mount runs.
    
    With this change, the new pipe remained active, received an intact
    304-byte request, and both victim lookups completed in two out of two
    runs. Normal lookup and restart-without-a-blocked-writer controls passed.
    No KASAN, oops, refcount, or lock diagnostic was observed. A source
    reproducer and complete local logs are available privately on request.
    
    The demonstrated impact is limited to denial of a shared autofs service
    during a legitimate daemon restart. No memory corruption, information leak,
    privilege escalation, or code execution primitive was observed.
    
    Fixes: 8d7b48e0bc5fa ("autofs4: add miscellaneous device for ioctls")
    Cc: [email protected]
    Signed-off-by: Sung Byeongchan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Acked-by: Ian Kent <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Bluetooth: btintel: fix buffer over-read in btintel_hw_error() [+ + +]
Author: Chandrashekar Devegowda <[email protected]>
Date:   Tue Sep 22 12:10:20 2026 +0530

    Bluetooth: btintel: fix buffer over-read in btintel_hw_error()
    
    commit 40eb4b18ad167b63644c27fa67a7400ba050379a upstream.
    
    The "Exception info %s" print uses skb->data + 1, but the 12-byte
    payload is not guaranteed to be NUL-terminated and can be read past
    its end.
    
    Bound the print with "%.*s" and skb->len - 1.
    
    Fixes: 973bb97e5aee ("Bluetooth: btintel: Add generic function for handling hardware errors")
    Cc: [email protected]
    Signed-off-by: Chandrashekar Devegowda <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: btintel: validate DDC record lengths [+ + +]
Author: Sai Teja Aluvala <[email protected]>
Date:   Tue Sep 22 18:33:11 2026 +0530

    Bluetooth: btintel: validate DDC record lengths
    
    [ Upstream commit c9c15d4d8956df8c564f7c210e4dc5b9b820d97a ]
    
    Parse DDC record lengths in unsigned storage so 0xFF does not wrap.
    Reject records smaller than the mandatory three-byte header, records
    exceeding U8_MAX, and records exceeding remaining firmware bytes before
    issuing Intel_Write_DDC.
    
    This issue was reported by Claude Mythos.
    
    Fixes: 145f2368c5fd ("Bluetooth: btintel: Add Device Configuration support")
    Signed-off-by: Sai Teja Aluvala <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: btqcomsmd: Convert to platform remove callback returning void [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Wed Sep 16 15:38:28 2026 -0400

    Bluetooth: btqcomsmd: Convert to platform remove callback returning void
    
    [ Upstream commit 4a62832f565c950d645a4f7b199a0a7985815940 ]
    
    The .remove() callback for a platform driver returns an int which makes
    many driver authors wrongly assume it's possible to do error handling by
    returning an error code. However the value returned is ignored (apart
    from emitting a warning) and this typically results in resource leaks.
    
    To improve here there is a quest to make the remove callback return
    void. In the first step of this quest all drivers are converted to
    .remove_new(), which already returns void. Eventually after all drivers
    are converted, .remove_new() will be renamed to .remove().
    
    Trivially convert this driver from always returning zero in the remove
    callback to the void returning variant.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Stable-dep-of: f5a427b16e45 ("Bluetooth: btqcomsmd: destroy RPMsg endpoints before freeing hci_dev")
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: btqcomsmd: destroy RPMsg endpoints before freeing hci_dev [+ + +]
Author: Xu Rao <[email protected]>
Date:   Wed Sep 16 15:38:29 2026 -0400

    Bluetooth: btqcomsmd: destroy RPMsg endpoints before freeing hci_dev
    
    [ Upstream commit f5a427b16e45210dee656b0860728f3d496dee85 ]
    
    The command and ACL RPMsg endpoints store struct btqcomsmd as their
    callback private data. The receive callbacks dereference btq->hdev
    without taking an hci_dev reference.
    
    The current teardown order frees the hci_dev before destroying the RPMsg
    endpoints in both the hci_register_dev() error path and the driver remove
    path. If WCNSS delivers data in that window, the endpoint callback can
    run with an already freed hci_dev and pass it to the Bluetooth core.
    
    For qcom_smd endpoints, rpmsg_destroy_ept() closes the channel and clears
    the callback under the channel recv_lock. The receive path holds the same
    lock while invoking the callback, so destroying the endpoints first both
    prevents new callbacks and serializes with any callback already running.
    
    Destroy the command and ACL endpoints before hci_free_dev(). Keep
    hci_unregister_dev() first during remove so the HCI core stops issuing
    operations before the transport endpoints are shut down. In the full
    registration-error cleanup path, return directly after freeing the hci_dev
    to avoid falling through to the partial-construction labels and destroying
    the endpoints twice.
    
    Fixes: 5052de8deff5 ("soc: qcom: smd: Transition client drivers from smd to rpmsg")
    Fixes: 9a39a927be01 ("Bluetooth: btqcomsmd: Fix a resource leak in error handling paths in the probe function")
    Cc: [email protected]
    Acked-by: Bartosz Golaszewski <[email protected]>
    Reviewed-by: Dmitry Baryshkov <[email protected]>
    Signed-off-by: Xu Rao <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: btusb: Add IMC Networks QCA9377 to quirks table [+ + +]
Author: Tibor Harcsa <[email protected]>
Date:   Mon Jun 29 22:34:20 2026 +0200

    Bluetooth: btusb: Add IMC Networks QCA9377 to quirks table
    
    [ Upstream commit dc16388d45ecbd3be0d8c9424dbbaa2c81806578 ]
    
    Add the USB ID (13d3:3503) for the IMC Networks Qualcomm Atheros
    QCA9377 Bluetooth controller to the btusb quirks table. This device
    requires Qualcomm Rome firmware and wideband speech support to function
    properly; otherwise, BLE scanning fails with HCI unexpected event
    opcode 0x2005 errors.
    
    The device reports the following in /sys/kernel/debug/usb/devices:
    
    P:  Vendor=13d3 ProdID=3503 Rev= 0.01
    C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
    I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=81(I) Atr=03(Int.) MxPS=  16 Ivl=1ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
    I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=   0 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=   0 Ivl=1ms
    I:  If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=   9 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=   9 Ivl=1ms
    I:  If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  17 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  17 Ivl=1ms
    I:  If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  25 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  25 Ivl=1ms
    I:  If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  33 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  33 Ivl=1ms
    I:  If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  49 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  49 Ivl=1ms
    
    Signed-off-by: Tibor Harcsa <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: hci_core: Fix inquiry cache timestamps on 64-bit systems [+ + +]
Author: Linmao Li <[email protected]>
Date:   Tue Sep 22 10:01:41 2026 +0800

    Bluetooth: hci_core: Fix inquiry cache timestamps on 64-bit systems
    
    commit 74847177eca5638827ab74cdf77f0b10fc40ca6c upstream.
    
    On 64-bit systems, outgoing BR/EDR connections always fall back to page
    scan repetition mode R2 with no clock offset once the system has been
    up for more than five minutes, even when inquiry found the peer only
    seconds earlier. This lengthens paging and can increase the risk of a
    Page Timeout.
    
    The inquiry cache stores jiffies in __u32 timestamps, but its age
    helpers subtract them from unsigned long jiffies. INITIAL_JIFFIES casts
    -300 * HZ through unsigned int, so jiffies crosses 2^32 five minutes
    after boot on 64-bit systems. Assigning it to __u32 then drops the upper
    32 bits. In one trace, a 7.6-second-old entry (HZ=1000) was reported as
    2^32 + 7620 ticks old and rejected by hci_acl_create_conn_sync().
    hci_inquiry() is affected by the same truncation when checking the whole
    cache. 32-bit systems are unaffected because unsigned long is 32 bits
    wide there.
    
    Use unsigned long for both timestamps so they have the same width as
    jiffies on 32-bit and 64-bit systems, and update the debugfs format
    specifier accordingly.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Signed-off-by: Linmao Li <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: hci_core: free the HCI ID if naming fails [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Tue Sep 22 03:49:28 2026 +0900

    Bluetooth: hci_core: free the HCI ID if naming fails
    
    [ Upstream commit d1ac915fb4184faad1b62148be50f317de7c24b5 ]
    
    hci_register_dev() allocates an ID before calling dev_set_name().
    If naming fails, it returns without releasing that ID. The device has
    not been registered and hdev->id has not been assigned, so the normal
    unregister path cannot release it.
    
    Free the allocated ID before returning the naming error.
    
    Fixes: dcda165706b9 ("Bluetooth: hci_core: Fix build warnings")
    Reported-by: Changyul Lee <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Reported-by: Changyul Lee <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: hci_core: Serialize ACL scheduling with channel deletion [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Sun Sep 27 01:04:02 2026 +0800

    Bluetooth: hci_core: Serialize ACL scheduling with channel deletion
    
    commit f4845ab191a4f686a5da481fbba90ed73bb693b0 upstream.
    
    hci_chan_sent() selects a channel under RCU but drops the read lock before
    accessing chan->conn and returning the channel. The ACL and LE schedulers
    then use its packet queue and update its transmit counters without any
    protection against channel deletion.
    
    After TX selects a channel and releases RCU, a disconnect command timeout
    on the separate request workqueue can run hci_conn_failed() and
    l2cap_conn_del(). hci_chan_del() can then unlink the channel, complete
    synchronize_rcu(), purge its queue and free it before TX resumes. This
    causes use-after-free both in hci_chan_sent() and in its callers.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in hci_chan_sent+0x892/0x9b0
      Workqueue: hci0 hci_tx_work
      Call Trace:
       hci_chan_sent+0x892/0x9b0
       hci_tx_work+0x5e6/0xb70
      Allocated by task 91:
       hci_chan_create+0xe3/0x350
       l2cap_conn_add.part.0+0x12/0xa30
       l2cap_chan_connect+0x110d/0x1b60
       l2cap_sock_connect+0x310/0x530
      Freed by task 99:
       hci_chan_del+0x11f/0x170
       l2cap_conn_del+0x4f1/0x800
       l2cap_connect_cfm+0x88c/0xd30
       hci_conn_failed+0x150/0x250
       hci_abort_conn_sync+0x3e3/0x800
       hci_cmd_sync_run+0x7e/0xc0
       hci_abort_conn+0x105/0x1f0
       disconnect_sync+0x157/0x290
       hci_cmd_sync_work+0x13c/0x290
    
    Hold the existing device mutex across channel selection and transmission
    in both schedulers to serialize them with channel teardown. Keep timeout
    handling outside the critical sections because hci_link_tx_to() acquires
    the same mutex. This also permits the transmit path to sleep, unlike
    extending the RCU read-side critical section across packet submission.
    
    Fixes: 3eff45eaf817 ("Bluetooth: convert tx_task to workqueue")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: hci_sock: Serialize dead-device detachment [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Mon Oct 5 00:24:42 2026 +0800

    Bluetooth: hci_sock: Serialize dead-device detachment
    
    commit 381a0925c556a8d91a80a9b9e3e86651d60ffee3 upstream.
    
    Rebinding an HCI socket after its controller is unregistered can race
    monitor control replay and crash the kernel. hci_sock_bind() clears
    hci_pi(sk)->hdev and drops the device reference under only the socket
    lock, whereas send_monitor_control_replay() holds hci_sk_list.lock for
    reading.
    
    Replay can observe a non-NULL hdev, then bind can clear it and drop the
    last reference before create_monitor_ctrl_open() reads hdev->id. This
    can cause a NULL pointer dereference if the pointer is reloaded, or a
    use-after-free if the old pointer is retained.
    
    The kernel reported:
    
      KASAN: null-ptr-deref in range [0x0000000000000068-0x000000000000006f]
      RIP: 0010:create_monitor_ctrl_open+0x579/0x800
      Call Trace:
       hci_sock_bind+0xd96/0x1190
       __sys_bind+0x166/0x200
       __x64_sys_bind+0x6d/0xb0
       do_syscall_64+0xdd/0x4a0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
    
    The same missing serialization lets hci_send_to_sock() select a socket
    for the old device and queue its frame after bind has detached the socket
    or installed a new binding.
    
    Take hci_sk_list.lock for writing when clearing the device pointer and
    resetting the socket state. This waits for existing replay and delivery
    readers to finish before detachment and prevents later readers from
    using the old binding. Keep hci_dev_put() outside the critical section
    because the final device release can sleep.
    
    Fixes: e04480920d1e ("Bluetooth: defer cleanup of resources in hci_unregister_dev()")
    Cc: [email protected]
    Assisted-by: GPT-6 Astra
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: L2CAP: access chan->conn safely in get/setsockopt [+ + +]
Author: Pauli Virtanen <[email protected]>
Date:   Tue Oct 27 10:02:39 2026 +0000

    Bluetooth: L2CAP: access chan->conn safely in get/setsockopt
    
    [ Upstream commit ca2c4c26498643f421d35ffe258fafbd3ed461c3 ]
    
    Since commit b66774b48dd9 ("Bluetooth: L2CAP: Fix UAF in channel timeout by holding conn ref")
    l2cap_chan::conn has held reference and remains non-NULL also after the
    corresponding hci_conn is deleted.  In this state accessing various
    fields eg. hci_conn::hdev is invalid, which leads to KASAN crash in
    l2cap_sock_setsockopt() access of conn->hcon->hdev.
    
    Check l2cap_chan::conn.hcon corresponds to an alive hci_conn before
    trying to use it in l2cap_sock.c.  Hold l2cap_chan_lock() in
    getsockopt/setsockopt to ensure it stays alive, and to avoid data races
    in l2cap_chan fields.
    
    Fixes: b66774b48dd9 ("Bluetooth: L2CAP: Fix UAF in channel timeout by holding conn ref")
    Reported-by: [email protected]
    Link: https://syzkaller.appspot.com/bug?extid=b106284c2a0b7bc80cf9
    Signed-off-by: Pauli Virtanen <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [Lee: Omit sockopt_t conversion from commit bf01627cc04b ("Bluetooth: L2CAP: convert to getsockopt_iter")]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn [+ + +]
Author: Pauli Virtanen <[email protected]>
Date:   Tue Oct 27 10:02:40 2026 +0000

    Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn
    
    [ Upstream commit 86b55991d3cd690e73c5ef8d20b75ae4905b357a ]
    
    l2cap_chan may be linked to l2cap_conn at most once. This is assumed in
    several places, eg l2cap_chan_del cleanup.
    
    There is a TOCTOU race where the invariant is violated:
    
        [Task 1]                          [Task 2]
        l2cap_chan_connect                l2cap_sock_bind
          l2cap_chan_lock                   lock_sock
          l2cap_state_change                if (sk->sk_state != BT_OPEN)
            chan->state = BT_CONNECT
            l2cap_sock_state_change_cb      chan->state = BT_BOUND
                                            sk->sk_state = BT_BOUND
              lock_sock <------------------ release_sock
              sk->sk_state = BT_CONNECT
    
    l2cap_sock_connect() does not check sk->sk_state, so since chan->state
    is now BT_BOUND, subsequent connect() ends up with second
    __l2cap_chan_add.
    
    Explicitly document and check the invariant in __l2cap_chan_add with
    WARN_ON_ONCE. The only callsite where it could be hit is
    l2cap_chan_connect, so add pre-check there to avoid relying on
    chan->state. chan->state read/write is not properly guarded currently so
    there can be other TOCTOUC problems.
    
    Add l2cap_lock_chan in l2cap_sock_bind() to guard chan->state write.
    
    Fixes: b66774b48dd9 ("Bluetooth: L2CAP: Fix UAF in channel timeout by holding conn ref")
    Assisted-by: deepseek-4-flash # finding the race condition
    Signed-off-by: Pauli Virtanen <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [Lee: Resolve context conflict around mutex_lock(&conn->chan_lock) prior to commit 56c2b5831d39 ("Bluetooth: L2CAP: fix out-of-bounds write in l2cap_ecred_connect")]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: mgmt: fix race in read_unconf_index_list() [+ + +]
Author: Aldo Ariel Panzardo <[email protected]>
Date:   Wed Sep 30 19:14:03 2026 -0400

    Bluetooth: mgmt: fix race in read_unconf_index_list()
    
    [ Upstream commit b5dbb41b212c50c095a4dbee3017a84fe94f033b ]
    
    read_unconf_index_list() counts unconfigured controllers before allocating
    its response, then checks the device flags again while filling it.
    
    hci_dev_list_lock stabilizes list membership, but it does not serialize the
    per-device flags. During asynchronous controller setup, the worker can set
    HCI_UNCONFIGURED and clear HCI_SETUP between the two passes. A controller
    omitted from the allocation count can then become eligible for the fill
    pass, causing an out-of-bounds write to rp->index[].
    
    Allocate space for every device on hci_dev_list. Since list membership
    cannot change while hci_dev_list_lock is held, the response remains large
    enough regardless of flag transitions. The reported count and response
    length still include only eligible unconfigured controllers.
    
    Fixes: 73d1df2a7a10 ("Bluetooth: Add support for Read Unconfigured Index List command")
    Cc: [email protected]
    Signed-off-by: Aldo Ariel Panzardo <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [ replaced unavailable list_count_nodes() with an unconditional device-counting loop. ]
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: RFCOMM: connect the session socket without rfcomm_mutex [+ + +]
Author: Mikhail Gavrilov <[email protected]>
Date:   Tue Oct 13 13:40:39 2026 -0400

    Bluetooth: RFCOMM: connect the session socket without rfcomm_mutex
    
    [ Upstream commit ac022970e9fb0a5f7e7d1f6c8e104c1ed924dd1c ]
    
    An RFCOMM connect() issued while a BR/EDR link is being authenticated
    makes lockdep report a circular dependency, and the reported cycle is a
    real AB/BA between rfcomm_mutex and hdev->lock.
    
    rfcomm_security_cfm() is called from the HCI event path, which already
    holds hdev->lock:
    
      hci_rx_work()
        hci_event_packet()
          hci_cc_read_enc_key_size()   [hdev->lock]
            hci_encrypt_cfm()          [hci_cb_list_lock]
              rfcomm_security_cfm()    [rfcomm_mutex]
    
    while an RFCOMM connect() from userspace takes the same two locks the
    other way round:
    
      rfcomm_sock_connect()
        rfcomm_dlc_open()              [rfcomm_mutex]
          __rfcomm_dlc_open()
            rfcomm_session_create()
              kernel_connect()
                l2cap_sock_connect()
                  l2cap_chan_connect() [hdev->lock]
    
      WARNING: possible circular locking dependency detected
      kworker/u131:1/1128 is trying to acquire lock:
      rfcomm_mutex, at: rfcomm_security_cfm+0x31/0x3e0 [rfcomm]
      but task is already holding lock:
      hci_cb_list_lock, at: hci_cc_read_enc_key_size+0x1d2/0xcc0
      Chain exists of:
        rfcomm_mutex --> &hdev->lock --> hci_cb_list_lock
    
    hci_auth_complete_evt() and hci_encrypt_change_evt() reach the callback
    the same way.
    
    Both orders have to be seen in the same boot, which is why a BR/EDR
    connection alone is not enough to show it: a session set up by the
    remote side is created by rfcomm_accept_connection() in krfcommd, which
    calls kernel_accept() and never takes hdev->lock under rfcomm_mutex.
    Connecting a device that authenticates and encrypts the link and then
    calling connect() on an RFCOMM socket towards any address - the connect
    does not have to succeed, the order is recorded before the page timeout
    - reports it every time.
    
    Only the session socket has to be connected with the lock held, and it
    does not: nothing else can see the socket before it is put on the
    session list.  So connect it first and take rfcomm_mutex afterwards,
    which removes the rfcomm_mutex -> hdev->lock order for good, rather
    than keeping the HCI event path out of rfcomm_mutex.
    
    rfcomm_session_create() becomes rfcomm_session_connect(), which returns
    the connected socket without touching the session list, and
    rfcomm_dlc_open() adds the session once it holds the lock again.  If
    another opener added a session for the same pair while this socket was
    connecting, that session is used and this socket is dropped.
    __rfcomm_dlc_open() now takes the session it should use, and its state
    check runs after the lock is re-acquired, so a DLC that was opened or
    closed in the meantime is still handled.
    
    Over an existing ACL link the connection can complete before the
    session reaches the list, and the wakeup from the socket callback is
    then lost, so krfcommd is woken once the session is visible.
    
    Connecting without the lock opens a window in which the socket can be
    closed.  The DLC is not on a session yet, so rfcomm_dlc_close() finds
    nothing to do and returns without touching it, and rfcomm_dlc_open()
    would then attach a DLC whose owner is gone.  rfcomm_dlc_close() now
    marks such a DLC with RFCOMM_CLOSED, and rfcomm_dlc_open() checks the
    mark once it holds rfcomm_mutex again and drops the socket instead of
    attaching the DLC.  The mark is cleared when an open starts, so a DLC
    that is reused is not affected.  This covers both callers of
    rfcomm_dlc_open(), the socket and the tty layer.
    
    Fixes: 759c185d0bbd ("Bluetooth: RFCOMM: serialize security confirmation handling")
    Suggested-by: Pauli Virtanen <[email protected]>
    Reported-by: Pauli Virtanen <[email protected]>
    Closes: https://lore.kernel.org/linux-bluetooth/[email protected]/
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/linux-bluetooth/[email protected]/
    Reported-by: Jiaming Zhang <[email protected]>
    Closes: https://lore.kernel.org/all/CANypQFabseTuRiyz2pGkc_Qj0moGDnY7KEp1qdTOqkw6gAL3hw@mail.gmail.com/
    Cc: [email protected]
    Signed-off-by: Mikhail Gavrilov <[email protected]>
    Tested-by: [email protected]
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [ sashal: changed the kernel_connect() address cast from struct sockaddr_unsized * to struct sockaddr * ]
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: RFCOMM: Fix initial port reference race [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Sun Sep 27 01:27:23 2026 +0800

    Bluetooth: RFCOMM: Fix initial port reference race
    
    commit 2d696c1ed3468dcb62578a3911e687110d463520 upstream.
    
    For RFCOMM_RELEASE_ONHUP devices, rfcomm_tty_install() and
    __rfcomm_release_dev() both use RFCOMM_TTY_OWNED to decide who drops the
    initial tty_port reference. The release path tests the bit separately
    from the install path setting it, so both can drop that reference.
    
    The synchronous hangup does not prevent this race: port->tty is not
    assigned until tty_port_open(), after installation. The following
    interleaving is possible:
    
      1. Install and release each obtain a reference with rfcomm_dev_get().
      2. Release observes RFCOMM_TTY_OWNED clear.
      3. Install sets RFCOMM_TTY_OWNED and drops the initial reference.
      4. Release drops the same initial reference again.
      5. TTY cleanup drops its reference and frees the device.
      6. Release performs its final tty_port_put() on the freed port.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tty_port_put+0x22/0x190
      Write of size 4 at addr ffff8881001d3d5c by task poc/92
    
      Call Trace:
       tty_port_put+0x22/0x190
       rfcomm_dev_ioctl+0x1d4/0x1930
       sock_do_ioctl+0x110/0x260
       sock_ioctl+0x380/0x590
       __x64_sys_ioctl+0x134/0x1c0
    
      Allocated by task 88:
       rfcomm_dev_ioctl+0x8f6/0x1930
       sock_do_ioctl+0x110/0x260
       sock_ioctl+0x380/0x590
       __x64_sys_ioctl+0x134/0x1c0
    
      Freed by task 65:
       kfree+0x131/0x3c0
       rfcomm_dev_destruct+0x23b/0x2f0
       release_one_tty+0xc1/0x370
       process_one_work+0x661/0x1090
    
    Use test_and_set_bit() in both paths so that only the caller that changes
    RFCOMM_TTY_OWNED from clear to set drops the initial reference. Each path
    keeps its own lookup reference until release or TTY cleanup, preserving
    the existing callback ordering and error handling.
    
    Fixes: 80ea73378af4 ("Bluetooth: Fix unreleased rfcomm_dev reference")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: RFCOMM: Fix NULL tty_dev dereference in rfcomm_dev_shutdown [+ + +]
Author: Palla Raghunath <[email protected]>
Date:   Fri Oct 2 08:07:52 2026 +0100

    Bluetooth: RFCOMM: Fix NULL tty_dev dereference in rfcomm_dev_shutdown
    
    commit 08e90633377f1b2567ab5ad6810b74c552246a07 upstream.
    
    syzbot hit a NULL pointer dereference in rfcomm_dev_shutdown() when an
    RFCOMM tty is closed.
    
    rfcomm_dev_add() puts the new device on rfcomm_dev_list first and only
    then registers the tty device and saves it in dev->tty_dev. If that
    registration fails, dev->tty_dev is never set at all. The device can be
    looked up in the meantime, so an open() of /dev/rfcommN gets through
    rfcomm_tty_install() and attaches to it. When that tty is closed again,
    rfcomm_dev_shutdown() uses dev->tty_dev without checking it:
    
      Oops: general protection fault, probably for non-canonical address
      KASAN: null-ptr-deref in range [0x0000000000000040-0x0000000000000047]
      RIP: 0010:rfcomm_dev_shutdown+0x48/0xb0 net/bluetooth/rfcomm/tty.c:131
      Call Trace:
       tty_port_shutdown+0x1bf/0x220 drivers/tty/tty_port.c:372
       tty_port_close+0x4e/0x150 drivers/tty/tty_port.c:705
       tty_release+0x359/0x1670 drivers/tty/tty_io.c:1718
       __fput+0x418/0xa50 fs/file_table.c:512
    
    rfcomm_dev_destruct() already copes with a NULL dev->tty_dev. Add the
    same check to rfcomm_dev_shutdown(), so the tty device is only moved
    when it was actually registered.
    
    Fixes: cad348a17e17 ("Bluetooth: Implement .activate, .shutdown and .carrier_raised methods")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=4a807caf7680652d53b6
    Cc: [email protected]
    Signed-off-by: Palla Raghunath <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: RFCOMM: free the skb when the DLC has no owner [+ + +]
Author: Maxim Skokov <[email protected]>
Date:   Tue Sep 15 10:00:46 2026 +0300

    Bluetooth: RFCOMM: free the skb when the DLC has no owner
    
    commit 9d1afbf60ed53c5b051cd124153e0ae3078c8b93 upstream.
    
    rfcomm_recv_data() hands the skb to d->data_ready() and returns 0
    without freeing it, so the callback owns the skb from that point on.
    The tty implementation frees it when the DLC has been detached from its
    device:
    
      static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc,
                                        struct sk_buff *skb)
      {
              struct rfcomm_dev *dev = dlc->owner;
    
              if (!dev) {
                      kfree_skb(skb);
                      return;
              }
    
    The socket implementation returns without freeing it, and the skb is
    leaked.
    
    A connected DLC can have no owner: rfcomm_sock_destruct() clears
    d->owner, while the DLC itself stays on the session until it is closed.
    Data frames that arrive in that window still find d->state ==
    BT_CONNECTED in rfcomm_recv_data() and are handed to the callback, one
    leaked skb each.
    
    The leak does not stop on its own either.  The remote runs out of
    credits only once RFCOMM_RX_THROTTLED is set, and for a socket the only
    place that sets it is rfcomm_sk_data_ready() itself, below the return.
    rfcomm_process_dlcs() keeps granting credits, so the remote keeps
    sending and the leak keeps growing.
    
    Free the skb, as the tty side does.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Mikhail Gavrilov <[email protected]>
    Closes: https://lore.kernel.org/linux-bluetooth/CABXGCsPe5wykd8Aj-hm+SJ7SGQyb8yoGNnx3XDpPmBathj+EGg@mail.gmail.com/
    Cc: [email protected]
    Signed-off-by: Maxim Skokov <[email protected]>
    Assisted-by: Claude:claude-opus-5
    Reviewed-by: Mikhail Gavrilov <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
bna: prevent IOC timer rearm during teardown [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Tue Sep 29 10:12:49 2026 -0400

    bna: prevent IOC timer rearm during teardown
    
    [ Upstream commit 77b1718e39e5c9f6956fb60807326af20baf889d ]
    
    bna: prevent IOC timer rearm during teardown
    
    bnad_pci_remove() and the probe disable_ioceth path call
    timer_delete_sync() for ioc_timer, sem_timer and hb_timer, but not for
    iocpf_timer.  bnad_iocpf_timeout() then takes bnad->bna_lock after
    free_netdev() has freed the struct bnad.
    
    Deleting iocpf_timer last does not fix this.  sem_timer and
    iocpf_timer rearm each other: bnad_iocpf_sem_timeout() can arm
    iocpf_timer, and bnad_iocpf_timeout() arms sem_timer from
    bfa_ioc_hw_sem_get() when the semaphore is busy.
    timer_delete_sync() only waits out its own callback.
    bnad_ioceth_disable() can time out and leave that callback live.
    
    Shut all four IOC timers down with timer_shutdown_sync() on both
    paths, so a later mod_timer() is ignored.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: 1d32f7696286 ("bna: IOC failure auto recovery fix")
    Cc: [email protected]
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    [ inlined bnad_ioc_timers_shutdown() into the existing teardown functions. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
bnxt_en: fix DMA mapping length for padded small packets [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Wed Oct 7 07:17:47 2026 +0200

    bnxt_en: fix DMA mapping length for padded small packets
    
    [ Upstream commit a51d233ccd4889aadb71dace863525cc2b00271e ]
    
    Stefan Fleischmann reported Intel IOMMU DMA Read faults on BCM57412
    NetXtreme-E NICs when transmitting packets on VLAN/macvlan interfaces:
    
      DMAR: [DMA Read NO_PASID] Request device [18:00.0] fault addr 0xfc499000
            [fault reason 0x06] PTE Read access is not set
      bnxt_en 0000:18:00.0 eno1np0: Abandoning msg {0xb4 0x41a} len: 0 due to firmware status: 0x2000001
      ...
      NETDEV WATCHDOG: eno1np0 (bnxt_en): transmit queue 0 timed out
    
    The fault address (0xfc499000) is on an exact 4KB page boundary,
    pointing to a DMA read buffer overrun.
    
    In bnxt_start_xmit(), packets smaller than BNXT_MIN_PKT_SIZE (52 bytes),
    such as 42-byte untagged ARP frames, are padded:
    
        if (length < BNXT_MIN_PKT_SIZE) {
            pad = BNXT_MIN_PKT_SIZE - length;
            if (skb_pad(skb, pad))
                goto tx_kick_pending;
            length = BNXT_MIN_PKT_SIZE;
        }
    
        mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE);
        ...
        dma_unmap_len_set(tx_buf, len, len);
    
    However, 'len' was initialized earlier to skb_headlen(skb) (e.g. 42 bytes)
    and is left unadjusted after padding. Consequently, dma_map_single() and
    dma_unmap_len_set() map and track only 42 bytes.
    
    Later, the hardware TX buffer descriptor is programmed with the padded length:
    
        txbd->tx_bd_len_flags_type =
            cpu_to_le32(((len + pad) << TX_BD_LEN_SHIFT) | flags |
                        TX_BD_FLAGS_PACKET_END);
    
    The NIC DMA engine is thus instructed to read 52 bytes from a region where
    only 42 bytes were DMA-mapped. If skb->data ends near the boundary of a 4KB
    page (within 'pad' bytes of the next page), the hardware DMA read overruns
    into the unmapped adjacent page, triggering an IOMMU fault.
    
    This issue was exposed after commit 447cbe95ebb9 ("vlan: fix skb_under_panic
    and races when toggling HW VLAN offload") because reserving extra VLAN
    headroom rounded LL_RESERVED_SPACE from 48 up to 64 bytes, shifting skb->data
    offsets and potentially causing small frames to land right against page
    boundaries.
    
    Fix this by using skb_put_padto(skb, BNXT_MIN_PKT_SIZE) in
    bnxt_start_xmit(), before skb_shinfo(skb)->nr_frags is sampled,
    because padding might linearize the skb.
    This ensures skb->len and skb_headlen(skb) reflect the padded size so
    that dma_map_single() maps the full buffer and the descriptor length is
    consistent. This also removes the temporary 'pad' variable and masking logic.
    
    The padding is done after the SW USO branch, otherwise
    bnxt_sw_udp_gso_xmit() would account the padding as UDP payload
    and send it in extra segments.
    
    Note that SW USO segments are still not padded: with IPv4, a segment
    carrying less than 10 bytes of UDP payload (small gso_size, or a short
    last segment) is sent as a frame shorter than BNXT_MIN_PKT_SIZE.
    This is a separate issue, left for a followup patch.
    
    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Cc: [email protected]
    Reported-by: Stefan Fleischmann <[email protected]>
    Closes: https://lore.kernel.org/netdev/20261004122616.56714cbd@nargothrond/
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Michael Chan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    
    [ sashal: Dropped the SW USO and fragment linearize context, which this tree does not have. ]
    
    Signed-off-by: Sasha Levin <[email protected]>

 
bpf: fix potential 32-bit overflow when accessing ARRAY map element [+ + +]
Author: Andrii Nakryiko <[email protected]>
Date:   Mon Oct 19 17:11:17 2026 +0200

    bpf: fix potential 32-bit overflow when accessing ARRAY map element
    
    [ Upstream commit 87ac0d600943994444e24382a87aa19acc4cd3d4 ]
    
    If BPF array map is bigger than 4GB, element pointer calculation can
    overflow because both index and elem_size are u32. Fix this everywhere
    by forcing 64-bit multiplication. Extract this formula into separate
    small helper and use it consistently in various places.
    
    Speculative-preventing formula utilizing index_mask trick is left as is,
    but explicit u64 casts are added in both places.
    
    Fixes: c85d69135a91 ("bpf: move memory size checks to bpf_map_charge_init()")
    Signed-off-by: Andrii Nakryiko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Alexei Starovoitov <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
bridge: mcast: Fix use-after-free during router port configuration [+ + +]
Author: Ido Schimmel <[email protected]>
Date:   Sat Oct 24 13:09:29 2026 +0200

    bridge: mcast: Fix use-after-free during router port configuration
    
    [ Upstream commit 7544f3f5b0b58c396f374d060898b5939da31709 ]
    
    The bridge maintains a global list of ports behind which a multicast
    router resides. The list is consulted during forwarding to ensure
    multicast packets are forwarded to these ports even if the ports are not
    member in the matching MDB entry.
    
    When per-VLAN multicast snooping is enabled, the per-port multicast
    context is disabled on each port and the port is removed from the global
    router port list:
    
     # ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1
     # ip link add name dummy1 up master br1 type dummy
     # ip link set dev dummy1 type bridge_slave mcast_router 2
     $ bridge -d mdb show | grep router
     router ports on br1: dummy1
     # ip link set dev br1 type bridge mcast_vlan_snooping 1
     $ bridge -d mdb show | grep router
    
    However, the port can be re-added to the global list even when per-VLAN
    multicast snooping is enabled:
    
     # ip link set dev dummy1 type bridge_slave mcast_router 0
     # ip link set dev dummy1 type bridge_slave mcast_router 2
     $ bridge -d mdb show | grep router
     router ports on br1: dummy1
    
    Since commit 4b30ae9adb04 ("net: bridge: mcast: re-implement
    br_multicast_{enable, disable}_port functions"), when per-VLAN multicast
    snooping is enabled, multicast disablement on a port will disable the
    per-{port, VLAN} multicast contexts and not the per-port one. As a
    result, a port will remain in the global router port list even after it
    is deleted. This will lead to a use-after-free [1] when the list is
    traversed (when adding a new port to the list, for example):
    
     # ip link del dev dummy1
     # ip link add name dummy2 up master br1 type dummy
     # ip link set dev dummy2 type bridge_slave mcast_router 2
    
    Similarly, stale entries can also be found in the per-VLAN router port
    list. When per-VLAN multicast snooping is disabled, the per-{port, VLAN}
    contexts are disabled on each port and the port is removed from the
    per-VLAN router port list:
    
     # ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1
     # ip link add name dummy1 up master br1 type dummy
     # bridge vlan add vid 2 dev dummy1
     # bridge vlan global set vid 2 dev br1 mcast_snooping 1
     # bridge vlan set vid 2 dev dummy1 mcast_router 2
     $ bridge vlan global show dev br1 vid 2 | grep router
           router ports: dummy1
     # ip link set dev br1 type bridge mcast_vlan_snooping 0
     $ bridge vlan global show dev br1 vid 2 | grep router
    
    However, the port can be re-added to the per-VLAN list even when
    per-VLAN multicast snooping is disabled:
    
     # bridge vlan set vid 2 dev dummy1 mcast_router 0
     # bridge vlan set vid 2 dev dummy1 mcast_router 2
     $ bridge vlan global show dev br1 vid 2 | grep router
           router ports: dummy1
    
    When the VLAN is deleted from the port, the per-{port, VLAN} multicast
    context will not be disabled since multicast snooping is not enabled
    on the VLAN. As a result, the port will remain in the per-VLAN router
    port list even after it is no longer member in the VLAN. This will lead
    to a use-after-free [2] when the list is traversed (when adding a new
    port to the list, for example):
    
     # ip link add name dummy2 up master br1 type dummy
     # bridge vlan add vid 2 dev dummy2
     # bridge vlan del vid 2 dev dummy1
     # bridge vlan set vid 2 dev dummy2 mcast_router 2
    
    Fix these issues by removing the port from the relevant (global or
    per-VLAN) router port list in br_multicast_port_ctx_deinit(). The
    function is invoked during port deletion with the per-port multicast
    context and during VLAN deletion with the per-{port, VLAN} multicast
    context.
    
    Note that deleting the multicast router timer is not enough as it only
    takes care of the temporary multicast router states (1 or 3) and not the
    permanent one (2).
    
    [1]
    BUG: KASAN: slab-out-of-bounds in br_multicast_add_router.part.0+0x3f1/0x560
    Write of size 8 at addr ffff888004a67328 by task ip/384
    [...]
    Call Trace:
     <TASK>
     dump_stack_lvl+0x6f/0xa0
     print_address_description.constprop.0+0x6f/0x350
     print_report+0x108/0x205
     kasan_report+0xdf/0x110
     br_multicast_add_router.part.0+0x3f1/0x560
     br_multicast_set_port_router+0x74e/0xac0
     br_setport+0xa55/0x1870
     br_port_slave_changelink+0x95/0x120
     __rtnl_newlink+0x5e8/0xa40
     rtnl_newlink+0x627/0xb00
     rtnetlink_rcv_msg+0x6fb/0xb70
     netlink_rcv_skb+0x11f/0x350
     netlink_unicast+0x426/0x710
     netlink_sendmsg+0x75a/0xc20
     __sock_sendmsg+0xc1/0x150
     ____sys_sendmsg+0x5aa/0x7b0
     ___sys_sendmsg+0xfc/0x180
     __sys_sendmsg+0x124/0x1c0
     do_syscall_64+0xbb/0x360
     entry_SYSCALL_64_after_hwframe+0x4b/0x53
    
    [2]
    BUG: KASAN: slab-use-after-free in br_multicast_add_router.part.0+0x378/0x560
    Read of size 8 at addr ffff888009f00840 by task bridge/391
    [...]
    Call Trace:
     <TASK>
     dump_stack_lvl+0x6f/0xa0
     print_address_description.constprop.0+0x6f/0x350
     print_report+0x108/0x205
     kasan_report+0xdf/0x110
     br_multicast_add_router.part.0+0x378/0x560
     br_multicast_set_port_router+0x6f9/0xac0
     br_vlan_process_options+0x8b6/0x1430
     br_vlan_rtm_process_one+0x605/0xa30
     br_vlan_rtm_process+0x396/0x4c0
     rtnetlink_rcv_msg+0x2f7/0xb70
     netlink_rcv_skb+0x11f/0x350
     netlink_unicast+0x426/0x710
     netlink_sendmsg+0x75a/0xc20
     __sock_sendmsg+0xc1/0x150
     ____sys_sendmsg+0x5aa/0x7b0
     ___sys_sendmsg+0xfc/0x180
     __sys_sendmsg+0x124/0x1c0
     do_syscall_64+0xbb/0x360
     entry_SYSCALL_64_after_hwframe+0x4b/0x53
    
    Fixes: 2796d846d74a ("net: bridge: vlan: convert mcast router global option to per-vlan entry")
    Fixes: 4b30ae9adb04 ("net: bridge: mcast: re-implement br_multicast_{enable, disable}_port functions")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/T/
    Signed-off-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Backport to 5.15.y: resolved a context conflict in
      br_multicast_port_ctx_deinit() where mainline uses the post-6.15
      timer_delete_sync() name; 5.15 still spells it del_timer_sync().
      The three rport-del helpers already exist in 5.15 (since 4b30ae9adb04),
      so the fix applies unchanged otherwise. ]
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
btrfs: scrub: fix local_root reference leak in scrub_print_warning_inode() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Wed Sep 16 17:16:10 2026 +0000

    btrfs: scrub: fix local_root reference leak in scrub_print_warning_inode()
    
    commit 1fd742c7479961da6d0bb794ef8ac6b7b9442847 upstream.
    
    When paths_from_inode() fails, scrub_print_warning_inode() jumps to err
    without dropping the reference taken by btrfs_get_fs_root(), leaking a
    reference to the root every time path resolution fails while printing
    scrub warnings.  Every other error and success path of the function
    drops the reference.
    
    Drop the reference on the paths_from_inode() failure path too.
    
    Fixes: 558540c17771 ("btrfs scrub: print paths of corrupted files")
    CC: [email protected]
    Reviewed-by: Qu Wenruo <[email protected]>
    Signed-off-by: Wentao Liang <[email protected]>
    Reviewed-by: David Sterba <[email protected]>
    Signed-off-by: David Sterba <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

btrfs: take commit root semaphore when iterating in mark_block_group_to_copy() [+ + +]
Author: Hongling Zeng <[email protected]>
Date:   Tue Sep 22 11:41:52 2026 -0400

    btrfs: take commit root semaphore when iterating in mark_block_group_to_copy()
    
    [ Upstream commit 0594e3423f4ba3137c734371169491f9a98e9af4 ]
    
    mark_block_group_to_copy() iterates over the commit root with
    skip_locking=true. A concurrent transaction commit can swap and free
    the commit root during iteration, causing use-after-free when
    accessing extent buffers.
    
    Fix it by using path->need_commit_sem to protect the commit root search.
    
    Fixes: 78ce9fc269af ("btrfs: zoned: mark block groups to copy for device-replace")
    CC: [email protected]
    Assisted-by: Codex:gpt-5.5
    Reviewed-by: Johannes Thumshirn <[email protected]>
    Signed-off-by: Hongling Zeng <[email protected]>
    Reviewed-by: David Sterba <[email protected]>
    Signed-off-by: David Sterba <[email protected]>
    [ changed path->need_commit_sem assignment from true to 1 to match the older unsigned bitfield representation. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
can: fix unique skb identifier regression under RPS [+ + +]
Author: Oliver Hartkopp <[email protected]>
Date:   Tue Oct 13 09:41:52 2026 +0200

    can: fix unique skb identifier regression under RPS
    
    commit 7093c3b8314a4ef7405c4066a2521398c455efe7 upstream.
    
    Commit d4fb6514ff8e ("can: use skb hash instead of private variable in
    headroom") moved the per-skb unique identifier used for raw_rcv()
    duplicate detection into skb->hash.
    
    With RPS enabled, get_rps_cpu() calls skb_get_hash() before the frame
    reaches the CAN subsystem. Since CAN skbs have no L3/L4 headers, the
    flow dissector assigns every CAN frame the same non-zero software
    hash. can_set_skb_uid() only generated a new identifier when
    skb->hash was 0, so it kept this constant hash. When the SLAB
    allocator later reused the same skb address, raw_rcv() mistook the
    next legitimate frame for a duplicate and dropped it.
    
    Fix this by storing the CAN UID in the CAN skb extension
    (struct can_skb_ext::can_skb_uid) instead of skb->hash, decoupling it
    from any hash the network stack may compute. can_set_skb_uid() keeps
    its "assign only if unset" behaviour, which preserves UIDs set before
    transmission (e.g. by isotp to identify echo frames) across the local
    loopback path.
    
    Frames whose extension is shared with another clone (e.g. via tc mirred
    or netem duplicate) are given a private extension copy before the UID
    is assigned, so that independently received skb clones from real CAN
    interfaces (skbcnt = 0) don't end up with the same UID.
    The limitation that tc mirred/netem skb duplicates might be dropped in
    raw_rcv for looped back isotp echo frame skbs is accepted. There is no
    valid use-case for tc mirred or netem together with isotp which is not
    capable to operate on different CAN interfaces simultaneously.
    For routing and modifying CAN frames together with isotp use can-gw.
    
    can-gw and vxcan additionally clear the UID of forwarded/duplicated
    frames so each newly routed frame gets its own unique identifier.
    
    [ backport to 5.15: no CAN skb extensions available, so the UID is kept
      in struct can_skb_priv::skbcnt in the headroom (effectively reverting
      d4fb6514ff8e) and isotp is adapted accordingly. As skb clones share
      the headroom, the private extension copy for tc mirred/netem
      duplicates is not applicable. The UID resets in can-gw and vxcan are
      omitted, as writing to the shared headroom of cloned skbs would also
      alter the UID of the original skb. This keeps the pre-d4fb6514ff8e
      behaviour for routed and vxcan forwarded frames. ]
    
    Fixes: d4fb6514ff8e ("can: use skb hash instead of private variable in headroom")
    Reported-by: Joerg Willmann <[email protected]>
    Closes: https://lore.kernel.org/linux-can/[email protected]/
    Signed-off-by: Oliver Hartkopp <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ceph: bound copied dentry name length in NFS export get_name [+ + +]
Author: Michael Bommarito <[email protected]>
Date:   Sun Sep 6 10:56:33 2026 -0400

    ceph: bound copied dentry name length in NFS export get_name
    
    [ Upstream commit eff8013c5a8916613c742ae5a2cc341cb605c0ae ]
    
    ceph_get_name() copies the MDS-supplied name into the caller's
    NAME_MAX-sized buffer with memcpy(name, rinfo->dname, rinfo->dname_len)
    and then writes name[rinfo->dname_len] = 0, without checking dname_len
    against NAME_MAX. A malicious or buggy MDS that returns a LOOKUPNAME reply
    with dname_len > NAME_MAX overflows the buffer. __get_snap_name() copies
    rde->name / rde->name_len the same unchecked way.
    
    Impact: a malicious or compromised Ceph MDS overflows the NAME_MAX name
    buffer in a client's NFS-export get_name path, a slab out-of-bounds write
    reported by KASAN. Reachable when a CephFS mount is re-exported over NFS.
    
    Add ceph_export_copy_name(), which rejects lengths above NAME_MAX with
    -ENAMETOOLONG before the copy, and use it in both ceph_get_name() and
    __get_snap_name().
    
    Cc: [email protected]
    Fixes: 19913b4eac4a ("ceph: add get_name() NFS export callback")
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Michael Bommarito <[email protected]>
    Reviewed-by: Viacheslav Dubeyko <[email protected]>
    Signed-off-by: Ilya Dryomov <[email protected]>
    [ adapted the bounds check to the older ceph_get_name() flow without encrypted-name handling. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
cgroup: fix spurious SIGKILL of CLONE_INTO_CGROUP children [+ + +]
Author: Etienne Perot <[email protected]>
Date:   Fri Aug 28 21:52:51 2026 +0000

    cgroup: fix spurious SIGKILL of CLONE_INTO_CGROUP children
    
    commit 8e359920216689b3b79e0fe8961a77fe312a511f upstream.
    
    Since commit b69bb476dee9 ("cgroup: fix race between fork and
    cgroup.kill"), the fork path snapshots the kill_seq of the child's
    future cgroup into kargs->kill_seq, and cgroup_post_fork() SIGKILLs
    the child if that cgroup's kill_seq has changed in the meantime, to
    catch forks racing with a cgroup.kill sweep.
    
    For CLONE_INTO_CGROUP, however, the snapshot in cgroup_css_set_fork()
    is taken before the target cgroup has been resolved: kargs->cgrp is
    always NULL at this point (it is only set at the end of the function).
    So the "if (kargs->cgrp)" branch is dead code and the snapshot always
    records the kill_seq of the parent's cgroup. cgroup_post_fork() then
    compares it with the kill_seq of the target cgroup, so the child gets
    SIGKILLed whenever the two cgroups have been killed a different number
    of times.
    
    As a result, once cgroup.kill has been written to a cgroup, every
    child subsequently cloned into it with clone3(CLONE_INTO_CGROUP) is
    killed on the spot, for as long as the cgroup exists: kill_seq is not
    exposed to userspace and never resets.
    
    Re-snapshot kill_seq from the target cgroup once it has been resolved,
    and drop the dead branch at the early snapshot site.
    
    This does not reopen the race fixed by b69bb476dee9. For
    CLONE_INTO_CGROUP, everything from the snapshot to the check in
    cgroup_post_fork() runs with cgroup_mutex held, and kill_seq is
    only ever incremented under cgroup_mutex.
    
    tj: Updated the comment above kill_seq to reflect the new serialization
    rules as suggested by Shakeel Butt.
    
    Fixes: b69bb476dee9 ("cgroup: fix race between fork and cgroup.kill")
    Cc: [email protected]
    Cc: Shakeel Butt <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Etienne Perot <[email protected]>
    Signed-off-by: Tejun Heo <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
cifs: add revalidation on FSCTL failure in smb2_duplicate_extents() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Thu Oct 22 15:19:39 2026 -0400

    cifs: add revalidation on FSCTL failure in smb2_duplicate_extents()
    
    [ Upstream commit 53676a5e28231186c9f56d87b7998b640699bc15 ]
    
    smb2_duplicate_extents() has no handling for
    FSCTL_DUPLICATE_EXTENTS_TO_FILE failure: when the FSCTL fails, local
    inode metadata may be stale from the pre-extension or from concurrent
    remote writes, but is never refreshed.
    
    Force revalidation on FSCTL failure and use i_size_read() for the
    pre-extension check.
    
    Fixes: cfc63fc8126a ("smb3: fix cached file size problems in duplicate extents (reflink)")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ sashal: replaced cifs_invalidate_cache() with fscache_invalidate() guarded by CONFIG_CIFS_FSCACHE. ]
    Signed-off-by: Sasha Levin <[email protected]>

cifs: fix loff_t underflow in cifs_remap_file_range() when len == 0 [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Sun Sep 6 15:30:43 2026 -0400

    cifs: fix loff_t underflow in cifs_remap_file_range() when len == 0
    
    [ Upstream commit 6c322f5cf7476ded7a9a20f7be72462065a03c68 ]
    
    With len == 0 (clone to EOF), the effective length is computed as:
    
        len = src_inode->i_size - off;
    
    If off > i_size, this is a negative loff_t, corrupting the ByteCount
    in the FSCTL_DUPLICATE_EXTENTS_TO_FILE request and inverting the range
    in filemap_write_and_wait_range().  The existing off >= i_size check
    fires only after the ioctl has already been sent.
    
    Snapshot i_size_read() once for both the bounds check and the length
    calculation, eliminating the TOCTOU and 32-bit torn-read risk.  Reject
    off > src_size with -EINVAL.  Treat off == src_size as a no-op,
    consistent with __generic_remap_file_range_prep().
    
    Fixes: 04b38d601239 ("vfs: pull btrfs clone API to vfs layer")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ added the missing unlock label at the existing common unlock path ]
    Signed-off-by: Sasha Levin <[email protected]>

cifs: fix underflow in parse_server_interfaces() [+ + +]
Author: Dan Carpenter <[email protected]>
Date:   Mon Oct 12 09:40:54 2026 -0700

    cifs: fix underflow in parse_server_interfaces()
    
    [ Upstream commit cffe487026be13eaf37ea28b783d9638ab147204 ]
    
    In this loop, we step through the buffer and after each item we check
    if the size_left is greater than the minimum size we need.  However,
    the problem is that "bytes_left" is type ssize_t while sizeof() is type
    size_t.  That means that because of type promotion, the comparison is
    done as an unsigned and if we have negative bytes left the loop
    continues instead of ending.
    
    Fixes: fe856be475f7 ("CIFS: parse and store info on iface queries")
    Signed-off-by: Dan Carpenter <[email protected]>
    Reviewed-by: Shyam Prasad N <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    (cherry picked from commit cffe487026be13eaf37ea28b783d9638ab147204)
    [Harshit: Apply the signed guard to both 5.15 parser passes]
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
clone: add CLONE_AUTOREAP [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Thu Feb 26 14:50:59 2026 +0100

    clone: add CLONE_AUTOREAP
    
    [ Upstream commit 12ae2c81b21cfaa193db2faf035d495807edc3a7 ]
    
    Add a new clone3() flag CLONE_AUTOREAP that makes a child process
    auto-reap on exit without ever becoming a zombie. This is a per-process
    property in contrast to the existing auto-reap mechanism via
    SA_NOCLDWAIT or SIG_IGN for SIGCHLD which applies to all children of a
    given parent.
    
    Currently the only way to automatically reap children is to set
    SA_NOCLDWAIT or SIG_IGN on SIGCHLD. This is a parent-scoped property
    affecting all children which makes it unsuitable for libraries or
    applications that need selective auto-reaping of specific children while
    still being able to wait() on others.
    
    CLONE_AUTOREAP stores an autoreap flag in the child's signal_struct.
    When the child exits do_notify_parent() checks this flag and causes
    exit_notify() to transition the task directly to EXIT_DEAD. Since the
    flag lives on the child it survives reparenting: if the original parent
    exits and the child is reparented to a subreaper or init the child still
    auto-reaps when it eventually exits.
    
    CLONE_AUTOREAP can be combined with CLONE_PIDFD to allow the parent to
    monitor the child's exit via poll() and retrieve exit status via
    PIDFD_GET_INFO. Without CLONE_PIDFD it provides a fire-and-forget
    pattern where the parent simply doesn't care about the child's exit
    status. No exit signal is delivered so exit_signal must be zero.
    
    CLONE_AUTOREAP is rejected in combination with CLONE_PARENT. If a
    CLONE_AUTOREAP child were to clone(CLONE_PARENT) the new grandchild
    would inherit exit_signal == 0 from the autoreap parent's group leader
    but without signal->autoreap. This grandchild would become a zombie that
    never sends a signal and is never autoreaped - confusing and arguably
    broken behavior.
    
    The flag is not inherited by the autoreap process's own children. Each
    child that should be autoreaped must be explicitly created with
    CLONE_AUTOREAP.
    
    Link: https://github.com/uapi-group/kernel-features/issues/45
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Oleg Nesterov <[email protected]>
    Signed-off-by: Christian Brauner <[email protected]>
    Stable-dep-of: 28d2905d77bc ("exit: fix lost-update race on the child_subreaper bitfields")
    Signed-off-by: Sasha Levin <[email protected]>

 
coresight: etm3x: Fix cntr_val_show() to match cntr_val_store() behavior [+ + +]
Author: Kuan-Wei Chiu <[email protected]>
Date:   Tue Sep 8 08:58:53 2026 -0400

    coresight: etm3x: Fix cntr_val_show() to match cntr_val_store() behavior
    
    [ Upstream commit 41fb4e925528aefa4b7a5f76c7f81db99c0d0f38 ]
    
    The cntr_val_show() function was intended to print the values of all
    counters using a loop. However, due to a buffer overwrite issue with
    sprintf(), it effectively only displayed the value of the last counter.
    
    The companion function, cntr_val_store(), allows users to modify a
    specific counter selected by 'cntr_idx'. To maintain consistency
    between read and write operations and to align with the ETM4x driver
    behavior, modify cntr_val_show() to report only the value of the
    currently selected counter.
    
    This change removes the loop and the "counter %d:" prefix, printing
    only the hexadecimal value. It also adopts sysfs_emit() for standard
    sysfs output formatting.
    
    Fixes: a939fc5a71ad ("coresight-etm: add CoreSight ETM/PTM driver")
    Cc: [email protected]
    Signed-off-by: Kuan-Wei Chiu <[email protected]>
    Reviewed-by: James Clark <[email protected]>
    Signed-off-by: Suzuki K Poulose <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
crypto: drbg - Fix ineffective sanity check [+ + +]
Author: Eric Biggers <[email protected]>
Date:   Sat Oct 10 10:17:20 2026 +0200

    crypto: drbg - Fix ineffective sanity check
    
    commit 040ad83b0e8aa065fd2fc641cacba8491a8b186d upstream.
    
    Fix drbg_healthcheck_sanity() to correctly check the return value of
    drbg_generate().  drbg_generate() returns 0 on success, or a negative
    errno value on failure.  drbg_healthcheck_sanity() incorrectly assumed
    that it returned a positive value on success.
    
    This didn't make the sanity check fail, but it made it ineffective.
    
    Fixes: cde001e4c3c3 ("crypto: rng - RNGs must return 0 in success case")
    Cc: [email protected]
    Signed-off-by: Eric Biggers <[email protected]>
    Signed-off-by: Herbert Xu <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
cxgb4/ch_ktls: disable softirqs around tid_list erases [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Wed Sep 30 02:37:34 2026 +0900

    cxgb4/ch_ktls: disable softirqs around tid_list erases
    
    [ Upstream commit 4c9dc0faca98084922caeb689579d338cf3e1c29 ]
    
    chcr_ktls_cpl_act_open_rpl() inserts into tid_list from the receive path
    using xa_insert_bh().  The array is shared by the adapter's connections
    and initialized with XA_FLAGS_LOCK_BH.  However, chcr_ktls_dev_del() and
    the chcr_ktls_dev_add() error path use xa_erase(), which takes the XArray
    lock without disabling softirqs.
    
    When cleanup runs with softirqs enabled, a receive softirq for another
    connection on the same CPU can interrupt the erase and spin on the lock
    held by the interrupted task.  Use xa_erase_bh() at both sites to match
    the insertion path.
    
    Fixes: 65e302a9bd57 ("cxgb4/ch_ktls: Clear resources when pf4 device is removed")
    Reported-by: Changyul Lee <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Reviewed-by: Ayush Sawal <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
dcache: don't put a mountpoint on a dentry that's being removed [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Sep 30 15:32:07 2026 +0200

    dcache: don't put a mountpoint on a dentry that's being removed
    
    commit 75f4197f1e11d2eb75c2d6f916a7d4764db621e5 upstream.
    
    rmdir(), unlink() and rename() call dont_mount() on the victim and then
    detach_mounts() with the victim's inode locked. do_lock_mount() takes
    the inode lock of the mountpoint and checks cant_mount() so a mount
    can't show up after detach_mounts().
    
    But attach_recursive_mnt() makes a second mountpoint for the root of the
    source mount so that the mounts already located at the destination can
    be put on top of it. No inode is locked for that one and d_set_mounted()
    only refuses a dentry that is unlinked. Between detach_mounts() and
    d_delete() the victim is still hashed:
    
      rmrace: b passed dont_mount() and detach_mounts(), sleeping
      T2: move_mount(S, /tmp/plcant/x, BENEATH) = 0 errno 0 ()
      T1: rmdir(/tmp/plcant/d/b) = 0 errno 0
          109 107 0:61 /d/b//deleted /tmp/plcant/x rw,relatime - tmpfs tmpfs rw
          108 109 0:63 / /tmp/plcant/x rw,relatime - tmpfs T rw
    
    A bind mount of the directory that's being removed is moved beneath an
    existing mount while the rmdir() is located between the two calls. The
    mount ends up on the removed directory and nothing will ever detach it.
    
    Check cant_mount() in d_set_mounted() as well. dont_mount() raises the
    flag under d_lock before detach_mounts() runs so either the mountpoint
    is set first and detach_mounts() finds the mount or the flag is seen and
    the mount is refused.
    
    Fixes: 1064f874abc0 ("mnt: Tuck mounts under others instead of creating shadow/side mounts.")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
device property: Add cleanup.h based fwnode_handle_put() scope based cleanup. [+ + +]
Author: Jonathan Cameron <[email protected]>
Date:   Fri Sep 4 20:05:08 2026 -0400

    device property: Add cleanup.h based fwnode_handle_put() scope based cleanup.
    
    [ Upstream commit 59ed5e2d505bf5f9b4af64d0021cd0c96aec1f7c ]
    
    Useful where the fwnode_handle was obtained from a call such as
    fwnode_find_reference() as it will safely do nothing if IS_ERR() is true
    and will automatically release the reference on the variable leaving
    scope.
    
    Reviewed-by: Andy Shevchenko <[email protected]>
    Acked-by: Greg Kroah-Hartman <[email protected]>
    Reviewed-by: Sakari Ailus <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Stable-dep-of: 190069255582 ("device property: fix infinite loop in fwnode_for_each_child_node()")
    Signed-off-by: Sasha Levin <[email protected]>

device property: fix infinite loop in fwnode_for_each_child_node() [+ + +]
Author: Xu Yang <[email protected]>
Date:   Fri Sep 4 20:05:09 2026 -0400

    device property: fix infinite loop in fwnode_for_each_child_node()
    
    [ Upstream commit 1900692555826753adab8799a1a8d50bb1ee200c ]
    
    When iterate over children of a fwnode that has a secondary fwnode,
    fwnode_get_next_child_node() can enter an infinite loop if the secondary
    fwnode has more than one child.
    
                           Parent        Child
          (Primary fwnode)   FWa:   {FWa1, FWa2, FWa3}
        (Secondary fwnode)   FWb:   {FWb1, FWb2}
    
    In this case:
    
     ┌─> fwnode_get_next_child_node(FWa, FWa1)
     │    - fwnode_call_ptr_op(FWa, get_next_child_node, FWa1) returns FWa2
     │
     │   ...
     │
     │   fwnode_get_next_child_node(FWa, FWa3)
     │    - fwnode_call_ptr_op(FWa, get_next_child_node, FWa3) returns NULL
     │    - fwnode_call_ptr_op(FWb, get_next_child_node, FWa3) returns FWb1
     │
     │   fwnode_get_next_child_node(FWa, FWb1)
     │    - fwnode_call_ptr_op(FWa, get_next_child_node, FWb1) returns FWa1
     └────┘
    
    This cause fwnode_for_each_child_node() to loop indefinitely, reapeatedly
    output {FWa1, FWa2, FWa3, FWb1, FWa1, ...}.
    
    The root cause is that when the current child (FWb1) belongs to the
    secondary fwnode, calling get_next_child_node() on the parimary fwnode
    incorrectly returns the first child (FWa1) again instead of NULL.
    
    Fix this by dynamically checking the parent fwnode of the current child
    before calling get_next_child_node(). This approach follows the pattern
    established in commit b5b41ab6b0c1 ("device property: Check
    fwnode->secondary in fwnode_graph_get_next_endpoint()").
    
    Fixes: 2692c614f8f0 ("device property: Allow secondary lookup in fwnode_get_next_child_node()")
    Cc: [email protected]
    Signed-off-by: Xu Yang <[email protected]>
    Tested-by: Andy Shevchenko <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Tested-by: Xu Yang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
dlm: validate length in dlm_search_rsb_tree [+ + +]
Author: Ezrak1e <[email protected]>
Date:   Mon Oct 12 09:40:50 2026 -0700

    dlm: validate length in dlm_search_rsb_tree
    
    [ Upstream commit 080e5563f878c64e697b89e7439d730d0daad882 ]
    
    The len parameter in dlm_dump_rsb_name() is not validated and comes
    from network messages. When it exceeds DLM_RESNAME_MAXLEN, it can
    cause out-of-bounds write in dlm_search_rsb_tree().
    
    Add length validation to prevent potential buffer overflow.
    
    Signed-off-by: Ezrak1e <[email protected]>
    Signed-off-by: Alexander Aring <[email protected]>
    Signed-off-by: David Teigland <[email protected]>
    [Contextual conflict due to dlm_search_rsb_tree() using the RB-tree
    implementation instead of rhashtable.]
    Signed-off-by: Srikanth C S <[email protected]>
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
dm cache: fix demotion stats in passthrough mode [+ + +]
Author: Ming-Hung Tsai <[email protected]>
Date:   Tue Aug 18 18:05:47 2026 +0800

    dm cache: fix demotion stats in passthrough mode
    
    commit 2ccb8878c149443c6acf628b438c9c942c20abb2 upstream.
    
    The demotion counter is incremented per incoming write bio before the
    invalidation begins, causing the demotion count to exceed the actual
    number of cached blocks when multiple bios target the same cached
    block. Additionally, the counter is incremented unconditionally
    regardless of invalidation failure.
    
    Reproduce steps:
    
    1. Create a cache device consisting of 512 cache entries
    
    modprobe brd rd_size=262144
    dmsetup create cmeta --table "0 8192 linear /dev/ram0 0"
    dmsetup create cdata --table "0 65536 linear /dev/ram0 8192"
    dmsetup create corig --table "0 65536 linear /dev/ram0 262144"
    dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct
    dmsetup create cache --table "0 65536 cache /dev/mapper/cmeta \
    /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0"
    
    2. Populate the cache, and record the number of cached blocks
    
    fio --name=populate --filename=/dev/mapper/cache --rw=randwrite --bs=4k \
    --direct=1 --ioengine=libaio --iodepth=32 --io_size=2048m
    nr_cached=$(dmsetup status cache | awk '{split($7, a, "/"); print a[1]}')
    
    3. Reload the cache into passthrough mode
    
    dmsetup suspend cache
    dmsetup reload cache --table "0 65536 cache /dev/mapper/cmeta \
    /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 passthrough smq 0"
    dmsetup resume cache
    
    4. Write to the passthrough cache with multiple jobs to trigger
       multiple bios hitting the same cached block.
    
    fio --filename=/dev/mapper/cache --name=test --rw=write --bs=4k \
    --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4
    
    5. Check if demoted matches cached block count. These numbers should
       match but may differ due to overcounting per bio.
    
    nr_demoted=$(dmsetup status cache | awk '{print $12}')
    echo "$nr_cached, $nr_demoted"
    
    Fix by moving the demotion counter increment into invalidate_complete(),
    gated on the success flag.
    
    Reported-by: Ben Marzinski <[email protected]>
    Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
    Cc: [email protected]
    Signed-off-by: Ming-Hung Tsai <[email protected]>
    Reviewed-by: Benjamin Marzinski <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

dm cache: fix issue with background work locking [+ + +]
Author: Benjamin Marzinski <[email protected]>
Date:   Tue Aug 25 15:22:26 2026 -0400

    dm cache: fix issue with background work locking
    
    commit bc9781c0247de107876f32929f1637db93a42b34 upstream.
    
    dm cache used a rw_semaphore for background_work_lock. Write locks on
    rw_semaphores have strict owner semantics, but there was no guarantee
    that the process that locked background_work_lock was the same process
    that unlocked it. This can be easily seen using a kernel compiled with
    CONFIG_DEBUG_RWSEMS. Given a dm cache device <cache>, run: 'dmsetup
    suspend <cache> && dmsetup resume <cache>'. This will trigger a kernel
    warning:
    
    DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) && !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE))
    
    triggered by cache_resume(). To fix this, switch from a rw_semaphore to
    a spinlock and a wait queue. dm cache already has a wait queue and
    associated counter, migration_wait and nr_allocated_migrations, that was
    getting woken up when background work was getting completed, but wasn't
    actually used by anything. This is replaced by the background_work queue
    and counter.
    
    Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
    Cc: [email protected]
    Signed-off-by: Benjamin Marzinski <[email protected]>
    Reviewed-by: Matthew Sakai <[email protected]>
    Reviewed-by: Ming-Hung Tsai <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm ioctl: don't let data_start run past the buffer [+ + +]
Author: Palla Raghunath <[email protected]>
Date:   Sat Sep 19 00:43:39 2026 +0100

    dm ioctl: don't let data_start run past the buffer
    
    commit 9b3fcf519d370df94a56f3b272d9eddffffa5be8 upstream.
    
    struct dm_ioctl has seven bytes of trailing padding, so the smallest
    buffer userspace is allowed to ask for, offsetof(struct dm_ioctl, data),
    is seven bytes shorter than sizeof(struct dm_ioctl).
    
    get_result_buffer() sets data_start to sizeof(struct dm_ioctl) without
    looking at how big the buffer actually is. Ask for the minimum and
    data_start ends up seven bytes past the end. Callers add it to
    data_size, and ctl_ioctl() copies that much back to userspace:
    
      BUG: KASAN: slab-out-of-bounds in _copy_to_user+0xad/0xd0
      Read of size 312 at addr ffff8880169e4c00 by task repro-dm/140
       ctl_ioctl+0x5e3/0xcb0
       dm_ctl_ioctl+0x25/0x40
      allocated 305-byte region [ffff8880169e4c00, ffff8880169e4d31)
    
    A DM_LIST_DEVICES with data_size set to 305 is enough to hit it, and the
    seven bytes that leak are whatever sat next to the allocation.
    
    Clamp data_start to the buffer size.
    
    Note that this is not a security bug because the out-of-bounds read can
    only be triggered by root.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=48d935cf48a4a76be346
    Fixes: 76c072b48e39 ("dm ioctl: move compat code")
    Cc: [email protected]
    Signed-off-by: Palla Raghunath <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm-crypt: fix a tiny race condition in crypt_dec_pending [+ + +]
Author: Ben Cressey <[email protected]>
Date:   Wed Aug 26 00:25:33 2026 +0000

    dm-crypt: fix a tiny race condition in crypt_dec_pending
    
    commit 148845aa1921d95ef5dc851c76e6a284f6657df6 upstream.
    
    crypt_dec_pending reads io->error before calling atomic_dec_and_test.
    Another context, for example crypt_endio called from an interrupt, may
    set io->error and drop its reference between the read and the
    decrement. crypt_dec_pending then drops the last reference and completes
    the bio with the stale status - so a read that failed and was never
    decrypted, or a write that failed, is reported as successful.
    
    The read was placed before the decrement by commit b35f8caa0890 ("dm
    crypt: wait for endio to complete before destruction"), because that
    commit freed dm_crypt_io before calling bio_endio. This is no longer the
    case, dm_crypt_io lives in the per-bio data now.
    
    Read io->error after atomic_dec_and_test instead. atomic_dec_and_test is
    fully ordered, so no additional barrier is needed.
    
    Fixes: b35f8caa0890 ("dm crypt: wait for endio to complete before destruction")
    Cc: [email protected]
    Reviewed-by: Jose Fernandez (Anthropic) <[email protected]>
    Signed-off-by: Ben Cressey <[email protected]>
    Assisted-by: Claude:unspecified
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

dm-crypt: reject the lmk IV mode with AEAD ciphers [+ + +]
Author: Ben Cressey <[email protected]>
Date:   Tue Sep 15 00:39:10 2026 +0000

    dm-crypt: reject the lmk IV mode with AEAD ciphers
    
    commit 3195e0daf590683992edb4eed32269e569e04924 upstream.
    
    A "capi:" table line that pairs an AEAD cipher with the lmk IV mode,
    for example "capi:gcm(aes)-lmk" with the integrity:28:aead option,
    causes an oops when it is loaded. lmk sets tfms_count to 64, but
    crypt_alloc_tfms_aead only allocates one transform, so crypt_setkey
    reads past the end of the tfms_aead array and calls crypto_aead_setkey
    on the values it finds there.
    
    lmk exists for compatibility with Loop-AES, which uses CBC, so refuse
    it with an AEAD cipher rather than allocate 64 AEAD transforms. The
    check cannot go in crypt_iv_lmk_ctr with the other lmk checks, because
    the IV constructor runs after crypt_set_key.
    
    Note that this is not a security bug because the memory corruption can
    only be triggered by root.
    
    Fixes: 33d2f09fcb35 ("dm crypt: introduce new format of cipher with "capi:" prefix")
    Cc: [email protected]
    Signed-off-by: Ben Cressey <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm-ebs: fix incorrect device offset check in ebs_ctr() [+ + +]
Author: Genjian Zhang <[email protected]>
Date:   Fri Aug 7 23:57:15 2026 +0800

    dm-ebs: fix incorrect device offset check in ebs_ctr()
    
    commit 7ac81e2d2240f2c57bd073b0733e0b2abca38e82 upstream.
    
    <offset> is a backing-device sector offset; ti->len is the virtual
    target length. Comparing them rejects valid tables, e.g.:
    
      dmsetup create ebs0 --table "0 1048576 ebs /dev/sda 2097152 1 8"
      -> ebs: Invalid device offset sector (-EINVAL)
    
    Drop the check. Bounds against the backing device are already
    enforced later by device_area_is_invalid() via ebs_iterate_devices().
    
    Cc: [email protected]
    Fixes: d3c7b35c20d6 ("dm: add emulated block size target")
    Signed-off-by: Genjian Zhang <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm-integrity: fix infinite loop on discard with large tag size [+ + +]
Author: Ben Cressey <[email protected]>
Date:   Thu Oct 22 12:27:52 2026 -0400

    dm-integrity: fix infinite loop on discard with large tag size
    
    [ Upstream commit 18d80c77b4c7dd20699e81cedfbbff4e9d198f28 ]
    
    When integrity_metadata handles a discard, it fills a buffer with
    DISCARD_FILLER and writes it over the tags, max_blocks blocks at a
    time. If the kmalloc fails, the buffer is the on-stack array
    checksums_onstack and max_size is set to HASH_MAX_DIGESTSIZE. So if the
    tag size is larger than HASH_MAX_DIGESTSIZE, max_blocks is zero, bi_size
    is never decremented and the loop never terminates.
    
    Fix this by using sizeof(checksums_onstack) as max_size. The array has
    MAX_TAG_SIZE bytes since commit b93b6643e9b5 ("dm integrity: fix a
    crash with unusually large tag size"), so max_blocks is at least 1.
    
    Fixes: 84597a44a9d8 ("dm integrity: add optional discard support")
    Cc: [email protected]
    Reviewed-by: Jose Fernandez (Anthropic) <[email protected]>
    Signed-off-by: Ben Cressey <[email protected]>
    Assisted-by: Claude:unspecified
    Signed-off-by: Mikulas Patocka <[email protected]>
    [ sashal: Adjusted context for filler-only discard handling that calculates max_blocks without subtracting extra_space. ]
    Signed-off-by: Sasha Levin <[email protected]>

dm-integrity: require stable writes for internal hash modes [+ + +]
Author: Chen Cheng <[email protected]>
Date:   Thu Oct 22 15:10:38 2026 -0400

    dm-integrity: require stable writes for internal hash modes
    
    [ Upstream commit b2fd92f016e9d692fd3c8c08d0ee014e9212279d ]
    
    dm-integrity direct, bitmap and inline internal-hash modes compute
    integrity tags from the pages carried by the write bio.  The lower data
    write also uses those pages, so the tag and the data write depend on the
    same memory contents staying unchanged while writeback is in flight.
    
    Without stable writes, a buffered writer can modify a writeback folio
    after dm-integrity has submitted the data bio and before the lower device
    has consumed the data.  After a crash, this can leave data from the later
    contents with a tag calculated from the earlier contents, causing
    permanent checksum failures on read.
    
    Set BLK_FEAT_STABLE_WRITES for internal-hash D, B and I modes so
    filesystems wait for writeback folios to become stable before modifying
    them again.  Journal mode is left unchanged because it copies data into
    the journal before computing and persisting the tag.
    
    Tested using dm-delay over a virtio-blk test disk, dm-integrity
    internal_hash:crc32c and no-journal ext4.  The D and B reproducers both
    failed with checksum errors before this change and completed with
    READ_RC=0 and zero mismatches after it.
    
    Fixes: 7eada909bfd7 ("dm: add integrity target")
    Cc: [email protected]
    Reported-by: Sun Yangkai <[email protected]>
    Link: https://github.com/chencheng-fnnas/reproducer/blob/main/dm-integrity-writeback-race.py
    Signed-off-by: Chen Cheng <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    [ sashal: Adapted BLK_FEAT_STABLE_WRITES to QUEUE_FLAG_STABLE_WRITES through a new target flag. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
dm-snap: reject the transient exception store for snapshot-merge [+ + +]
Author: Ma Xinmeng <[email protected]>
Date:   Fri Sep 25 11:05:39 2026 +0800

    dm-snap: reject the transient exception store for snapshot-merge
    
    commit fcbde6227fcc53c73f08c56b2539e462d545cac6 upstream.
    
    snapshot_merge_next_chunks() calls s->store->type->prepare_merge() without
    checking it. The transient store ("N") implements neither prepare_merge nor
    commit_merge, and snapshot_ctr() validates those callbacks only on the handover
    path (__validate_exception_handover()), so a directly constructed snapshot-merge
    calls a NULL prepare_merge on resume:
    
      snapshot_merge_resume -> snapshot_merge_next_chunks -> prepare_merge(...)
    
    commit_merge() is NULL for the same reason. Userspace only issues documented
    device-mapper ioctls (CAP_SYS_ADMIN); this is a misconfiguration the kernel must
    reject rather than oops on.
    
    Reject the combination in snapshot_ctr() at table-load time (-EINVAL), the same
    check the handover path already performs; this also covers the commit_merge()
    call site, which a guard local to the prepare_merge call would miss.
    
    Tested on Linux v6.6.157 KASAN: unpatched, the dmsetup reproducer oopses in
    snapshot_merge_next_chunks(); with this patch, the table load fails with -EINVAL
    and no oops. Also present on v6.6.145; still present on the linux-dm tree
    (555f3d7be91a) and on torvalds/linux master (62f4c998b297) as of 2026-09-22.
    
    Note that this is not a security bug because only root can trigger it.
    
    Signed-off-by: Ma Xinmeng <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm: fix reading free memory in do_resume [+ + +]
Author: Mikulas Patocka <[email protected]>
Date:   Tue Oct 13 10:47:28 2026 -0400

    dm: fix reading free memory in do_resume
    
    [ Upstream commit c9417c1c5269e2bd0570fbe53e4ec03a8d31f008 ]
    
    When do_resume calls dm_table_get_mode(new_map), the call is done without
    holding any locks (it only holds a reference to the md). It may be
    possible that another concurrent ioctl on the same device will swap table
    after dm_swap_table and before dm_table_get_mode. In this case,
    dm_table_get_mode(new_map) reads freed memory.
    
    This race condition was triggered by syzbot.
    
    This commit fixes the race by reading mode of the new table before
    dm_swap_table. Note that new_map is also passed to dm_ima_need_measure,
    but this function doesn't attempt to dereference it, so this call should
    be safe.
    
    Note that this is not a security bug because only root can trigger it and
    the commonly used tools such as lvm or cryptsetup do not call the ioctls
    concurrently, so that they can't trigger it acceidentally.
    
    Signed-off-by: Mikulas Patocka <[email protected]>
    Reported-by: [email protected]
    Cc: [email protected]
    [ sashal: Replaced blk_mode_t and BLK_OPEN_WRITE with fmode_t and FMODE_WRITE. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
dmaengine: Add devm_dma_request_chan() [+ + +]
Author: Bence Csókás <[email protected]>
Date:   Wed Sep 9 06:57:20 2026 -0400

    dmaengine: Add devm_dma_request_chan()
    
    [ Upstream commit 08bf1663c21a3e815eda28fa242d84c945ca3b94 ]
    
    Expand the arsenal of devm functions for DMA devices, this time for
    requesting channels.
    
    Signed-off-by: Bence Csókás <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Vinod Koul <[email protected]>
    Stable-dep-of: 777979e62711 ("i2c: mxs: fix DMA channel leak on probe error")
    Signed-off-by: Sasha Levin <[email protected]>

 
Drivers: hv: Don't reset VMBus connection state on error/exit paths [+ + +]
Author: Michael Kelley <[email protected]>
Date:   Mon Aug 31 20:45:14 2026 -0700

    Drivers: hv: Don't reset VMBus connection state on error/exit paths
    
    [ Upstream commit ec31dc39e835ccde0930daccece8c492d28282fc ]
    
    In two places, current code forces vmbus_connection.conn_state to
    DISCONNECTED prior to calling vmbus_disconnect(). But vmbus_disconnect()
    calls vmbus_initiate_unload(), which unloads the VMBus connection
    only if the conn_state is CONNECTED. Consequently, the connection
    remains and the Hyper-V host might continue to send messages or post
    VMBus interrupts.
    
    The problem was introduced in commit 74347a99e73ae ("x86/Hyper-V:
    Unload vmbus channel in hv panic callback"), in that
    vmbus_initiate_unload() started checking the current connection
    state before doing the unload. This commit removed some occurrences
    where conn_state was forced to DISCONNECTED, but these two remained,
    apparently due to an oversight at the time.
    
    Fix this by not forcing conn_state to DISCONNECTED during VMBus exit,
    or if a failure occurs when establishing the connection in the first
    place. Whatever value conn_state has at the time is then read by
    vmbus_initiate_unload() to determine if there is a connection to
    be unloaded.
    
    Reported-by: Sashiko <[email protected]>
    Closes: https://lore.kernel.org/linux-hyperv/[email protected]/
    Fixes: 74347a99e73ae ("x86/Hyper-V: Unload vmbus channel in hv panic callback")
    Signed-off-by: Michael Kelley <[email protected]>
    Signed-off-by: Wei Liu <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amd/display: check dc_state_create_copy() for NULL in dm_suspend [+ + +]
Author: Jiangshan Yi <[email protected]>
Date:   Mon Oct 5 09:39:01 2026 -0400

    drm/amd/display: check dc_state_create_copy() for NULL in dm_suspend
    
    [ Upstream commit 015e72cde567d2450e282c2790773463156b2d0a ]
    
    dc_state_create_copy() can return NULL on allocation failure.
    dm_suspend() only conditionally skips dm_gpureset_toggle_interrupts()
    and continues execution, returning success.  dm_resume() then
    dereferences the NULL cached_dc_state in link_enc_cfg_copy() and the
    following dc_state->stream_count loop, crashing during GPU reset
    recovery.
    
    Return -ENOMEM immediately if the copy fails, so the caller aborts
    suspend instead of leaving a NULL cached state for resume.
    
    Fixes: 8092aa3ab8f7 ("drm/amd/display: Add null checker before passing variables")
    Reviewed-by: George Zhang <[email protected]>
    Signed-off-by: Jiangshan Yi <[email protected]>
    Tested-by: Dan Wheeler <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 84b6d7932fdd2857795a257f9f258562a3cddcab)
    Cc: [email protected]
    [ sashal: Adapted dc_state_create_copy() usage to dc_copy_state(). ]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amd/display: Don't replace a sink mode that shares the native totals [+ + +]
Author: Adrian Betschart <[email protected]>
Date:   Mon Oct 12 18:05:27 2026 +0200

    drm/amd/display: Don't replace a sink mode that shares the native totals
    
    commit 54c998c55fc9cbc391b350d67b86e0c2a0748f1a upstream.
    
    decide_crtc_timing_for_drm_display_mode() copies the native mode's CRTC
    timing into the requested mode when clock, htotal and vtotal match.
    That is meant for the modes amdgpu inserts itself:
    amdgpu_dm_create_common_mode() duplicates the native mode and changes
    only hdisplay and vdisplay, so those are sent with the native timing
    and scaled.
    
    A sink can also offer a real mode with the same clock and totals as
    its native mode. CTA-861 VIC 102 (4096x2160@60) and VIC 97
    (3840x2160@60) both use 594 MHz and 4400x2250. With 3840x2160@60 as
    the preferred mode, a 4096x2160@60 request goes out with the 3840x2160
    timing and the framebuffer scaled into it (dst 3840x2025 at y=67),
    while the AVI InfoFrame still carries VIC 102. A JVC projector then
    reports 3840x2160 and shows a corrupted right edge. 4096x2160@24,
    whose totals differ, is sent and displayed correctly.
    
    Inserted modes keep the native sync positions; a real mode with its
    own active width does not. Compare those too, so only inserted modes
    are patched.
    
    Fixes: 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)")
    Signed-off-by: Adrian Betschart <[email protected]>
    Assisted-by: Claude-Code:claude-opus-5-5
    Tested-by: Dan Wheeler <[email protected]>
    Reviewed-by: Roman Li <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 22f9a2da101c37f821cd00954f81dc598754f4d5)
    Cc: [email protected]
    (cherry picked from commit 54c998c55fc9cbc391b350d67b86e0c2a0748f1a)
    [ Adrian: this tree keeps the function in amdgpu_dm.c, with the equal-totals
      case as its own else-if; added the sync checks there. Dropped the KUnit
      test, its file does not exist here. ]
    Signed-off-by: Adrian Betschart <[email protected]>
    Assisted-by: Claude-Code:claude-opus-5-5
    Signed-off-by: Sasha Levin <[email protected]>

drm/amd/display: Mark DCE 6.4 as not APU [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 5 09:48:31 2026 -0400

    drm/amd/display: Mark DCE 6.4 as not APU
    
    [ Upstream commit 3a52d587d1fc8e8bf94ba1b07374f7ec91aaffb4 ]
    
    DCE 6.4 is found in Oland chips, which were advertised
    as low-end gaming GPUs in 2013~2015 and then have been
    sold as low-end workstation GPUs until 2017~2019.
    
    These are not APUs.
    
    Fixes: 7c15fd86aaec ("drm/amd/display: dc/dce: add initial DCE6 support (v10)")
    Signed-off-by: Timur Kristóf <[email protected]>
    Reviewed-by: Mario Limonciello <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mario Limonciello <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 1072aa811ea1e61d5f763e4ec1bc6d24bb61f14a)
    Cc: [email protected]
    [ sashal: adjusted context in dce64_construct() for missing debug and configuration default assignments ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amd/pm/si: Check AMD_IS_MOBILITY flag for PPSMC_SYSTEMFLAG_GPIO_DC [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 5 06:42:59 2026 -0400

    drm/amd/pm/si: Check AMD_IS_MOBILITY flag for PPSMC_SYSTEMFLAG_GPIO_DC
    
    [ Upstream commit cd883d0a3937df82a5ea03709ba8ba623b868419 ]
    
    Unfortunately, some desktop boards eg. the FirePro D500
    have the HARDWAREDC platform flag set and also have
    a battery power state configured in their VBIOS.
    This makes no sense for a desktop GPU and results in
    incorrect behaviour: the clocks are stuck at lowest.
    
    We observed that the kernel driver can work around
    the issue in two possible ways:
    1. Set PPSMC_SWSTATE_FLAG_DC on all power states
    2. Clear PPSMC_SYSTEMFLAG_GPIO_DC
    
    We think that the PPSMC_SYSTEMFLAG_GPIO_DC flag
    makes the SMC assume it's running on battery even
    though this is a desktop machine with no battery,
    and that's why it doesn't do DPM on power states
    without PPSMC_SYSTEMFLAG_GPIO_DC.
    
    Issue was uncovered by "Fix updating clock limits from
    power states" because previously the limits for the
    battery state were not tracked separately. However,
    battery power state has lower frequencies and voltages,
    so the kernel doesn't set the DC flag on the current
    power state anymore. That causes the SMC to be stuck
    on the lowest clocks.
    
    Let's clear PPSMC_SYSTEMFLAG_GPIO_DC on desktop GPUs.
    We can use the AMD_IS_MOBILITY flag to determine that.
    
    Fixes: e6c5d36756e7 ("drm/amd/pm/si: Fix updating clock limits from power states")
    Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/16352
    Signed-off-by: Timur Kristóf <[email protected]>
    Reviewed-by: Mario Limonciello <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mario Limonciello <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 58473c7c49ce9f5f5a4a1c24ffb9aa1d3c8771f4)
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amd/pm/si: Fix updating clock limits on AC/DC [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 5 09:13:50 2026 -0400

    drm/amd/pm/si: Fix updating clock limits on AC/DC
    
    [ Upstream commit 08c9100f65299c64439e22e6057d750ae0e6c660 ]
    
    Assume that the AC limits are the maximum of all power states,
    and the DC limits are the maximum of battery power states.
    This shouldn't make any difference in practice, but is
    cleaner and more robust against bogus information in the VBIOS.
    
    Fixes: e6c5d36756e7 ("drm/amd/pm/si: Fix updating clock limits from power states")
    Signed-off-by: Timur Kristóf <[email protected]>
    Reviewed-by: Mario Limonciello <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mario Limonciello <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit ef8cb9dcc7db7b7abcbdbe870a080cc81e4f0bf3)
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amd/powerplay: fix VoltageObjectInfo zero-stride loop and OOB read [+ + +]
Author: Asad Kamal <[email protected]>
Date:   Tue Jun 23 00:25:04 2026 +0800

    drm/amd/powerplay: fix VoltageObjectInfo zero-stride loop and OOB read
    
    [ Upstream commit 5d3cc8e388464f485d0944b87b8f9426e637d082 ]
    
    Reject voltage objects whose usSize is smaller than the header or would
    advance the cursor past the table end, preventing an infinite loop or
    heap OOB read when the VBIOS supplies a malformed VoltageObjectInfo table.
    
    Fixes: c82baa281843 ("drm/amd/powerplay: add Tonga dpm support (v3)")
    Fixes: 0d2c7569e196 ("drm/amdgpu: add new atomfirmware based helpers for powerplay")
    Signed-off-by: Asad Kamal <[email protected]>
    Reviewed-by: Lijo Lazar <[email protected]>
    Reviewed-by: Yang Wang <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amdgpu/gfx6: fix firmware leak on teardown [+ + +]
Author: Willian Oliveira <[email protected]>
Date:   Mon Oct 5 09:55:36 2026 -0400

    drm/amdgpu/gfx6: fix firmware leak on teardown
    
    [ Upstream commit cc172e177795c5f87bc2d71768d077e1c10633e8 ]
    
    The firmware requested in gfx_v6_0_init_microcode() is not released
    when the GFX block is torn down, leaking the firmware resources.
    
    Add gfx_v6_0_free_microcode() and call it from gfx_v6_0_sw_fini()
    to release the PFP, ME, CE and RLC firmware.
    
    Signed-off-by: Willian Oliveira <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 386e81346f95ab0be5a82c5535de932e7a456924)
    Cc: [email protected]
    [ sashal: Replaced unavailable amdgpu_ucode_release() calls with inline release_firmware() and pointer clearing in gfx_v6_0_sw_fini(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amdgpu/sdma3: Work around POLL_REGMEM / FENCE hang [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Wed Oct 7 00:02:52 2026 +0200

    drm/amdgpu/sdma3: Work around POLL_REGMEM / FENCE hang
    
    commit 752480ad62964edf0254e151110d3e53a7cb37de upstream.
    
    SDMA can randomly hang on Polaris 10. Hard to reproduce,
    but has been occurring sporadically in the Mesa CI
    on the RADV Polaris 10 job even when Mesa isn't using
    the SDMA engine.
    
    When Mesa actually uses the SDMA on Polaris, the hang
    becomes more frequent and the reproduction rate goes up
    significantly in the CI system.
    
    We don't know why the hangs occur, but it seems
    that inserting a single NOP packet before each
    POLL_REGMEM and FENCE packet works around it.
    At the moment it's unclear which GPUs are affected,
    so let's apply this to SDMA 3.x for now.
    
    Note that this issue is not documented or acknowledged by AMD.
    
    Reviewed-by: Alex Deucher <[email protected]>
    Signed-off-by: Timur Kristóf <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit c343a27ed90823d08de125f7c447d96d056b75d9)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/amdgpu: copy debugfs register data outside the GRBM/SRBM locks [+ + +]
Author: Mikhail Gavrilov <[email protected]>
Date:   Tue Oct 13 13:09:32 2026 -0400

    drm/amdgpu: copy debugfs register data outside the GRBM/SRBM locks
    
    [ Upstream commit 16c64495859f13f75602f439588883f2a4a4d6a6 ]
    
    Reading or writing a register through the amdgpu_regs2 debugfs file
    with GRBM bank selection, which umr does for every banked access (a
    single "umr -b x x x -r <reg>" is enough, as is the wave dump with
    "-O halt_waves"), makes lockdep report a circular locking dependency,
    after which lockdep stays off until reboot:
    
      WARNING: possible circular locking dependency detected
      umr/63306 is trying to acquire lock:
      ffff8882cf4b8350 (&mm->mmap_lock){++++}-{4:4}, at: __might_fault+0x9b/0x140
      but task is already holding lock:
      ffff8881aec010d0 (&amdgpu_grbm_lock_key){+.+.}-{4:4}, at: amdgpu_debugfs_regs2_op.isra.0+0x20d/0xd00 [amdgpu]
      ...
      Chain exists of:
        &mm->mmap_lock --> &amdgpu_srbm_lock_key --> &amdgpu_grbm_lock_key
      ...
       __might_fault+0xc5/0x140
       amdgpu_debugfs_regs2_op.isra.0+0x441/0xd00 [amdgpu]
       full_proxy_write+0x10e/0x1d0
       vfs_write+0x1d0/0xf50
       ksys_write+0x116/0x250
    
    amdgpu_debugfs_regs2_op() and amdgpu_debugfs_process_reg_op() call
    get_user()/put_user() for every dword while holding grbm_idx_mutex or
    srbm_mutex, and pm.mutex if requested, so a fault there takes mmap_lock
    inside those locks. The lock hierarchy in amdgpu_lockdep.c puts
    srbm_mutex and grbm_idx_mutex below notifier_lock, which
    amdgpu_cs_submit() takes with the BO reservations held, and
    dma_resv_lockdep() orders the reservations inside mmap_lock. So
    mmap_lock is outside grbm_idx_mutex and srbm_mutex, and these two
    debugfs paths nest it the other way round. The copies under the locks
    are as old as the bank selection in both files; commit 1d0f5838b126
    ("drm/amdgpu: Add lockdep annotations for lock ordering validation")
    only made them visible to lockdep.
    
    Copy the user buffer in before any of the locks is taken and the result
    out after all of them are dropped, as amdgpu_debugfs_wave_read(),
    amdgpu_debugfs_gpr_read() and amdgpu_debugfs_gprwave_read() already do.
    The buffer is sized by the count passed to read() or write(), so an
    access larger than PAGE_SIZE is now rejected with -EINVAL; umr reads and
    writes one register at a time. A fault on the user buffer of a write now
    fails with -EFAULT before any register is written, instead of after a
    partial write.
    
    Fixes: 566281595037 ("drm/amd/amdgpu: Add bank selection for MMIO debugfs (v3)")
    Fixes: 37df9560cd3e ("drm/amd/amdgpu: New debugfs interface for MMIO registers (v5)")
    Acked-by: Christian König <[email protected]>
    Acked-by: Tom St Denis <[email protected]>
    Reviewed-by: Vitaly Prosyak <[email protected]>
    Signed-off-by: Mikhail Gavrilov <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit ccf9e35ed6811f2c25ba6368e7dc6481da17159d)
    Cc: [email protected]
    [ sashal: omitted changes to the absent amdgpu_debugfs_regs2_op() function. ]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr [+ + +]
Author: Jesse Zhang <[email protected]>
Date:   Fri Oct 9 13:21:33 2026 +0800

    drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr
    
    commit de9f6bcdb44f0e410031002e2f103826ea6b6259 upstream.
    
    amdgpu_debugfs_gpr_read() drops its runtime PM reference right after
    reading the wave registers. When copying them to userspace fails, it
    jumps to the err label, which drops the reference a second time. A read
    into a bad buffer on Navi31 either steals a reference somebody else
    holds (power/runtime_usage goes from 1 to 0) or underflows the count:
    
      amdgpu 0000:03:00.0: Runtime PM usage count underflow!
    
    The registers are already in the kernel buffer at that point, so finish
    the hardware access first and copy the buffer with a single
    copy_to_user() instead of the put_user() loop with its own error path.
    
    Fixes: 9eee152aab56 ("drm/amdgpu/debugfs: fix ref count leak when pm_runtime_get_sync fails")
    Reviewed-by: Alex Deucher <[email protected]>
    Signed-off-by: Jesse Zhang <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 31035bbd74f7c3e10c163db875b8e67f8b50ee6a)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

drm/amdgpu: fix ACP MFD device leak on init failure [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Mon Oct 5 09:48:20 2026 -0400

    drm/amdgpu: fix ACP MFD device leak on init failure
    
    [ Upstream commit f0013046151b7467e62c471c1c83d63ea255799c ]
    
    acp_hw_init() registers ACP child devices with mfd_add_devices() before
    attaching them to the ACP power domain and initializing the hardware.
    
    If attaching a child to the power domain fails, or if the ACP reset or
    clock enable operation times out, the failure path frees only the
    source cell, resource, and platform-data allocations. The child
    platform devices already registered by mfd_add_devices() remain
    registered and are never released.
    
    Remove the children from the power domain and unregister the MFD
    devices on failures that occur after mfd_add_devices() succeeds. Keep
    mfd_add_devices() failures on the existing cleanup path since the MFD
    core already rolls back partially registered children itself.
    
    The issue was identified by a static analysis tool I developed and
    confirmed by manual review.
    
    Fixes: 25030321ba28 ("drm/amd: add pm domain for ACP IP sub blocks")
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 63da68d6a2279ec945581c990c5a59a5ae8b5560)
    Cc: [email protected]
    [ sashal: Adjusted context for the single initialization path without Jadeite-specific code. ]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: fix for coding style issues [+ + +]
Author: Vijendar Mukunda <[email protected]>
Date:   Mon Oct 5 09:48:19 2026 -0400

    drm/amdgpu: fix for coding style issues
    
    [ Upstream commit 604d3a3f0dca0ef0ab0322f5e7af8c70c5ddb6d4 ]
    
    Fixed below checkpatch warnings and errors
    
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:131: CHECK: Comparison to NULL could be written "apd"
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:150: CHECK: Comparison to NULL could be written "apd"
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:196: CHECK: Prefer kernel type 'u64' over 'uint64_t'
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:224: CHECK: Please don't use multiple blank lines
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:226: CHECK: Comparison to NULL could be written "!adev->acp.acp_genpd"
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:233: CHECK: Please don't use multiple blank lines
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:239: CHECK: Alignment should match open parenthesis
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:241: CHECK: Comparison to NULL could be written "!adev->acp.acp_cell"
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:247: CHECK: Comparison to NULL could be written "!adev->acp.acp_res"
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:253: CHECK: Comparison to NULL could be written "!i2s_pdata"
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:350: CHECK: Alignment should match open parenthesis
    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:550: ERROR: that open brace { should be on the previous line
    
    Signed-off-by: Vijendar Mukunda <[email protected]>
    Reviewed-by: Christian König <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Stable-dep-of: f0013046151b ("drm/amdgpu: fix ACP MFD device leak on init failure")
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: Fix runtime PM leak in amdgpu_debugfs_test_ib_show() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Tue Sep 29 12:35:23 2026 -0400

    drm/amdgpu: Fix runtime PM leak in amdgpu_debugfs_test_ib_show()
    
    [ Upstream commit 2b86ab1bd6673c525adda88819d7658ba9e784ec ]
    
    amdgpu_debugfs_test_ib_show() resumes the device with
    pm_runtime_get_sync() before taking the reset domain semaphore with
    down_write_killable().  If the write lock acquisition is interrupted,
    the function returns without calling pm_runtime_put_autosuspend(),
    leaking the runtime PM reference acquired for the device and keeping
    the GPU awake.
    
    Drop the runtime PM reference on the interrupted down_write_killable()
    error path before returning.
    
    Fixes: 6049db43d6dd ("drm/amdgpu: change reset lock from mutex to rw_semaphore")
    Signed-off-by: Wentao Liang <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit ec30a576c2d4c0364549e6c04218f50704ef56c8)
    Cc: [email protected]
    [ Adapted `down_write_killable(&adev->reset_domain->sem)` to `down_read_killable(&adev->reset_sem)`. ]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: Fix VCE 3 ring align_mask [+ + +]
Author: David Rosca <[email protected]>
Date:   Thu Aug 20 16:32:51 2026 +0200

    drm/amdgpu: Fix VCE 3 ring align_mask
    
    [ Upstream commit 2ee9836545e690c9e66ec203445d7705959fd7a8 ]
    
    The largest frame is 20 dwords, so 0xf mask is too small.
    This was always wrong, but we were lucky with the VCE_CMD_END
    commands inserted after fence and vm_flush.
    
    Fixes: 8897ea8c761b ("drm/amdgpu: Implement insert_end for VCE 3")
    Cc: [email protected]
    Acked-by: Alex Deucher <[email protected]>
    Signed-off-by: David Rosca <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: make Mac FB workaround generic [+ + +]
Author: Alex Deucher <[email protected]>
Date:   Fri Sep 25 09:16:26 2026 -0400

    drm/amdgpu: make Mac FB workaround generic
    
    commit c7f44ec5c4ec760e74351f1843dcb8322f67cbf6 upstream.
    
    Rather than adding a case of every chip where this is seen
    just check if the FB is at 0 and the ssid is apple.  This
    should cover all chips which fall into this case.
    
    Tested-by: Ayhan Çiçek <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit c54e4d10507722398dc90cf3c532e50b86cf425a)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

drm/amdgpu: reset VI ASIC on MacBookPro14,3 [+ + +]
Author: Francisco Beltrán Millalén <[email protected]>
Date:   Mon Oct 5 10:34:18 2026 -0400

    drm/amdgpu: reset VI ASIC on MacBookPro14,3
    
    [ Upstream commit a22e5e4f2ebbdbb962cc3233094d189c4dfaa051 ]
    
    On a MacBookPro14,3 with a Radeon Pro 555 (Polaris11), the framebuffer
    is at MC address 0 when amdgpu loads after a cold boot, as the firmware
    leaves it (MC_VM_FB_LOCATION = 0x007f0000), while the VBIOS ASIC_Init
    table places it at 0xF4_0000_0000 (0xf47ff400).  amdgpu reads the
    location once, at init, so after a re-POST (S3 resume or GPU reset)
    the framebuffer has moved and the driver keeps programming the old
    one: the SMU is handed a table that was never written and the GPU
    does not come back, which leaves the internal panel black.
    
    Resetting the ASIC on load makes ASIC_Init run before the driver reads
    the location, so the driver uses the VBIOS placement from the start and
    every later re-POST puts the framebuffer back where it already is.
    
    Add the Radeon Pro 555 used in this machine to the existing VI reset
    quirk table.
    
    Tested on a MacBookPro14,3 on 6.18.49 with the quirk table backported
    (the kernel also carries unrelated local PCI and ACPI patches for this
    machine).  The framebuffer is at 0x000000F400000000 after both cold and
    warm boot, and the GPU survived 9 S3 cycles (lid close and rtcwake, one
    of them with the lid closed for about 7.5 minutes and a USB-C disk
    attached), each followed by a few minutes of 3D load; no ring timeouts
    or VM faults were reported.  The reset adds about 0.23 s to amdgpu init.
    
    Suggested-by: Christian König <[email protected]>
    Suggested-by: Alex Deucher <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Francisco Beltrán Millalén <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit b6b1d97218518003107d4446fac278fa3e0a19a0)
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: reset VI ASIC on MacBookPro15,1 [+ + +]
Author: Andre Eikmeyer <[email protected]>
Date:   Mon Oct 5 10:34:17 2026 -0400

    drm/amdgpu: reset VI ASIC on MacBookPro15,1
    
    [ Upstream commit a5be7ad8f5f0e067613e9197638f216f46252946 ]
    
    After S3, reloading amdgpu on MacBookPro15,1 systems with a Radeon Pro
    555X or 560X fails while loading the SMU firmware. The existing SMC
    register check does not request a reset because the registers do not
    reliably reflect the stale SMU state on these machines.
    
    Frederick Morlock found that forcing a VI ASIC reset allows the driver to
    initialize again. This patch limits his workaround to the exact PCI
    device, Apple subsystem device and revision combinations used by these
    two GPUs, leaving other VI hardware unchanged.
    
    Suggested-by: Frederick Morlock <[email protected]>
    Signed-off-by: Andre Eikmeyer <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Stable-dep-of: a22e5e4f2ebb ("drm/amdgpu: reset VI ASIC on MacBookPro14,3")
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/aspeed: Balance the display clock enable on teardown [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Sun Sep 13 18:30:19 2026 -0400

    drm/aspeed: Balance the display clock enable on teardown
    
    [ Upstream commit ecce445c6489895463b7ddec2af66338287fee4c ]
    
    aspeed_gfx_load() enables the display clock without checking the return
    value and never disables it on probe failure or removal. devm_clk_get()
    only releases the clock reference, leaving the enable unbalanced.
    
    Use devm_clk_get_enabled() to handle enable failures and automatically
    disable and unprepare the clock on probe failure or removal.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: 4f2a8f5898ec ("drm: Add ASPEED GFX driver")
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Assisted-by: OpenAI:GPT-5.6
    Reviewed-by: Thomas Zimmermann <[email protected]>
    Signed-off-by: Thomas Zimmermann <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/dp: don't mark the AUX backlight enabled when enabling failed [+ + +]
Author: Oleg Keri <[email protected]>
Date:   Fri Sep 25 15:25:58 2026 +0200

    drm/dp: don't mark the AUX backlight enabled when enabling failed
    
    [ Upstream commit 707ce102521496c67860d81221b20c56d8255f2f ]
    
    If drm_edp_backlight_enable() fails, dp_aux_backlight_update_status()
    still marks the backlight as enabled. From then on every brightness
    change only updates the level and the enable is never retried, so the
    panel stays dark until something blanks and unblanks the backlight.
    
    Return the error instead, so the next update tries to enable again.
    
    Fixes: 10f7b40e4f30 ("drm/panel: add basic DP AUX backlight support")
    Signed-off-by: Oleg Keri <[email protected]>
    Reviewed-by: Douglas Anderson <[email protected]>
    Signed-off-by: Douglas Anderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/fb-helper: defer setup when fbdev_probe() fails, not just on -EAGAIN [+ + +]
Author: Nguyen Ngoc Thang <[email protected]>
Date:   Tue Oct 13 13:58:36 2026 -0400

    drm/fb-helper: defer setup when fbdev_probe() fails, not just on -EAGAIN
    
    [ Upstream commit 755c94d178b7e972bb766199d34e4ba4f63a89eb ]
    
    __drm_fb_helper_initial_config_and_unlock() calls
    drm_client_modeset_probe() first, which already fills in each
    mode_set->mode/num_connectors for every connected output, and only
    afterwards calls drm_fb_helper_single_fb_probe() to create
    fb_helper->fb and wire it into those mode_sets via
    drm_setup_crtcs_fb().
    
    If drm_fb_helper_single_fb_probe() fails with anything other than
    -EAGAIN (e.g. dev->driver->fbdev_probe() itself fails), the function
    bails out before drm_setup_crtcs_fb() runs and before setting
    fb_helper->deferred_setup. The client is left with mode_sets that
    have a mode and connectors but mode_set->fb == NULL, and nothing
    marks this fb_helper as needing a retry.
    
    __drm_fb_helper_restore_fbdev_mode_unlocked() only skips committing
    when fb_helper->deferred_setup is set, so a later .restore() call
    (drm_lastclose() on process exit, in this report) commits the stale
    mode_set through drm_client_modeset_commit() ->
    drm_client_modeset_commit_atomic() -> __drm_atomic_helper_set_config(),
    which hits WARN_ON(!set->fb).
    
    Mark fb_helper->deferred_setup on any drm_fb_helper_single_fb_probe()
    failure, not just -EAGAIN, so restore keeps skipping the commit until
    a later hotplug event successfully re-probes and re-populates
    mode_set->fb. The real error code is still returned to the caller
    unchanged.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=ca23c8570669ead78867
    Fixes: ca91a2758fce ("drm/fb-helper: Support deferred setup")
    Cc: [email protected]
    Signed-off-by: Nguyen Ngoc Thang <[email protected]>
    Signed-off-by: Thomas Zimmermann <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Link: https://patch.msgid.link/[email protected]
    [ sashal: Preserved the existing bpp_sel-based preferred_bpp assignment in the deferred-setup error path. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/gud: don't keep a connector without a CRTC as connector_state [+ + +]
Author: Sajal Gupta <[email protected]>
Date:   Tue Sep 22 14:10:08 2026 +0530

    drm/gud: don't keep a connector without a CRTC as connector_state
    
    commit 71ec70ea26e399eb8371fe9d2d5bf5dab09570fb upstream.
    
    If the 'for_each_new_connector_in_state()' loop finishes without
    hitting the break, connector_state is left pointing at the last
    connector visited, which has no CRTC, instead of
    staying NULL.
    
    That skips the "if (!connector_state)" fallback below the loop, which
    looks up the active connector when the state contains none. The
    function then carries on with a connector that is not driven.
    
    Fix by resetting connector_state to NULL for each connector visited that
    has no CRTC, so that it is NULL when none was found and the fallback runs.
    
    Fixes: 40e1a70b4aed ("drm: Add GUD USB Display driver")
    Reported-by: Sashiko <[email protected]>
    Link: https://sashiko.dev/#/patchset/[email protected]?part=1
    Signed-off-by: Sajal Gupta <[email protected]>
    Acked-by: Ruben Wauters <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Ruben Wauters <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/i915/dmc: Harden DMC firmware payload parsing [+ + +]
Author: Dibin Moolakadan Subrahmanian <[email protected]>
Date:   Thu Oct 22 11:14:30 2026 -0400

    drm/i915/dmc: Harden DMC firmware payload parsing
    
    [ Upstream commit 8bb1858db453cd4250e3b633f5d2d09206024ca6 ]
    
    Validate the conversion of the DMC firmware size from dwords to bytes
    using check_mul_overflow() before calculating the firmware payload size.
    
    Reject zero-length payloads and zero MMIO counts in the DMC firmware
    header so malformed firmware is caught early. Also set dmc_fw_size only
    after the payload allocation succeeds.
    
    Fixes: eb805623d8b1 ("drm/i915/skl: Add support to load SKL CSR firmware.")
    Cc: [email protected]
    Assisted-by: Claude-Code:Sonnet-5
    Signed-off-by: Dibin Moolakadan Subrahmanian <[email protected]>
    Reviewed-by: Mitul Golani<[email protected]>
    Signed-off-by: Ankit Nautiyal <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    (cherry picked from commit efde6601a1f1daedfe3dcc2816c934ddb44e3eef)
    Signed-off-by: Joonas Lahtinen <[email protected]>
    [ sashal: changed drm_err() calls to use &i915->drm instead of display->drm ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/i915/gem: Prevent overstepping exec array boundary [+ + +]
Author: Krzysztof Karas <[email protected]>
Date:   Fri Sep 11 06:11:45 2026 +0000

    drm/i915/gem: Prevent overstepping exec array boundary
    
    commit ebe162db655881a38de43301151ff7ac940602b5 upstream.
    
    It is possible for eb_relocate_parse_slow() to call kvfree() on
    entries outside the original exec array during following
    scenario inside eb_relocate_parse_slow():
    
    1) eb_copy_relocations() allocates as many as eb->buffer_count
       copies for exec entries;
    2) eb_parse() appends up to two VMAs, right after incrementing
       eb->buffer_count;
    3) cleanup under "out" label uses this incremented buffer_count
       to release relocation pointers from exec array via kvfree(),
       not from VMA array.
    
    To amend this problem, ensure that relocation cleanup uses the
    original exec object count, excluding the VMAs appended by the
    command parser.
    
    Fixes: 8e4ba491b0ba ("drm/i915: Parse command buffer earlier in eb_relocate(slow)")
    Signed-off-by: Krzysztof Karas <[email protected]>
    Assisted-by: GitHub-Copilot:gpt-6-astra
    Cc: [email protected] # 5.10+
    Reviewed-by: Andi Shyti <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    (cherry picked from commit 2a0158925fb943c7ba8f3216e2734952128defc9)
    Signed-off-by: Jani Nikula <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/i915/gt: Unmask interrupts only when ACTIVE is true [+ + +]
Author: Krzysztof Karas <[email protected]>
Date:   Tue Oct 13 13:10:10 2026 -0400

    drm/i915/gt: Unmask interrupts only when ACTIVE is true
    
    [ Upstream commit 5346b1cec6afa4f9b4b49a9f84e3cfef95a3f7bb ]
    
    There is a small race window between intel_rps_boost() reading
    a stale ACTIVE state and queuing rps->work, where ACTIVE may be
    changed via asynchronous calls triggered by wakeref drop.
    This means that rps_work() could be triggered after the GT has
    been parked, so unmasking RPS PM interrupts would happen without
    holding PM wakelock. This sequence of events may be observed
    during live_rc6_ctx_wa() selftest:
    
    1) live_rc6_ctx_wa()
       -> intel_engine_pm_put()
          -> wakeref_put()
    
    ASYNC1) wakeref_put() callback
              -> __engine_park()
                 -> intel_gt_pm_put_async()
                    -> intel_gt_pm_put_async_untracked()
                       -> intel_wakeref_put_async()
    
    ASYNC2) wakeref_put_async() callback
              -> __gt_park()
                 -> intel_rps_park()
                    -> intel_rps_clear_active() [clear ACTIVE]
                    WITH INTERRUPTS:
                    -> rps_disable_interrupts()
                       -> cancel_work_sync(rps->work)
                       -> rps_reset_interrupts() [rps->pm_iir = 0]
                    WITHOUT INTERRUPTS (TIMER mode):
                    -> rps_stop_timer()
                       -> cancel_work_sync(rps->work)
    
    2) live_rc6_ctx_wa()
       -> intel_gt_wait_for_idle()
          -> intel_gt_retire_requests_timeout()
             -> dma_fence_wait_timeout()
                -> ops->wait() [i915_fence_wait()]
                   -> i915_request_wait_timeout()
                      -> intel_rps_boost()
                         -> intel_rps_is_active() [check ACTIVE]
                            [OPEN RACE WINDOW]
                         -> queue_work(rps->work)
             -> retire_requests()
                -> i915_request_retire()
                   -> intel_rps_dec_waiters() [from 1 to 0]
    
    If ASYNC1 and ASYNC2 would execute during [OPEN RACE WINDOW],
    then:
    
    3) rps_work() executes from the workqueue and may satisfy
       "(!pm_iir && !client_boost)" test (in TIMER mode rps->pm_iir
       is zeroed by an earlier rps_work() call or never gets a new
       value after previous intel_rps_unpark() event), so it jumps
       to "out" label, bypassing intel_rps_is_active() guard and
       executes gen6_gt_pm_unmask_irq();
    
    4) GT is parked and runtime PM wakelock is dropped, so only
       a raw reference in __gt_park() ->
       intel_display_power_put_async() remains for 100ms, then the
       MMIO write in gen6_gt_pm_unmask_irq() detects missing
       wakelock via assert_rpm_wakelock_held() and emits
       "RPM wakelock ref not held during HW access" tainting kernel.
    
    Commit 3e7abf814193 ("drm/i915: Extract GT render power state management")
    dropped the "if (rps->interrupts_enabled)" guard that
    gen6_pm_rps_work() had around this unmask in i915_irq.c.
    INTEL_RPS_ACTIVE brackets the same window, since it is set in
    intel_rps_unpark() before rps_enable_interrupts() and
    rps_start_timer() and cleared in intel_rps_park() before
    rps_stop_timer() and rps_disable_interrupts().
    
    Skip unmasking when RPS is no longer active (reaching unmask
    operation is independent of INTERRUPT mode). This does not
    prevent RPS operation from resuming on the next unpark.
    In interrupt mode, intel_rps_unpark() calls
    rps_enable_interrupts(), which enables and unmasks the PM
    interrupts. In timer mode, it calls rps_start_timer(),
    restarting periodic engine-busyness evaluation. The timer
    generates software RPS events and queues rps_work() directly,
    independently of PM interrupt delivery. Neither mode requires
    the late worker to unmask interrupts while the GT is parked
    
    Fixes: 3e7abf814193 ("drm/i915: Extract GT render power state management")
    Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16562
    Cc: [email protected] # v5.5+
    Assisted-by: GitHub-Copilot:claude-opus-5
    Assisted-by: GitHub-Copilot:gpt-6-astra
    Signed-off-by: Krzysztof Karas <[email protected]>
    Reviewed-by: Andi Shyti <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    (cherry picked from commit ca4a6deadad15b91ee083afe445fa6bdbfb68206)
    Signed-off-by: Jani Nikula <[email protected]>
    [ sashal: Retained `>->irq_lock` in lock/unlock calls because the lock is stored directly rather than as a pointer. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/msm/a6xx: Avoid a nullptr dereference when speedbin setting fails [+ + +]
Author: Konrad Dybcio <[email protected]>
Date:   Fri Apr 12 10:53:25 2024 +0200

    drm/msm/a6xx: Avoid a nullptr dereference when speedbin setting fails
    
    [ Upstream commit 46d4efcccc688cbacdd70a238bedca510acaa8e4 ]
    
    Calling a6xx_destroy() before adreno_gpu_init() leads to a null pointer
    dereference on:
    
    msm_gpu_cleanup() : platform_set_drvdata(gpu->pdev, NULL);
    
    as gpu->pdev is only assigned in:
    
    a6xx_gpu_init()
    |_ adreno_gpu_init
        |_ msm_gpu_init()
    
    Instead of relying on handwavy null checks down the cleanup chain,
    explicitly de-allocate the LLC data and free a6xx_gpu instead.
    
    Fixes: 76efc2453d0e ("drm/msm/gpu: Fix crash during system suspend after unbind")
    Signed-off-by: Konrad Dybcio <[email protected]>
    Patchwork: https://patchwork.freedesktop.org/patch/588919/
    Signed-off-by: Rob Clark <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/msm/adreno: Assign msm_gpu->pdev earlier to avoid nullptrs [+ + +]
Author: Konrad Dybcio <[email protected]>
Date:   Tue Jul 9 13:15:40 2024 +0200

    drm/msm/adreno: Assign msm_gpu->pdev earlier to avoid nullptrs
    
    [ Upstream commit 16007768551d5bfe53426645401435ca8d2ef54f ]
    
    There are some cases, such as the one uncovered by Commit 46d4efcccc68
    ("drm/msm/a6xx: Avoid a nullptr dereference when speedbin setting fails")
    where
    
    msm_gpu_cleanup() : platform_set_drvdata(gpu->pdev, NULL);
    
    is called on gpu->pdev == NULL, as the GPU device has not been fully
    initialized yet.
    
    Turns out that there's more than just the aforementioned path that
    causes this to happen (e.g. the case when there's speedbin data in the
    catalog, but opp-supported-hw is missing in DT).
    
    Assigning msm_gpu->pdev earlier seems like the least painful solution
    to this, therefore do so.
    
    Signed-off-by: Konrad Dybcio <[email protected]>
    Patchwork: https://patchwork.freedesktop.org/patch/602742/
    Signed-off-by: Rob Clark <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/radeon: Read the VRAM VBIOS signature with readb() [+ + +]
Author: Imre Kaloz <[email protected]>
Date:   Sun Sep 27 16:55:04 2026 +0200

    drm/radeon: Read the VRAM VBIOS signature with readb()
    
    commit de1eab13efef83fd2b76f4688de5bf672644596f upstream.
    
    igp_read_bios_from_vram() checked bios[0]/bios[1] with a plain
    __iomem load, which faults on sparc64 before the copy runs at all.
    radeon_read_bios() already reads its two signature bytes with
    readb() ahead of its own copy; use the same accessor here, keeping
    the check before the allocation.
    
    Fixes: b442962a9e82 ("drm/radeon/kms: add support for "Surround View"")
    Signed-off-by: Imre Kaloz <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 09155b8932e5013dbce0f5cdff7d75264a279ee5)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/vc4: drain the hangcheck timer and works on V3D unbind [+ + +]
Author: Fan Wu <[email protected]>
Date:   Tue Sep 15 09:51:03 2026 +0000

    drm/vc4: drain the hangcheck timer and works on V3D unbind
    
    commit 94cf5971b1d04c6382437387c4dc3836cc7a1437 upstream.
    
    Nothing stops the hangcheck timer that submitted jobs arm, or the
    job_done_work that the render-done interrupt queues, at teardown:
    vc4_irq_disable() cancels only overflow_mem_work, and vc4_gem_destroy()
    runs from the drm-managed release, after vc4_v3d_unbind() has already
    uninstalled the V3D interrupt and cleared vc4->v3d. A timer still armed
    by then reads V3D registers through the NULL vc4->v3d pointer, and the
    late callbacks run on the vc4_dev embedding them after it has been
    freed.
    
    Drain them in vc4_v3d_unbind(): shut the timer down and cancel
    reset_work before the interrupt is taken down, because its
    vc4_irq_reset() re-enables it, then flush job_done_work so that
    completions queued at teardown still release their jobs.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.")
    Cc: [email protected] # 6.2+
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Maíra Canal <[email protected]>
    Signed-off-by: Maíra Canal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

drm/vc4: Free the BO cache size list on teardown [+ + +]
Author: Maíra Canal <[email protected]>
Date:   Wed Sep 30 16:06:50 2026 -0300

    drm/vc4: Free the BO cache size list on teardown
    
    [ Upstream commit b41ff8b529278216cba22a5dcdc93fea2a3a9619 ]
    
    vc4_bo_cache_destroy() purges the cached BOs but never frees the size
    list, leaking it on every unbind.
    
    Fixes: c826a6e10644 ("drm/vc4: Add a BO cache.")
    Assisted-by: LLM
    Reviewed-by: Thadeu Lima de Souza Cascardo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Maíra Canal <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/vmwgfx: validate pitch coming from userspace [+ + +]
Author: Zack Rusin <[email protected]>
Date:   Tue Oct 13 15:38:11 2026 -0400

    drm/vmwgfx: validate pitch coming from userspace
    
    [ Upstream commit 21bc51cb89ced74d6645a138cc2f21184bc75094 ]
    
    Validate the pitch, alongside the box dimensions before trying
    to copy data from the underlying surface. Fixes possible
    out of bounds reads with cursor snooping.
    
    Fixes: 2ac863719e51 ("vmwgfx: Snoop DMA transfers with non-covering sizes")
    Cc: [email protected]
    Reported-by: Youness HFA <[email protected]>
    Signed-off-by: Zack Rusin <[email protected]>
    Reviewed-by: Maaz Mombasawala <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ sashal: Adapted descriptor-based cursor sizing to hard-coded 64×64 dimensions and 4-byte pixels. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
EDAC/amd64: Mask UMC chip select to the four implemented selects [+ + +]
Author: Vishal Badole <[email protected]>
Date:   Mon Oct 12 14:46:16 2026 -0400

    EDAC/amd64: Mask UMC chip select to the four implemented selects
    
    [ Upstream commit 7484bc43ba6b8e189b482db5b75e7842890a82b1 ]
    
    For DRAM ECC errors, the chip select value can be found in the
    MCA_SYND[ErrorInformation] field.
    
    ErrorInformation[2:0] was first documented in Zen1. The 3 bit field
    implied that up to 8 chip selects may be used.
    
    However, all Zen-based systems have only ever had up to 4 chip selects.
    So only bits [1:0] would contain a valid chip select value.
    
    Future systems are redefining the field to ErrorInformation[1:0]. This
    matches the existing 'up to 4 chip selects' implementations. And it
    frees up the extra bit for other decoding.
    
    Change the current chip select mask from 0x7 to 0x3 to prepare for the
    decode change.
    
    Fixes: 713ad54675fd ("EDAC, amd64: Define and register UMC error decode function")
    Suggested-by: Yazen Ghannam <[email protected]>
    Signed-off-by: Vishal Badole <[email protected]>
    Signed-off-by: Borislav Petkov (AMD) <[email protected]>
    Reviewed-by: Yazen Ghannam <[email protected]>
    Cc: <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ sashal: adapted the change to decode_umc_error(), using err.csrow instead of err->csrow ]
    Signed-off-by: Sasha Levin <[email protected]>

 
exit: fix lost-update race on the child_subreaper bitfields [+ + +]
Author: Nickolai Zeldovich <[email protected]>
Date:   Sun Oct 11 08:34:39 2026 -0400

    exit: fix lost-update race on the child_subreaper bitfields
    
    [ Upstream commit 28d2905d77bc2e7c20260a6bc6b4179bdf95cb06 ]
    
    is_child_subreaper, has_child_subreaper, autoreap and, with
    CONFIG_POSIX_TIMERS=y, timer_create_restore_ids are 1-bit fields that
    share one memory location in struct signal_struct.  A store to any of
    them is a read-modify-write of the whole word, and three of the stores
    run without a common lock:
    
      - PR_SET_CHILD_SUBREAPER writes me->signal->is_child_subreaper with
        no lock held.
    
      - propagate_has_child_subreaper(), run by walk_process_tree() from
        the same prctl in an ancestor, writes p->signal->has_child_subreaper
        of every descendant p under read_lock(&tasklist_lock), which does
        not exclude the other writers.
    
      - PR_TIMER_CREATE_RESTORE_IDS writes
        current->signal->timer_create_restore_ids with no lock held.
    
    When a process calls prctl(PR_SET_CHILD_SUBREAPER, 1) while an
    ancestor's PR_SET_CHILD_SUBREAPER walk visits it, or while another
    thread of the same process calls prctl(PR_TIMER_CREATE_RESTORE_IDS),
    the read-modify-write sequences interleave and one of the bits is
    silently lost:
    
      - If has_child_subreaper is lost, the process's orphaned descendants
        are reparented straight to init when it exits: find_new_reaper()
        tests father->signal->has_child_subreaper first and never looks for
        the ancestor subreaper.  The service manager that registered as the
        subreaper never gets SIGCHLD for them and cannot wait() on them.
    
      - If is_child_subreaper is lost, the prctl returned 0 but the process
        is not a subreaper: orphans of its descendants skip it and are
        reparented to the next subreaper up or to init.
        PR_GET_CHILD_SUBREAPER reads back 0.
    
      - If timer_create_restore_ids is lost, the prctl returned 0 but
        timer_create() does not restore the requested timer ids (or keeps
        restoring them after _OFF), and _GET reads back the old value.
    
    Documentation/memory-barriers.txt requires all fields of one bitfield
    to be protected by one lock for exactly this reason.  No lock is taken
    or documented for these flags, and the prctls need no privilege, so any
    process can hit the race against its own ancestors or descendants, or
    between two of its own threads.
    
    Make is_child_subreaper and has_child_subreaper separate bool members.
    Each store then has its own memory location and no read-modify-write
    of a neighbour.  The readers and their locking are unchanged.
    
    autoreap stays a bit-field and so shares a memory location only with
    timer_create_restore_ids.  That pair is race-free: autoreap is stored
    exactly once, in copy_process() before the new signal_struct is
    reachable by any other task, and timer_create_restore_ids is only
    stored to the signal_struct of an already running process.
    
    Fixes: 749860ce2427 ("prctl: propagate has_child_subreaper flag to every descendant")
    Signed-off-by: Nickolai Zeldovich <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Acked-by: Oleg Nesterov <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
f2fs: embed f2fs_gc_kthread in f2fs_sb_info [+ + +]
Author: Chao Yu <[email protected]>
Date:   Sat Sep 12 10:20:46 2026 -0400

    f2fs: embed f2fs_gc_kthread in f2fs_sb_info
    
    [ Upstream commit 3d7bca9d583793bb7d0bac0d95a24ddd2e129eed ]
    
    Instead of allocating f2fs_gc_kthread dynamically, embed it in
    f2fs_sb_info. This simplifies lifetime management and prepares for
    fixing race conditions during teardown.
    
    - __sbi_store                   - remount|shutdown
                                     - f2fs_stop_gc_thread
     - access sbi->gc_thread
                                      - sbi->gc_thread = NULL
     - access sbi->gc_thread->f2fs_gc_task
    
    Fixes: 52190933c37a ("f2fs: sysfs: introduce critical_task_priority")
    Fixes: 7950e9ac638e ("f2fs: stop gc/discard thread after fs shutdown")
    Cc: [email protected]
    Signed-off-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ adapted GC structure access changes to Linux 5.15’s existing fields and APIs. ]
    Signed-off-by: Sasha Levin <[email protected]>

f2fs: fix dentry folio leak in find_in_level [+ + +]
Author: Guanghui Yang <[email protected]>
Date:   Fri Sep 11 21:43:41 2026 -0400

    f2fs: fix dentry folio leak in find_in_level
    
    [ Upstream commit cca7d3e30bf30333314e31bc70b9a739f1342167 ]
    
    find_in_level() gets a dentry folio with f2fs_find_data_folio() before
    calling find_in_block().  If find_in_block() returns an error, the
    function stores the error in res_folio and breaks out of the loop without
    dropping the dentry folio.
    
    This leaks the folio reference on the find_in_block() error path.  Drop
    the dentry folio before returning the error to the caller.
    
    Fixes: 7ad08a58bf67 ("f2fs: Handle casefolding with Encryption")
    Cc: [email protected]
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Guanghui Yang <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ Replaced f2fs_folio_put(dentry_folio, false) with f2fs_put_page(dentry_page, 0) for the page-based API. ]
    Signed-off-by: Sasha Levin <[email protected]>

f2fs: limit recovery filename logging to stored length [+ + +]
Author: Wenjie Qi <[email protected]>
Date:   Fri Sep 11 21:43:44 2026 -0400

    f2fs: limit recovery filename logging to stored length
    
    [ Upstream commit 01027b2fcb74dade59fb833b51023f6593b6a9a2 ]
    
    F2FS stores recovery filenames as a length plus a fixed-size i_name
    buffer.  The buffer is not NUL-terminated, but recover_inode() and
    recover_dentry() print it with %s.
    
    For a 255-byte filename, recovery logging can read past i_name into the
    following raw inode fields.
    
    Print the name with a precision bounded by i_namelen and F2FS_NAME_LEN.
    
    Fixes: f356fe0cba0e ("f2fs: add debug msgs in the recovery routine")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.5
    Signed-off-by: Wenjie Qi <[email protected]>
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ inlined recover_printable_name() logic into the existing page-based recovery functions. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
fcntl: refuse F_SET_RW_HINT on an immutable inode [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 22:44:58 2026 -0400

    fcntl: refuse F_SET_RW_HINT on an immutable inode
    
    [ Upstream commit b0d1022b9bdb1e98aa7fb3244fdd50a58c61766c ]
    
    An immutable inode is never written to so write hints are pointless.
    Refuse the hint on an immutable inode the way setattr(), fallocate() and
    etxattr() refuse their changes.
    
    Fixes: c75b1d9421f8 ("fs: add fcntl() interface for setting/getting write life time hints")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: Moved the check from fcntl_set_rw_hint() into the F_SET_RW_HINT case of fcntl_rw_hint(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
flow_dissector: avoid u16 truncation of hlen in bpf_flow_dissect() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Wed Oct 7 06:56:15 2026 +0200

    flow_dissector: avoid u16 truncation of hlen in bpf_flow_dissect()
    
    [ Upstream commit f202578efc738b883cfa04889eb97328914265a7 ]
    
    bpf_flow_dissect() sanitizes the offsets returned by the BPF program
    with clamp_t(u16, ..., hlen).
    
    If hlen is bigger than 65535, the upper bound is truncated before
    the comparison. For instance, with hlen == 65536, both nhoff and
    thoff are forced to zero, even if the program returned sane values.
    
    This is the same class of bug as the one fixed in commit 99bda1ecbd56
    ("flow_dissector: avoid u16 truncation of skb->len when computing
    thoff"). That fix does not cover the BPF path, because
    __skb_flow_dissect() returns early when a BPF flow dissector
    handles the packet.
    
    struct bpf_flow_keys stores nhoff and thoff as u16, so cap hlen
    to U16_MAX before clamping.
    
    Found by sashiko while reviewing the commit above.
    
    Fixes: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook")
    Signed-off-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

flow_dissector: avoid u16 truncation of skb->len when computing thoff [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Thu Oct 1 19:11:38 2026 +0000

    flow_dissector: avoid u16 truncation of skb->len when computing thoff
    
    [ Upstream commit 99bda1ecbd56905f8bd934b9cdccd3bd251192b1 ]
    
    __skb_flow_dissect() computes key_control->thoff using:
    
      key_control->thoff = min_t(u16, nhoff, skb ? skb->len : hlen);
    
    min_t(u16, ...) casts both arguments to u16 before comparing them.
    Whenever skb->len (or hlen) modulo 65536 is smaller than nhoff, the
    truncated length wins and thoff is set to a bogus small value, even
    when the dissection succeeded. For example, an IPv4/TCP frame with
    skb->len == 65540 and nhoff == 34 gets thoff == 4, so callers such as
    skb_probe_transport_header() point the transport header inside the
    Ethernet header.
    
    Such skbs are not exotic:
    - At the time of commit d0c081b49137 ("flow_dissector: properly cap
      thoff field"), AF_PACKET with PACKET_VNET_HDR could already build GSO
      skbs larger than 64KB (MTU checks are skipped for GSO, and
      alloc_skb_with_frags() accepted up to MAX_SKB_FRAGS (17) order-0
      pages on top of the linear part).
    - BIG TCP now makes skbs larger than 64KB common.
    - The following patch makes tun_get_user() dissect IFF_TAP frames
      before eth_type_trans() pulls the Ethernet header, so a GSO frame
      carrying a 65522..65535 byte L3 packet will be dissected with
      skb->len in [65536, 65549].
    
    Compare as u32 instead. If the resulting offset cannot be represented
    in the u16 key_control->thoff, cap it to U16_MAX and report the
    dissection as failed rather than silently returning a wrong transport
    offset. thoff is still set on failure, as some callers (such as
    eth_get_headlen()) use it regardless of the return value.
    
    Fixes: d0c081b49137 ("flow_dissector: properly cap thoff field")
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
fs: Free any excess xarray nodes in clear_inode() [+ + +]
Author: Matthew Wilcox (Oracle) <[email protected]>
Date:   Fri Oct 9 10:14:27 2026 -0400

    fs: Free any excess xarray nodes in clear_inode()
    
    [ Upstream commit ee3f011250104129893d8e9599147e457d4d7280 ]
    
    For many years we've had a hard to hit leak of xarray nodes.  Hugh
    documented it well in commit 786b31121a2c.  Recently people and
    syzbot have found ways to force it to happen with madvise.  Rather
    than fix the leaks where they happen, just call xa_destroy() which
    has the side-effect of cycling the i_pages lock.
    
    Cc: Rik van Riel <[email protected]>
    Cc: Zi Yan <[email protected]>
    Cc: Jinjiang Tu <[email protected]>
    Cc: Dave Jones <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Rik van Riel <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

fs: refuse fspick() on internal superblocks [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Sat Sep 26 15:44:29 2026 +0200

    fs: refuse fspick() on internal superblocks
    
    commit 02587a4af82adccaef8e3b3624b4e7f1c401632d upstream.
    
    There's a few instances where a internal superblock is reachable by
    fspick(). Block that. graft_tree() and fsmount() already refuse them.
    fanotify refuses mount and superblock marks on them for the same reason.
    
    Fixes: cf3cba4a429b ("vfs: syscall: Add fspick() to select a superblock for reconfiguration")
    Cc: [email protected] # v5.2+
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
fsnotify: prevent mark additions during connector teardown [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Fri Oct 2 05:59:02 2026 +0000

    fsnotify: prevent mark additions during connector teardown
    
    commit 36ebddca56b9d8993d6dc984fdecc748ee1f5e06 upstream.
    
    fsnotify_destroy_marks() keeps a reference to its current mark while it
    drops conn->lock to destroy the mark. This stabilizes the forward-walk
    cursor, but does not prevent a new mark from being inserted before it.
    For example, an inotify watch re-added after IN_IGNORED sorts before the
    old, detached mark for the same group. The walk can miss the replacement
    and then detach the entire connector from the object.
    
    The replacement is still on its group's marks_list and, for inotify, in
    the watch IDR. The group mutex no longer protects the connector's object
    from disappearing. An unprivileged fdinfo read racing the final detach
    can consequently call igrab(NULL):
    
      BUG: KASAN: null-ptr-deref in igrab+0x24/0x100
      Write of size 4 at addr 0000000000000148
      Call Trace:
       igrab+0x24/0x100
       inotify_show_fdinfo+0x1dc/0x5e0
       seq_show+0x397/0x690
    
    Set a DESTROYING flag under conn->lock before starting the walk, and
    reject new marks on that connector with -ENOENT. The existing add-mark
    error paths undo the temporary group-list entry and the backend's watch
    allocation. Do not wait for teardown while holding the group mutex,
    which the destroyer needs. Once the old connector is detached, an add
    can install a fresh connector as before.
    
    This closes the insertion race for all object types using the common
    connector teardown, without changing the mark reference or SRCU lifetime
    rules.
    
    Fixes: 6b3f05d24d35 ("fsnotify: Detach mark from object list when last reference is dropped")
    Cc: [email protected]
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
fsverity: add dependency on 64K or smaller pages [+ + +]
Author: Eric Biggers <[email protected]>
Date:   Tue Oct 6 23:58:01 2026 +0200

    fsverity: add dependency on 64K or smaller pages
    
    commit a300000233a9ff842e2fb450fb9a79f7827a586d upstream.
    
    Currently, all filesystems that support fsverity (ext4, f2fs, and btrfs)
    cache the Merkle tree in the pagecache at a 64K aligned offset after the
    end of the file data.  This offset needs to be a multiple of the page
    size, which is guaranteed only when the page size is 64K or smaller.
    
    64K was chosen to be the "largest reasonable page size".  But it isn't
    the largest *possible* page size: the hexagon and powerpc ports of Linux
    support 256K pages, though that configuration is rarely used.
    
    For now, just disable support for FS_VERITY in these odd configurations
    to ensure it isn't used in cases where it would have incorrect behavior.
    
    Fixes: 671e67b47e9f ("fs-verity: add Kconfig and the helper functions for hashing")
    Reported-by: Christoph Hellwig <[email protected]>
    Closes: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Theodore Ts'o <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Eric Biggers <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ftrace: Synchronize the initialization of ftrace_ops [+ + +]
Author: Steven Rostedt <[email protected]>
Date:   Thu Sep 10 10:35:24 2026 -0400

    ftrace: Synchronize the initialization of ftrace_ops
    
    [ Upstream commit 4617721c502b2ddaa4e324e86da4997edf738fa5 ]
    
    There's some internal state that ftrace_ops needs to have set, but since
    it can be declared outside of the ftrace.c code, it calls
    ftrace_ops_init() on the ops in every global function. The issue is that
    if two tasks call it on the same ops at the same time it is possible to
    have the initialization of one corrupt the initialization of the other
    call.
    
    Create a ops_mutex to use to synchronize every initialization of the
    ftrace_ops. The mutex is taken within checking the ftrace_ops flag that
    states it was initializied but the flag is checked again after the mutex
    has been taken. Checking first outside the mutex allows it to shortcut
    having to take the mutex. But then the check needs to be done again after
    the mute is taken in case of races.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: f04f24fb7e48d ("ftrace, kprobes: Fix a deadlock on ftrace_regex_lock")
    Reported-by: [email protected]
    Close: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Steven Rostedt <[email protected]>
    [ adjusted INIT_OPS_HASH macro context for the missing subop_list member. ]
    Signed-off-by: Sasha Levin <[email protected]>

ftrace: Take trace_array reference before accessing its ftrace_ops [+ + +]
Author: Steven Rostedt <[email protected]>
Date:   Thu Sep 10 11:11:07 2026 -0400

    ftrace: Take trace_array reference before accessing its ftrace_ops
    
    [ Upstream commit 9100191e5acb2e5ea2313f436667bb5fce129f47 ]
    
    The trace instance files set_ftrace_filter and set_ftrace_notrace was
    updated to work with specific trace instances (trace_arrays). The issue is
    that when these files are opened, there is a small race window where it
    will use the ftrace_ops from the inode->private pointer to get a reference
    to the trace_array and then take its reference. The problem is that the
    ftrace_ops itself could be freed. If the rmdir on the instance happens at
    the same time the set_ftrace_filter file is opened, the rmdir could have
    also freed the ftrace_ops and referencing it will cause a use-after-free
    bug and crash the kernel.
    
    Instead, pass in the trace_array as the file private data (NULL for the
    top level instance), and then pass both the trace_array and the ftrace_ops
    to the ftrace_regex_open() function. If the trace_array is NULL, then it
    just uses the ftrace_ops without the need to take its reference (like
    normal). If the ftrace_ops is NULL, that is only the case for the top
    level instance and the global_ops can be used.
    
    This allows the trace_array to have its reference incremented before
    touching the ftrace_ops that could also be freed when the instance is.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/20260828223901.29e26edb@robin
    Fixes: 591dffdade9f0 ("ftrace: Allow for function tracing instance to filter functions")
    Reported-by: Breno Leitao <[email protected]>
    Tested-by: Breno Leitao <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Steven Rostedt <[email protected]>
    [ Replaced kzalloc_obj(*iter) with kzalloc(sizeof(*iter), GFP_KERNEL). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
futex: Fix mm reuse handling for FUT_OFF_MMSHARED [+ + +]
Author: Jann Horn <[email protected]>
Date:   Thu Oct 22 08:58:09 2026 -0400

    futex: Fix mm reuse handling for FUT_OFF_MMSHARED
    
    [ Upstream commit 3267512ad1c2cc0c7768c5b014dc2cceb398a801 ]
    
    A FUT_OFF_MMSHARED futex is a shared futex that refers to an MM.
    It is possible for a process to wait on a shared futex with a different MM
    because a FUT_OFF_INODE waiter can be requeued onto a FUT_OFF_MMSHARED
    futex by another process.
    This can cause FUT_OFF_MMSHARED waiters on a freed MM to consume
    wakeups intended for a newly allocated MM at the same address.
    
    Fix it by keying FUT_OFF_MMSHARED using a unique 64-bit per-MM ID.
    Leave private futexes as before to avoid influencing the performance of the
    hotpath.
    
    (Multi-threaded processes typically implicitly use FUT_OFF_MMSHARED by
    setting clear_child_tid such that it points into anonymous memory, which
    causes mm_release() in a multi-threaded mm to perform FUTEX_WAKE.)
    
    Fixes: 222993395ed3 ("futex: Remove pointless mmgrap() + mmdrop()")
    Closes: https://lore.kernel.org/r/CAG48ez0dLBpc3QtbAhMMVNHwHL94iHh2G+h-=BVFR4dDuzZr1g@mail.gmail.com/
    Signed-off-by: Jann Horn <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    [ sashal: Adapted futex ID storage to a direct mm_struct field initialized in mm_init(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
genetlink: pin family module during policy dump [+ + +]
Author: XingWang Xiang <[email protected]>
Date:   Wed Sep 16 19:42:08 2026 -0400

    genetlink: pin family module during policy dump
    
    [ Upstream commit 6a1094c34d176827b2b173e163dcc964a13af93f ]
    
    The generic netlink controller's policy dump keeps pointers to the target
    family's operation and policy tables in its callback state.  A dump may be
    split across multiple skbs and remain pending after the initial request.
    
    Netlink pins the module which owns the dump callback, but in this case
    that is the controller's owner rather than the target family's owner.  The
    target family can consequently be unregistered and its module unloaded
    while a policy dump is pending.  Advancing the dump then dereferences
    policy memory from the unloaded module.
    
    Take a reference to the target family's module when the dump starts.
    Drop it from the error and done paths.  This matches the lifetime for which
    the dump context retains the family and policy pointers.
    
    Fixes: d07dcf9aadd6 ("netlink: add infrastructure to expose policies to userspace")
    Cc: [email protected]
    Signed-off-by: XingWang Xiang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted split-operation iterator handling to the older genl_ops and opidx interfaces. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
gpio: exar: initialize the ID before registering its cleanup [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Wed Sep 30 02:37:31 2026 +0900

    gpio: exar: initialize the ID before registering its cleanup
    
    [ Upstream commit 4d69e74034b208588636ecc177e0dd43a7696af3 ]
    
    devm_add_action_or_reset() invokes the cleanup action immediately when
    registering the action fails.  gpio_exar_probe() currently stores the
    allocated ID in exar_gpio only after registering the action, so that
    failure makes exar_devm_ida_free() release ID 0.  If the allocated ID is
    nonzero, this leaks that ID and can free ID 0 belonging to another device.
    
    Store the ID before registering the cleanup action so both the immediate
    failure path and normal device teardown release the correct allocation.
    
    Fixes: 5300ebb695fa ("gpio: exar: use devm action for freeing the IDA and drop remove()")
    Reported-by: Changyul Lee <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Reviewed-by: Linus Walleij <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Bartosz Golaszewski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

gpio: xilinx: fix runtime PM leak on request error path [+ + +]
Author: Ridham Khurana <[email protected]>
Date:   Wed Sep 23 11:39:02 2026 +0000

    gpio: xilinx: fix runtime PM leak on request error path
    
    commit ff82fc3a4a1d417dee1229681cc5285986edb1fa upstream.
    
    pm_runtime_get_sync() leaves the usage counter incremented even when it
    fails, and xgpio_request() returns the error without dropping it.
    
    gpiolib does not call ->free() when ->request() fails, so xgpio_free(),
    which holds the only matching pm_runtime_put(), never runs. The reference
    is leaked and the controller can no longer runtime-suspend, so its clock
    stays enabled.
    
    Switch to pm_runtime_resume_and_get(), which only increments the usage
    counter on success.
    
    Fixes: 26b04774621e ("gpio: gpio-xilinx: Add support for suspend and resume")
    Cc: [email protected]
    Signed-off-by: Ridham Khurana <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Bartosz Golaszewski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
gtp: serialize PDP context updates [+ + +]
Author: Qing Ming <[email protected]>
Date:   Mon Aug 31 21:54:19 2026 -0400

    gtp: serialize PDP context updates
    
    [ Upstream commit 498386b6d402737db1e2eeed4c385acbf0ef9e34 ]
    
    PDP contexts can be deleted through GTP_CMD_DELPDP or while the GTP
    network device is being unregistered. The latter is serialized by RTNL,
    but the generic-netlink delete path only holds RCU.
    
    Running both paths concurrently can therefore make both paths delete the
    same PDP context. The issue was found through static analysis and
    reproduced on a KASAN-enabled kernel by a simple two-thread program
    racing GTP_CMD_DELPDP against RTM_DELLINK:
    
      Oops: general protection fault, probably for non-canonical address
      KASAN: maybe wild-memory-access in range
             [0xdead000000000120-0xdead000000000127]
      RIP: gtp_genl_del_pdp+0x1c1/0x420 [gtp]
      RBP: dead000000000122
    
    The second deletion dereferenced the poisoned hlist pprev pointer.
    
    Serialize gtp_pdp_add(), gtp_genl_del_pdp(), and gtp_dellink() with a
    shared mutex. Keep the mutex held until the final use of a PDP context in
    the NEWPDP path, and keep the RCU read-side section around the complete
    PDP context use in the DELPDP path.
    
    Fixes: 459aa660eb1d ("gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U)")
    Cc: [email protected]
    Signed-off-by: Qing Ming <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted the locking changes to the older IPv4-only PDP context API and omitted the absent IPv6 lookup hunk. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
HID: alps: unregister DualPoint Stick input device on remove [+ + +]
Author: Chen Changcheng <[email protected]>
Date:   Tue Sep 29 22:34:08 2026 -0400

    HID: alps: unregister DualPoint Stick input device on remove
    
    [ Upstream commit aa9dde93e05a837645fdfd577eea71f0733f0694 ]
    
    alps_input_configured() allocates a second input device ("DualPoint
    Stick") with input_allocate_device() and registers it, but the
    alps_driver struct has no .remove handler and input2 is not tracked in
    hdev->inputs.  The default remove path (hid_hw_stop -> hidinput_disconnect)
    only iterates hdev->inputs, so input2 is never unregistered and leaks
    on every device removal.
    
    Add a .remove handler that stops the device first (preventing URB
    callbacks from touching input2 during teardown) and then unregisters
    input2.
    
    Fixes: 2562756dde55 ("HID: add Alps I2C HID Touchpad-Stick support")
    Cc: [email protected]
    Signed-off-by: Chen Changcheng <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: core: introduce hid_safe_input_report() [+ + +]
Author: Benjamin Tissoires <[email protected]>
Date:   Sun Oct 11 10:39:09 2026 +0000

    HID: core: introduce hid_safe_input_report()
    
    [ Upstream commit 206342541fc887ae919774a43942dc883161fece ]
    
    hid_input_report() is used in too many places to have a commit that
    doesn't cross subsystem borders. Instead of changing the API, introduce
    a new one when things matters in the transport layers:
    - usbhid
    - i2chid
    
    This effectively revert to the old behavior for those two transport
    layers.
    
    Fixes: 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing bogus memset()")
    Cc: [email protected]
    Signed-off-by: Benjamin Tissoires <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    (cherry picked from commit a9527c32cc9d98252dc975d6fcb29f2013d0f63a)
    [Lee: Implement hid_safe_input_report() directly and wrap it from
          hid_input_report() as 67eccf151d76 ("HID: add source argument to
          HID low level functions") is not present.  Use int for report type
          and literal 2 in i2c_hid_get_input() as 56fc4f7bc114 and
          1bdbe0dcff2f are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: core: remove #ifdef CONFIG_PM from hid_driver [+ + +]
Author: Thomas Weißschuh <[email protected]>
Date:   Thu Oct 12 12:23:38 2023 +0200

    HID: core: remove #ifdef CONFIG_PM from hid_driver
    
    [ Upstream commit df8b030d82dd1224881acb4e778fa06c4824f72b ]
    
    Allow HID drivers to pass ->suspend, ->resume and ->reset_resume via
    pm_ptr().
    Through the usage of pm_ptr() the CONFIG_PM-dependent code will always be
    compiled, protecting against bitrot.
    The linker will then garbage-collect the unused function avoiding any overhead.
    
    The only overhead in the final kernel image and at runtime are a few
    extra bytes in 'struct hid_driver'.
    
    The same approach is chosen by 'struct usb_driver' and other subsystems.
    
    Signed-off-by: Thomas Weißschuh <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Benjamin Tissoires <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-alps: use default remove for hid device [+ + +]
Author: Marcus Folkesson <[email protected]>
Date:   Tue Sep 29 22:34:06 2026 -0400

    HID: hid-alps: use default remove for hid device
    
    [ Upstream commit 989f7cc94f1174269282a4a46bb735c7f11527de ]
    
    hid_device_remove() will call hid_hw_stop() as default .remove function
    if no function is specified.
    
    Signed-off-by: Marcus Folkesson <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Stable-dep-of: aa9dde93e05a ("HID: alps: unregister DualPoint Stick input device on remove")
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-alps: Use pm_ptr instead of #ifdef CONFIG_PM [+ + +]
Author: Bastien Nocera <[email protected]>
Date:   Tue Sep 29 22:34:07 2026 -0400

    HID: hid-alps: Use pm_ptr instead of #ifdef CONFIG_PM
    
    [ Upstream commit 5e130f58629a2819c9d053507ad368160d25eb65 ]
    
    This increases build coverage and allows to drop an #ifdef.
    
    Signed-off-by: Bastien Nocera <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Stable-dep-of: aa9dde93e05a ("HID: alps: unregister DualPoint Stick input device on remove")
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-steam: Fix cleanup in probe() [+ + +]
Author: Dan Carpenter <[email protected]>
Date:   Tue Oct 13 09:12:08 2026 +0000

    HID: hid-steam: Fix cleanup in probe()
    
    [ Upstream commit a9f1da09c69f13ef471db8b22107a28042d230ca ]
    
    There are a number of issues in this code.  First of all if
    steam_create_client_hid() fails then it leads to an error pointer
    dereference when we call hid_destroy_device(steam->client_hdev).
    
    Also there are a number of leaks.  hid_hw_stop() is not called if
    hid_hw_open() fails for example.  And it doesn't call steam_unregister()
    or hid_hw_close().
    
    Fixes: 691ead124a0c ("HID: hid-steam: Clean up locking")
    Signed-off-by: Dan Carpenter <[email protected]>
    Reviewed-by: Vicki Pfau <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Benjamin Tissoires <[email protected]>
    [Lee: Move client_hdev creation after steam_register() and omit
          mode_switch and rumble_work cancellation as 691ead124a0c and
          e133dc99fc07 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-steam: Make client_opened a counter [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:09 2026 +0000

    HID: hid-steam: Make client_opened a counter
    
    [ Upstream commit 555b818adb97eca70210a49ba3f1d27882dde092 ]
    
    The client_opened variable was used to track if the hidraw was opened by any
    clients to silence keyboard/mouse events while opened. However, there was no
    counting of how many clients were opened, so opening two at the same time and
    then closing one would fool the driver into thinking it had no remaining opened
    clients.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Adapt steam_client_ll_open() and steam_client_ll_close() as
          691ead124a0c and e1147961b214 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: sony: fix UAF of ghl_poke_timer / ghl_urb at driver unbind [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Mon Sep 7 16:00:32 2026 -0400

    HID: sony: fix UAF of ghl_poke_timer / ghl_urb at driver unbind
    
    [ Upstream commit a26705bd2e2728833e7a538ce91e58a5eeff496a ]
    
    For GHL (Guitar Hero Live) dongles, sony_probe() arms a periodic timer:
    ghl_magic_poke() (the timer callback) submits sc->ghl_urb, and the URB
    completion ghl_magic_poke_cb() re-arms the timer with mod_timer().
    
    sony_remove() drained the timer with timer_delete_sync() and then freed
    the URB with usb_free_urb():
    
            timer_delete_sync(&sc->ghl_poke_timer);
            usb_free_urb(sc->ghl_urb);
    
    timer_delete_sync() does not block re-arming, and while the URB is in
    flight the timer is not pending, so the sync delete is a no-op. A URB
    completion that runs after the delete re-arms the timer, and usb_free_urb()
    only drops a reference -- it does not kill an in-flight URB. sc is
    allocated with devm_kzalloc() and freed once sony_remove() returns, so the
    re-armed ghl_poke_timer (embedded in sc) then fires on freed memory, a
    use-after-free from timer softirq. This is a disconnect/rmmod race.
    
    Poison the URB first, then shut the timer down, before freeing the URB.
    usb_poison_urb() kills any in-flight URB and permanently rejects further
    submissions, so a poke timer that is still pending cannot re-submit the
    URB from ghl_magic_poke() in the window before timer_shutdown_sync() runs.
    usb_kill_urb() would not suffice: it only cancels the in-flight URB and
    leaves it submittable once it returns, so the pending timer could
    re-submit it and put a fresh URB in flight over the freed sc.
    timer_shutdown_sync() then drains any last callback and blocks re-arming.
    The probe error path is unaffected: it is only reached before the timer
    is armed.
    
    Reproduced under KASAN on next-20260710 via dummy_hcd + raw-gadget
    emulation of the GHL PS4 dongle (VID 0x1430 / PID 0x07bb): hid-sony binds
    and arms the poke timer, the poke URB is held in flight, the driver is
    unbound (freeing sc), then the URB is released. The completion re-arms the
    timer on the freed sc, and the re-armed timer fires ~8 s later:
    
      BUG: KASAN: slab-use-after-free in ghl_magic_poke+0x98/0xb0
      Read of size 8 at addr ffff88810b02fd50 by task swapper/0/0
       ghl_magic_poke+0x98/0xb0
       call_timer_fn+0x35/0x2b0
       __run_timers+0x69c/0x9a0
       run_timer_softirq+0x173/0x2a0
      Allocated by task 169:  sony_probe
      Freed by task 338:      devres_release_group <- hid_device_remove (sony_remove)
    
    Found by 0sec (https://0sec.ai) using automated source analysis.
    
    Fixes: cc894ac55360 ("HID: sony: support for ghlive ps3/wii u dongles")
    Cc: [email protected]
    Assisted-by: 0sec:multi-model
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [ changed the old del_timer_sync() call to timer_shutdown_sync() ]
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Clean up locking [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:13 2026 +0000

    HID: steam: Clean up locking
    
    [ Upstream commit de1d341b9b3ec9655f31fb8b44f784cca5e670ad ]
    
    This cleans up several issues with locking behavior, including RCU accesses
    not being guarded behind a lock.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Use explicit lock/unlock calls instead of guard(), adapt to
          steam->mutex, and omit Steam Deck sensors, mode_switch,
          rumble_work, coalesce_rumble_work and Ibex changes as
          691ead124a0c, e133dc99fc07, a0fbd9437d7d, 1d4549fd1115,
          fcfa7db89f7a and 0a80b4e8ec6a are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Fully unregister controller when hidraw is opened [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:10 2026 +0000

    HID: steam: Fully unregister controller when hidraw is opened
    
    [ Upstream commit cd33a91d37eb4d7c6ce56aa7f4688066309808eb ]
    
    To avoid conflicts between anything touching the hidraw and the driver we
    had previously detached the evdev nodes when the hidraw is opened. However,
    this isn't sufficient to avoid FEATURE reports from conflicting, so we
    change to fully unregistering the controller internally, leaving only the
    hidraw active until it's closed.
    
    This also unifies the unregister and connect callbacks, as now the logic
    between these two callbacks is identical.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Convert steam_client_ll_open() and steam_client_ll_close() to
          schedule work_connect directly and omit sensors, rumble_work,
          mode_switch and unregister_work changes as e133dc99fc07,
          e1147961b214 and 1d4549fd1115 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Rearrange teardown sequence [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:11 2026 +0000

    HID: steam: Rearrange teardown sequence
    
    [ Upstream commit ddce9641ce924ed91ec8304577e463823a29ffaf ]
    
    This fixes a narrow window during the teardown sequence where callbacks
    could still be scheduled during cleanup that would then have a dangling
    pointer to the now-freed steam struct.
    
    This also puts work canceling for rumble and mode switch in
    steam_unregister, as that shouldn't persist while the client hdev is open.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Omit rumble_work, coalesce_rumble_work and mode_switch
          cancellation as e133dc99fc07 and 1d4549fd1115 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Refactor registration [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:12 2026 +0000

    HID: steam: Refactor registration
    
    [ Upstream commit 6f9b740c31ba7e061b2ebb330d9a3d63f1358f29 ]
    
    This refactors and simplifies the registration/unregistration flow. Since
    we now only perform registration when the client isn't opened anymore, the
    logic for handling that can be removed, and the rest of the function
    streamlined.
    
    We also remove the previous assumption that we have a serial number to show
    we're registered, replacing it with a single purpose boolean.
    
    In a previous refactor the code for unregistering a battery if later
    registration steps failed was accidentally left out. As a result, a
    lingering power_supply object could get left over after the steam object
    was torn down. This is also fixed here.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Omit sensors, steam_get_attributes(), rumble_work,
          coalesce_rumble_work and mode_switch changes as e133dc99fc07,
          a0fbd9437d7d and 1d4549fd1115 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: uhid: convert to hid_safe_input_report() [+ + +]
Author: Carlos Llamas <[email protected]>
Date:   Sun Oct 11 10:39:10 2026 +0000

    HID: uhid: convert to hid_safe_input_report()
    
    [ Upstream commit 63a694c51bf120a37550890b8e7736b4888985e9 ]
    
    Commit 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing
    bogus memset()"), added a check in hid_report_raw_event() to reject
    reports if the received data size is smaller than expected. This was
    intended to prevent OOB errors by no longer allowing zeroing-out of
    shorter reports due to the lack of buffer size information.
    
    However, this leads to regressions in hid_report_raw_event(), where
    shorter than expected reports are rejected, even though their buffers
    are sufficiently large to be zero-padded.
    
    To solve this issue, Benjamin introduced a safer alternative in commit
    206342541fc8 ("HID: core: introduce hid_safe_input_report()"), which
    forwards the buffer size and allows hid_report_raw_event() to safely
    zero-pad the data.
    
    Convert uhid to use hid_safe_input_report() and pass UHID_DATA_MAX as
    the buffer size. This prevents the reported regressions [1], allowing
    hid core to zero-pad the shorter reports safely as expected.
    
    Cc: [email protected]
    Fixes: 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing bogus memset()")
    Closes: https://lore.kernel.org/all/[email protected]/ [1]
    Signed-off-by: Carlos Llamas <[email protected]>
    Reviewed-by: Lee Jones <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
hsr: Remove WARN_ONCE() in hsr_addr_is_self(). [+ + +]
Author: Kuniyuki Iwashima <[email protected]>
Date:   Sat May 30 06:42:58 2026 +0000

    hsr: Remove WARN_ONCE() in hsr_addr_is_self().
    
    [ Upstream commit afd0f17ca46258cec3a5cc48b8df9327fe772490 ]
    
    syzbot reported the warning [0] in hsr_addr_is_self(),
    whose assumption is simply wrong.
    
    hsr->self_node is cleared in hsr_del_self_node(), which
    is called from hsr_dellink().
    
    Since dev->rtnl_link_ops->dellink() is called before
    unregister_netdevice_many(), there is a window when
    user can find the device but without hsr->self_node.
    
    Let's remove WARN_ONCE() in hsr_addr_is_self().
    
    [0]:
    HSR: No self node
    WARNING: net/hsr/hsr_framereg.c:39 at hsr_addr_is_self+0x211/0x3f0 net/hsr/hsr_framereg.c:39, CPU#0: syz.4.16848/17220
    Modules linked in:
    CPU: 0 UID: 0 PID: 17220 Comm: syz.4.16848 Tainted: G             L      syzkaller #0 PREEMPT_{RT,(full)}
    Tainted: [L]=SOFTLOCKUP
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/18/2026
    RIP: 0010:hsr_addr_is_self+0x211/0x3f0 net/hsr/hsr_framereg.c:39
    Code: 33 2f 41 0f b7 dd 89 ee 09 de 31 ff e8 c8 b4 c6 f6 09 dd 74 54 e8 0f b0 c6 f6 31 ed eb 53 e8 06 b0 c6 f6 48 8d 3d 2f 50 9c 04 <67> 48 0f b9 3a 31 ed eb 42 e8 c1 13 1f 00 89 c5 31 ff 89 c6 e8 96
    RSP: 0018:ffffc900041c70e0 EFLAGS: 00010283
    RAX: ffffffff8afdc6ca RBX: ffffffff8afdc4e6 RCX: 0000000000080000
    RDX: ffffc90010493000 RSI: 0000000000000948 RDI: ffffffff8f9a1700
    RBP: 0000000000000001 R08: 0000000000000000 R09: 0000000000000000
    R10: ffffc900041c71e8 R11: fffff52000838e3f R12: dffffc0000000000
    R13: ffff888041f9e3c0 R14: ffff888086ee3802 R15: 0000000000000000
    FS:  00007f6fe985d6c0(0000) GS:ffff888126176000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f80bd437dac CR3: 0000000025096000 CR4: 00000000003526f0
    DR0: ffffffffffffffff DR1: 00000000000001f8 DR2: 0000000000000002
    DR3: ffffffffefffff15 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Call Trace:
     <TASK>
     check_local_dest net/hsr/hsr_forward.c:592 [inline]
     fill_frame_info net/hsr/hsr_forward.c:728 [inline]
     hsr_forward_skb+0xa11/0x2a80 net/hsr/hsr_forward.c:739
     hsr_dev_xmit+0x253/0x370 net/hsr/hsr_device.c:236
     __netdev_start_xmit include/linux/netdevice.h:5368 [inline]
     netdev_start_xmit include/linux/netdevice.h:5377 [inline]
     xmit_one net/core/dev.c:3888 [inline]
     dev_hard_start_xmit+0x2df/0x860 net/core/dev.c:3904
     __dev_queue_xmit+0x1428/0x3900 net/core/dev.c:4870
     neigh_output include/net/neighbour.h:556 [inline]
     ip_finish_output2+0xcec/0x10b0 net/ipv4/ip_output.c:237
     ip_send_skb net/ipv4/ip_output.c:1510 [inline]
     ip_push_pending_frames+0x8b/0x110 net/ipv4/ip_output.c:1530
     raw_sendmsg+0x1547/0x1a50 net/ipv4/raw.c:659
     sock_sendmsg_nosec net/socket.c:787 [inline]
     __sock_sendmsg net/socket.c:802 [inline]
     ____sys_sendmsg+0x7da/0x9c0 net/socket.c:2698
     ___sys_sendmsg+0x2a5/0x360 net/socket.c:2752
     __sys_sendmsg net/socket.c:2784 [inline]
     __do_sys_sendmsg net/socket.c:2789 [inline]
     __se_sys_sendmsg net/socket.c:2787 [inline]
     __x64_sys_sendmsg+0x1c3/0x2a0 net/socket.c:2787
     do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
     do_syscall_64+0x15f/0xf80 arch/x86/entry/syscall_64.c:94
     entry_SYSCALL_64_after_hwframe+0x77/0x7f
    RIP: 0033:0x7f6feb62ce59
    Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 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 e8 ff ff ff f7 d8 64 89 01 48
    RSP: 002b:00007f6fe985d028 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007f6feb8a6090 RCX: 00007f6feb62ce59
    RDX: 0000000000000000 RSI: 0000200000000000 RDI: 0000000000000004
    RBP: 00007f6feb6c2d6f R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007f6feb8a6128 R14: 00007f6feb8a6090 R15: 00007ffcf01cc488
     </TASK>
    
    Fixes: f266a683a480 ("net/hsr: Better frame dispatch")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/netdev/[email protected]/
    Signed-off-by: Kuniyuki Iwashima <[email protected]>
    Reviewed-by: Fernando Fernandez Mancera <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
hwmon: (drivetemp) Fix driver producing garbage data when SCSI errors occur [+ + +]
Author: Daniil Stas <[email protected]>
Date:   Fri Oct 23 13:38:19 2026 +0900

    hwmon: (drivetemp) Fix driver producing garbage data when SCSI errors occur
    
    commit 82163d63ae7a4c36142cd252388737205bb7e4b9 upstream.
    
    scsi_execute_cmd() function can return both negative (linux codes) and
    positive (scsi_cmnd result field) error codes.
    
    Currently the driver just passes error codes of scsi_execute_cmd() to
    hwmon core, which is incorrect because hwmon only checks for negative
    error codes. This leads to hwmon reporting uninitialized data to
    userspace in case of SCSI errors (for example if the disk drive was
    disconnected).
    
    This patch checks scsi_execute_cmd() output and returns -EIO if it's
    error code is positive.
    
    Fixes: 5b46903d8bf37 ("hwmon: Driver for disk and solid state drives with temperature sensors")
    Signed-off-by: Daniil Stas <[email protected]>
    Cc: Guenter Roeck <[email protected]>
    Cc: Chris Healy <[email protected]>
    Cc: Linus Walleij <[email protected]>
    Cc: Martin K. Petersen <[email protected]>
    Cc: Bart Van Assche <[email protected]>
    Cc: [email protected]
    Cc: [email protected]
    Cc: [email protected]
    Cc: [email protected]
    Link: https://lore.kernel.org/r/[email protected]
    [groeck: Avoid inline variable declaration for portability]
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

hwmon: (pwm-fan) Stop RPM timer before freeing tach data [+ + +]
Author: Yibo Tan <[email protected]>
Date:   Tue Sep 22 15:43:46 2026 -0400

    hwmon: (pwm-fan) Stop RPM timer before freeing tach data
    
    [ Upstream commit 26d5ff79768548efb1e604bb6e8697c101e06269 ]
    
    sample_timer() rearms the RPM timer and accesses the devm-managed
    ctx->tachs and ctx->pulses_per_revolution arrays. The cleanup action
    which stops the timer is registered before those arrays are allocated.
    
    Since devres releases entries in reverse order, driver detach can free
    the arrays before pwm_fan_cleanup() shuts down the timer. A timer expiry
    in that window accesses the freed tach data.
    
    With a KASAN kernel, a test-only kprobe delayed entry to
    pwm_fan_cleanup() while normal sysfs unbind ran. Each of three runs
    reported three four-byte reads and two four-byte writes in sample_timer()
    after its backing devm allocations had been freed. The helper did not
    invoke the timer callback, cleanup actions or free functions.
    
    With the fix, three matching unbind runs completed without KASAN, BUG,
    WARNING, Oops or panic. Instrumentation confirmed that timer retirement
    completed before the first timer backing allocation was released.
    
    Split timer retirement from the power cleanup and register its devres
    action after the timer backing data and IRQ actions are installed. This
    preserves the early power rollback action while ensuring the timer is
    retired before its backing data is released. Use timer_shutdown_sync()
    because the callback can rearm itself.
    
    Fixes: 01695410d452 ("hwmon: (pwm-fan) Store tach data separately")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Yibo Tan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Guenter Roeck <[email protected]>
    [ adapted cleanup changes to the older pwm_fan_pwm_disable() and pwm_fan_shutdown() implementations. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
hwrng: stm32 - Fix runtime PM cleanup on registration failure [+ + +]
Author: Can Peng <[email protected]>
Date:   Wed Sep 9 16:04:21 2026 -0400

    hwrng: stm32 - Fix runtime PM cleanup on registration failure
    
    [ Upstream commit 1163a476a568f6c0f852d469c8e4c5a5f805adac ]
    
    stm32_rng_probe() enables autosuspend and runtime PM before registering the
    hwrng. If devm_hwrng_register() fails, probe returns with runtime PM left
    enabled and autosuspend still selected.
    
    The remove callback also only disables runtime PM and does not undo
    pm_runtime_use_autosuspend().
    
    Use devm_pm_runtime_enable() so runtime PM is unwound automatically on
    probe failure and driver detach. Since the managed cleanup also disables
    runtime PM,drop the remove callback.
    
    Fixes: c6a97c42e399 ("hwrng: stm32 - add support for STM32 HW RNG")
    Cc: [email protected]
    Signed-off-by: Can Peng <[email protected]>
    Reviewed-by: Linus Walleij <[email protected]>
    Signed-off-by: Herbert Xu <[email protected]>
    [ adapted to the older driver’s relocated int-returning remove callback and existing err variable. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
i2c: at91: release DMA channels when probe defers [+ + +]
Author: Hongjian Dai <[email protected]>
Date:   Wed Sep 30 00:43:40 2026 +0800

    i2c: at91: release DMA channels when probe defers
    
    [ Upstream commit c98bf3b86609a18ab16d067280257326e557c636 ]
    
    at91_twi_probe_master() can return -EPROBE_DEFER from
    at91_init_twi_recovery_info() after at91_twi_configure_dma() has already
    claimed the tx/rx DMA channels. at91_twi_probe() then returns without
    releasing them, and since dma_request_chan() is not devres-managed the
    channels leak on every deferred probe attempt.
    
    Release the channels before deferring the probe.
    
    Fixes: f7eeb1af8537 ("i2c: at91: release DMA channels on remove and probe error")
    Assisted-by: LLM
    Signed-off-by: Hongjian Dai <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/7D85C6CB6BF0A82E+20260929164340.41628-1-daihongjian@kylinsec.com.cn
    Signed-off-by: Sasha Levin <[email protected]>

i2c: core: Introduce i2c_client_get_device_id helper function [+ + +]
Author: Angel Iglesias <[email protected]>
Date:   Wed Sep 9 07:21:26 2026 -0400

    i2c: core: Introduce i2c_client_get_device_id helper function
    
    [ Upstream commit 662233731d66cf41e7494e532e702849c8ce18f3 ]
    
    Introduces new helper function to aid in .probe_new() refactors. In order
    to use existing i2c_get_device_id() on the probe callback, the device
    match table needs to be accessible in that function, which would require
    bigger refactors in some drivers using the deprecated .probe callback.
    
    This issue was discussed in more detail in the IIO mailing list.
    
    Link: https://lore.kernel.org/all/[email protected]/
    Suggested-by: Nuno Sá <[email protected]>
    Suggested-by: Andy Shevchenko <[email protected]>
    Suggested-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Angel Iglesias <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Wolfram Sang <[email protected]>
    Stable-dep-of: 4e4b9f5ce9df ("power: supply: max17040: drop incorrect I2C functionality check")
    Signed-off-by: Sasha Levin <[email protected]>

i2c: mxs: fix DMA channel leak on probe error [+ + +]
Author: Ruoyu Wang <[email protected]>
Date:   Wed Sep 9 06:57:21 2026 -0400

    i2c: mxs: fix DMA channel leak on probe error
    
    [ Upstream commit 777979e627115734052b323d2721cdb500e81dcf ]
    
    mxs_i2c_probe() requests an exclusive DMA channel before resetting the
    controller and registering the I2C adapter. If either later operation
    fails, probe returns without releasing the channel because the remove
    callback is not invoked after a failed probe.
    
    Use devm_dma_request_chan() so the device core releases the channel on
    probe failure and driver detach. Remove the manual release from the
    remove callback because the channel is now device-managed.
    
    This issue was found by a static analysis checker and confirmed by
    manual source review.
    
    Fixes: 62885f59a261 ("MXS: Implement DMA support into mxs-i2c")
    Assisted-by: unnamed:claude-opus-4.8 typestate
    Signed-off-by: Ruoyu Wang <[email protected]>
    Cc: <[email protected]> # v3.7+
    Reviewed-by: Frank Li <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

i2c: qcom-cci: Fix HALT_ACK reset request being dropped [+ + +]
Author: Loic Poulain <[email protected]>
Date:   Mon Oct 12 14:54:56 2026 +0200

    i2c: qcom-cci: Fix HALT_ACK reset request being dropped
    
    commit 195f3d74b5de98969dc4fad956393bb00787efd1 upstream.
    
    A HALT_ACK interrupt indicates that the corresponding I2C master has
    entered the halted state and must be reset before further operation.
    
    The M0 and M1 HALT_ACK status bits may be asserted simultaneously in a
    single interrupt. However, the interrupt handler currently overwrites
    the reset mask when processing each HALT_ACK condition, causing the
    first reset request to be lost if both events are reported together.
    
    Accumulate reset requests instead of overwriting them so that both
    masters are properly reset when M0 and M1 HALT_ACK events occur in the
    same interrupt.
    
    Fixes: e517526195de4 ("i2c: Add Qualcomm CCI I2C driver")
    Signed-off-by: Loic Poulain <[email protected]>
    Cc: <[email protected]> # v5.8+
    Reviewed-by: Konrad Dybcio <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

i2c: viai2c-wmt: Fix clock leak in wmt_i2c_probe() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Oct 22 08:54:45 2026 -0400

    i2c: viai2c-wmt: Fix clock leak in wmt_i2c_probe()
    
    [ Upstream commit aaabefc79b0ff0018e8e3832169bbe359d0551fc ]
    
    In wmt_i2c_probe(), i2c->clk is acquired using of_clk_get(). If any
    subsequent operation fails or when the module is unloaded, the clock
    reference count is never decremented via clk_put(), leading to a
    resource leak.
    
    Switch to devm_clk_get() so that the clock is automatically managed
    and released.
    
    Fixes: 560746eb79d3 ("i2c: vt8500: Add support for I2C bus on Wondermedia SoCs")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ sashal: adapted the clock assignment to use i2c_dev instead of i2c ]
    Signed-off-by: Sasha Levin <[email protected]>

 
i3c: master: Do not treat master device as a duplicate target [+ + +]
Author: Adrian Hunter <[email protected]>
Date:   Wed Sep 9 21:24:01 2026 -0400

    i3c: master: Do not treat master device as a duplicate target
    
    [ Upstream commit 4dc1b3eeba7991905a5b5b8129ebea51be7d87b7 ]
    
    i3c_master_search_i3c_dev_duplicate() searches the bus for another I3C
    device with the same PID as the reference device.  The search can match
    master->this, causing the controller itself to be returned as a
    duplicate.
    
    Since the controller is not a target device, it cannot be a duplicate of
    one.  Exclude master->this from matching so that the function only
    returns real duplicate target devices.
    
    Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
    Cc: [email protected]
    Signed-off-by: Adrian Hunter <[email protected]>
    Reviewed-by: Frank Li <[email protected]>
    Acked-by: Mukesh Savaliya <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Alexandre Belloni <[email protected]>
    [ adjusted the duplicate-device comparison to match the older branch’s PID handling without nonzero-PID checks. ]
    Signed-off-by: Sasha Levin <[email protected]>

i3c: master: Fix use-after-free of master->this [+ + +]
Author: Adrian Hunter <[email protected]>
Date:   Wed Sep 9 21:26:12 2026 -0400

    i3c: master: Fix use-after-free of master->this
    
    [ Upstream commit feb0ed76601f3c2f91f08688c5a7d8b9d382f720 ]
    
    sysfs attribute callbacks for the master controller device dereference
    master->this.  However, master->this is freed in
    i3c_master_detach_free_devs() before the master device itself is
    released.
    
    As a result, sysfs accesses can dereference a freed master->this
    pointer, leading to a use-after-free.
    
    Keep master->this alive until i3c_masterdev_release(), which is called
    after the master device and its sysfs state are being torn down. Do not
    free master->this as part of the normal device detach path.
    
    On the error path in i3c_master_set_info(), reset master->this and
    bus.cur_master to NULL before freeing the allocated device.
    
    Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
    Cc: [email protected]
    Signed-off-by: Adrian Hunter <[email protected]>
    Reviewed-by: Frank Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Alexandre Belloni <[email protected]>
    [ retained of_node_put(dev->of_node) instead of upstream’s fwnode_handle_put(dev->fwnode). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ibmveth: h_free logical LAN on open-fail after register [+ + +]
Author: Mingming Cao <[email protected]>
Date:   Fri Sep 25 11:05:29 2026 -0700

    ibmveth: h_free logical LAN on open-fail after register
    
    commit af0524bf4ce1a4cbd2946aa81751582951cfcab5 upstream.
    
    ibmveth_open() registers the logical LAN, then allocates the RX
    buffer pools. A pool failure jumps to out_free_buffer_pools without
    h_free_logical_lan(), so PHYP still owns the buffer-list page when
    it is unmapped. request_irq() failure already issued the hypercall
    before taking the same label.
    
    Move that h_free to the shared post-register unwind so both paths
    deregister before the buffer list is unmapped.
    
    Fixes: d43732ce021f ("ibmveth: properly unwind on init errors")
    Cc: [email protected]
    Signed-off-by: Mingming Cao <[email protected]>
    Reviewed-by: Dave Marquardt <[email protected]>
    Link: https://patch.msgid.link/7a56fbfb9e0674f011f4e310fbd7dfd8e67c30aa.1790357373.git.mmc@linux.ibm.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
iio: accel: kxcjk-1013: reject duplicate event disable [+ + +]
Author: Jiale Yao <[email protected]>
Date:   Fri Sep 25 22:09:43 2026 +0800

    iio: accel: kxcjk-1013: reject duplicate event disable
    
    commit dd30c10ff60d2b30386c23bb7c61cc97f2385c97 upstream.
    
    The IIO core does not filter duplicate writes to the event enable
    attribute. kxcjk1013_write_event_config() already ignores repeated
    enable requests, but a repeated disable request still calls
    kxcjk1013_set_power_state(data, false), dropping a runtime PM reference
    that was not acquired for this request. This can underflow the runtime
    PM usage count and trigger a "Runtime PM usage count underflow" warning.
    
    Return early when the requested state already matches ev_enable_state.
    
    Fixes: b4b491c0832e ("iio: accel: kxcjk-1013: Support thresholds")
    Signed-off-by: Jiale Yao <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: accel: sca3000: fix frequency divider condition check [+ + +]
Author: Salah Triki <[email protected]>
Date:   Wed Aug 19 12:41:01 2026 +0100

    iio: accel: sca3000: fix frequency divider condition check
    
    commit d380bf5f94a892e546d9a94e8557ad866b043a2a upstream.
    
    When setting the sampling frequency, the check for `base_freq / 2` is
    followed by an independent `if` statement for `base_freq / 4`. If `val`
    equals `base_freq / 2`, the second check fails and falls through to the
    `else if (val != base_freq)` branch, returning `-EINVAL` erroneously.
    
    Fix this by chaining the checks with `else if`.
    
    Fixes: e0f3fc9b47e6 ("iio: accel: sca3000_core: implemented IIO_CHAN_INFO_SAMP_FREQ")
    Signed-off-by: Salah Triki <[email protected]>
    Reviewed-by: Joshua Crofts <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: adc: aspeed: propagate reset deassert errors [+ + +]
Author: Pengpeng Hou <[email protected]>
Date:   Wed Oct 7 03:45:03 2026 -0400

    iio: adc: aspeed: propagate reset deassert errors
    
    [ Upstream commit 95e4eb426b4bd666fa2f37886c0ddf74a0cc6167 ]
    
    aspeed_adc_probe() continues to register ADC resources after deasserting
    the shared reset, even if the reset controller reports a failure.
    
    A failed deassertion leaves the hardware unavailable, so stop probing
    before installing the cleanup action and enabling the ADC.
    
    Fixes: edf7550a1f93 ("iio: adc: aspeed: Deassert reset in probe")
    Signed-off-by: Pengpeng Hou <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    [ sashal: Replaced `return ret` with `goto reset_error` to accommodate manual clock cleanup. ]
    Signed-off-by: Sasha Levin <[email protected]>

iio: adc: max1363: sign-extend bipolar differential channel reads [+ + +]
Author: Cong Nguyen <[email protected]>
Date:   Wed Oct 7 04:38:53 2026 -0400

    iio: adc: max1363: sign-extend bipolar differential channel reads
    
    [ Upstream commit 91908c0a78baddc8572aa3ab69e62ee2eb496ba4 ]
    
    MAX1363 differential channels are bipolar, but max1363_read_single_chan()
    masks the raw value to the ADC resolution without sign-extending it.
    Negative differential readings are therefore reported to userspace as
    large positive values (e.g. -1 as 4095 on a 12-bit part).
    
    Sign-extend the masked value from the resolution bit for differential
    channels. Single-ended channels are unipolar and are left unchanged.
    
    Fixes: d1325cf45077 ("Staging: IIO: max1363 ADC driver")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-4
    Signed-off-by: Cong Nguyen <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

iio: adc: sun4i-gpadc-iio: clean up on thermal zone registration failure [+ + +]
Author: Felix Gu <[email protected]>
Date:   Sun Sep 6 23:58:35 2026 +0800

    iio: adc: sun4i-gpadc-iio: clean up on thermal zone registration failure
    
    commit 2cdc7ef31827db4fbc6283750420639569e1f0e9 upstream.
    
    If devm_thermal_of_zone_register() fails, probe returns without
    unregistering the IIO map array or disabling runtime PM.
    
    Jump to err_map to release them.
    
    Fixes: b0a242894f11 ("iio: adc: sun4i-gpadc-iio: register in the thermal after registering in pm")
    Signed-off-by: Felix Gu <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: adc: sun4i-gpadc-iio: drop underflowing pm_runtime_put() calls [+ + +]
Author: Felix Gu <[email protected]>
Date:   Sun Sep 6 23:58:34 2026 +0800

    iio: adc: sun4i-gpadc-iio: drop underflowing pm_runtime_put() calls
    
    commit 8b958dd214ad0c003f56549e9e039cb8067dc1a2 upstream.
    
    Neither the error path in sun4i_gpadc_probe() nor sun4i_gpadc_remove()
    ever holds a runtime PM usage count. So the pm_runtime_put() in both
    places always triggers the "Runtime PM usage count underflow!" warning
    on every failed probe and every unbind.
    
    Drop both calls.
    
    Fixes: d1caa9905538 ("iio: adc: add support for Allwinner SoCs ADC")
    Signed-off-by: Felix Gu <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: buffer: serialize buffer teardown with mode claims [+ + +]
Author: Jinseob Kim <[email protected]>
Date:   Tue Oct 6 19:25:14 2026 +0900

    iio: buffer: serialize buffer teardown with mode claims
    
    commit 84bb0fc46ccf6a545b8fdf57cda83770186ed8dd upstream.
    
    Buffer-mode claims hold mlock to guarantee that the device remains in
    buffer mode until the claim is released. Normal buffer updates take
    info_exist_lock followed by mlock in iio_update_buffers().
    
    However, iio_device_unregister() disables and deactivates all buffers
    without taking mlock. This can invalidate buffer state, including
    active_scan_mask, while a buffer-mode claim is held.
    
    Take mlock in iio_disable_all_buffers() so that unregister honors the
    mode-claim lifetime guarantee. The info_exist_lock -> mlock ordering
    matches iio_update_buffers().
    
    Fixes: 0a8565425afd ("iio: core: introduce iio_device_{claim|release}_buffer_mode() APIs")
    Suggested-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Jinseob Kim <[email protected]>
    Reviewed-by: Joshua Crofts <[email protected]>
    Reviewed-by: Nuno Sá <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    
    [ Backport by Jinseob Kim to 5.15.y: mlock is still in struct iio_dev,
      so use indio_dev->mlock instead of iio_dev_opaque->mlock. ]
    
    Signed-off-by: Jinseob Kim <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

iio: gyro: adis16136: fix unprotected debugfs reads [+ + +]
Author: Arka Mondal <[email protected]>
Date:   Sun Aug 16 03:27:26 2026 +0900

    iio: gyro: adis16136: fix unprotected debugfs reads
    
    commit 2b498df75d6c29aa3e760127ae0f0003df598b53 upstream.
    
    The serial_number file operations are open coded and never call
    debugfs_file_get(), which debugfs_create_file_unsafe() requires.
    debugfs_remove_recursive() therefore does not wait for a read in
    progress, and unbind frees the iio_dev underneath it.
    
    Use debugfs_create_file() instead.
    
    Fixes: 9aaea09b4cbd ("gyro:adis16136: fix debugfs_simple_attr.cocci warnings")
    Signed-off-by: Arka Mondal <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: imu: adis16400: fix unprotected debugfs reads [+ + +]
Author: Arka Mondal <[email protected]>
Date:   Sun Aug 16 03:27:25 2026 +0900

    iio: imu: adis16400: fix unprotected debugfs reads
    
    commit d94787287a113a1326211647d5e0deed1e9de105 upstream.
    
    adis16400_serial_number_fops is open coded and never calls
    debugfs_file_get(), so debugfs_remove_recursive() does not wait for a
    read in progress and unbind frees the iio_dev underneath it.
    
    Commit ae1d37a9bb4b ("iio: imu: adis16400: use DEFINE_DEBUGFS_ATTRIBUTE
    instead of DEFINE_SIMPLE_ATTRIBUTE") converted product_id and
    flash_count to DEFINE_DEBUGFS_ATTRIBUTE, which protects itself, but
    moved all three files to debugfs_create_file_unsafe().
    
    serial_number prints three registers as "%.4x-%.4x-%.4x" and
    DEFINE_DEBUGFS_ATTRIBUTE() formats a single u64, so it cannot be
    converted without changing what the file returns. adis16475 and
    adis16550 already use debugfs_create_file() for their open coded
    files. Use it here too.
    
    Fixes: ae1d37a9bb4b ("iio: imu: adis16400: use DEFINE_DEBUGFS_ATTRIBUTE instead of DEFINE_SIMPLE_ATTRIBUTE")
    Signed-off-by: Arka Mondal <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: imu: adis16480: fix unprotected debugfs reads [+ + +]
Author: Arka Mondal <[email protected]>
Date:   Sun Aug 16 03:27:24 2026 +0900

    iio: imu: adis16480: fix unprotected debugfs reads
    
    commit e1dea54496f90a62318cf4eeaa1e9ef8316e92b6 upstream.
    
    The firmware_revision and firmware_date file operations are open coded
    and never call debugfs_file_get(), which debugfs_create_file_unsafe()
    requires. debugfs_remove_recursive() therefore does not wait for a read
    in progress, and unbind frees the iio_dev underneath it.
    
    Use debugfs_create_file() instead.
    
    Fixes: 9bf94f836e32 ("imu:adis16480: fix debugfs_simple_attr.cocci warnings")
    Signed-off-by: Arka Mondal <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: light: gp2ap020a00f: drain irq_work after free_irq [+ + +]
Author: Fan Wu <[email protected]>
Date:   Thu Aug 6 13:29:23 2026 +0000

    iio: light: gp2ap020a00f: drain irq_work after free_irq
    
    commit 63213927b141085b6c8719b8037dab3074b7e0fe upstream.
    
    The threaded IRQ handler queues data->work through irq_work_queue() so
    the trigger is polled from a per-CPU context.  free_irq() does not flush
    an irq_work the handler already queued, so after gp2ap020a00f_remove()
    returns that work may still run and call iio_trigger_poll() on data->trig,
    which the devm cleanup has already freed, causing a use-after-free.
    
    Add irq_work_sync(&data->work) after free_irq() in remove() and in the
    probe error path, mirroring commit 78601726d4a5 ("iio: trigger: sysfs:
    fix use-after-free on remove").
    
    Found by an in-house static analysis tool, confirmed by manual review.
    
    Fixes: bf29fbeaa13d ("iio: gp2ap020a00f: Add a driver for the device")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: proximity: isl29501: Fix return type of isl29501_register_write [+ + +]
Author: Salah Triki <[email protected]>
Date:   Thu Sep 17 14:00:52 2026 +0100

    iio: proximity: isl29501: Fix return type of isl29501_register_write
    
    commit e8dd273d199f5bbe295a8e3d8b777c5505b6b2e1 upstream.
    
    isl29501_register_write() was returning a u32 instead of an int.
    Since the function returns negative error codes (such as -ERANGE or
    return values from i2c_smbus_write_byte_data()), returning an unsigned
    integer type prevents callers from correctly checking for negative error
    conditions.
    
    Fix this by changing the function return type from u32 to int.
    
    This was found through manual code review.
    
    Fixes: 1c28799257bc ("iio: light: isl29501: Add support for the ISL29501 ToF sensor.")
    Signed-off-by: Salah Triki <[email protected]>
    Reviewed-by: Joshua Crofts <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: proximity: pulsedlight: fix iio_device left registered on PM setup failure [+ + +]
Author: Cong Nguyen <[email protected]>
Date:   Fri Aug 28 17:59:09 2026 +0700

    iio: proximity: pulsedlight: fix iio_device left registered on PM setup failure
    
    commit 4daa9ca557b4b98ae1ad38a6d1deaa3e31eb8edf upstream.
    
    pm_runtime_set_active() failing in probe() jumps to error_unreg_buffer,
    which only calls iio_triggered_buffer_cleanup() -- it does not undo the
    iio_device_register() that already succeeded a few lines above. probe()
    then returns the error, the devm-managed indio_dev is freed, but the
    iio core still has it registered: the sysfs/chardev nodes stay live and
    point at freed memory.
    
    Add an error_unreg_dev label that unregisters the iio device before
    falling through to the existing buffer cleanup, mirroring the teardown
    order already used in lidar_remove().
    
    Fixes: 4ac4e086fd8c ("iio: pulsedlight-lidar-lite: add runtime PM")
    Assisted-by: Claude:claude-opus-4
    Signed-off-by: Cong Nguyen <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: proximity: vcnl3020: fix ISR bitmask check in IRQ handler [+ + +]
Author: Salah Triki <[email protected]>
Date:   Mon Aug 24 05:29:07 2026 +0100

    iio: proximity: vcnl3020: fix ISR bitmask check in IRQ handler
    
    commit 7d38af8f20239a66e90de7632a79c9425256c574 upstream.
    
    The threaded IRQ handler contained multiple issues in handling interrupt
    events and clearing status flags:
    
    1. ISR bit check: The handler incorrectly checked the Interrupt Status
       Register (VCNL_ISR) against VCNL_ICR_THRES_EN (BIT(1)), which is a
       bitmask meant for the Control Register (VCNL_PS_ICR). In VCNL_ISR,
       BIT(1) corresponds only to low-threshold interrupts. A high-threshold
       interrupt (VCNL_INT_TH_HI, BIT(0)) on its own was completely ignored and
       returned IRQ_NONE.
    
    2. Event direction & channel index: The handler unconditionally pushed a
       RISING event code on channel index 1. The driver only registers a single
       proximity channel (index 0), and low-threshold interrupts should be
       reported with IIO_EV_DIR_FALLING.
    
    3. ISR clearing: The write-back to acknowledge the interrupt only preserved
       BIT(1) instead of masking against both valid status bits.
    
    Fix this by checking both VCNL_INT_TH_HI and VCNL_INT_TH_LOW bits in
    VCNL_ISR, pushing separate IIO events with the correct direction and
    channel index (0), and properly clearing handled status bits.
    
    Fixes: 3363fbbe19e5 ("iio: proximity: vcnl3020: add periodic mode")
    Signed-off-by: Salah Triki <[email protected]>
    Reviewed-by: Ivan Mikhaylov <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: trigger: cancel reenable_work before freeing trigger [+ + +]
Author: Fan Wu <[email protected]>
Date:   Thu Aug 6 14:25:02 2026 +0000

    iio: trigger: cancel reenable_work before freeing trigger
    
    commit 2a57b9246cecd5dd797a42eb310d6c8816f26d9e upstream.
    
    iio_trigger_notify_done_atomic() defers ->reenable() into
    trig->reenable_work on the system workqueue, and the worker dereferences
    the owning trigger through container_of().  Nothing cancels this work
    before iio_trig_release() frees the trigger, so a worker armed by the
    last in-flight IRQ can outlive the free and touch freed memory.
    
    Cancel it at the top of iio_trig_release(), which every free path
    reaches through the device core's final put_device().
    
    Found by an in-house static analysis tool.
    
    Fixes: 9020ef659885 ("iio: trigger: Fix a scheduling whilst atomic issue seen on tsc2046")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Input: atkbd - skip deactivate for Lenovo IdeaPad Slim 3 15IWC11 [+ + +]
Author: Martino Papero <[email protected]>
Date:   Wed Sep 30 22:10:41 2026 +0200

    Input: atkbd - skip deactivate for Lenovo IdeaPad Slim 3 15IWC11
    
    commit 3bf8d603fd45649c106cae6290a10f20b1bbb569 upstream.
    
    The internal keyboard on the Lenovo IdeaPad Slim 3 15IWC11 (83RR)
    does not work correctly with the default i8042 settings. Using
    i8042.nopnp=1 and i8042.dumbkbd=1 restores keyboard input, but prevents
    the Caps Lock LED from working. Using i8042.nopnp=1 alone does not fix
    the keyboard.
    
    The laptop works correctly when atkbd_deactivate_fixup is used instead.
    Add a DMI quirk for the 83RR to enable it.
    
    This was tested without any i8042 command-line parameters. Keyboard
    input and the Caps Lock LED work correctly, including after suspend
    and resume and after a cold boot.
    
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Martino Papero <[email protected]>
    Reviewed-by: Hans de Goede <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: byd - synchronize timer deletion before freeing private data [+ + +]
Author: Linmao Li <[email protected]>
Date:   Mon Aug 24 11:19:12 2026 -0400

    Input: byd - synchronize timer deletion before freeing private data
    
    [ Upstream commit c83e79c0842ed29860648bcce5022ef0ba5001c6 ]
    
    byd_disconnect() uses timer_delete() before freeing the driver's private
    data.  This does not wait for a running byd_clear_touch() callback, which
    dereferences the private data and its psmouse pointer.  A callback racing
    with disconnect can therefore access the private data after it has been
    freed.  The timer can also still be re-armed by byd_process_byte() while
    the disconnect is in progress.
    
    Use timer_shutdown_sync() before freeing the private data: it waits for
    a running callback and turns any later re-arm attempt into a no-op.
    
    Fixes: 2d5f5611dd0d ("Input: byd - enable absolute mode")
    Cc: [email protected]
    Signed-off-by: Linmao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    [ changed `del_timer()` to `timer_shutdown_sync()` since 6.12 predates the `del_timer()` → `timer_delete()` rename ]
    Signed-off-by: Sasha Levin <[email protected]>

Input: exc3000 - properly stop timer on shutdown [+ + +]
Author: Dmitry Torokhov <[email protected]>
Date:   Fri Feb 3 16:43:29 2023 -0800

    Input: exc3000 - properly stop timer on shutdown
    
    [ Upstream commit 79c81d137d36f9635bbcbc3916c0cccb418a61dd ]
    
    We need to stop the timer on driver unbind or probe failures, otherwise
    we get UAF/Oops.
    
    Fixes: 7e577a17f2ee ("Input: add I2C attached EETI EXC3000 multi touch driver")
    Reported-by: "Stahl, Michael" <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Input: i8042 - add nomux quirk for Fujitsu LIFEBOOK U7410 [+ + +]
Author: Lovekesh Solanki <[email protected]>
Date:   Sun Sep 20 17:05:41 2026 +0530

    Input: i8042 - add nomux quirk for Fujitsu LIFEBOOK U7410
    
    commit 495cd7f858b45d2ffa9b685bba3a8c23c1ca4dd3 upstream.
    
    On the Fujitsu LIFEBOOK U7410 the internal keyboard and touchpad die
    shortly after boot if i8042 multiplexing controller is probed and
    switched to muxed mode. These multiplexing setup commands disturb the EC
    emulated keyboard and atkbd reports "Spurious ACK" and "Unknown key
    pressed" warnings, after which both keyboard and touchpad stop
    delivering events. Both touchpad and keyboard work in BIOS and GRUB.
    
    Disabling multiplexer using i8042.nomux=1 makes both devices work on
    warm/cold boot.
    
    Add a DMI quirk to force nomux mode for this model.
    
    Reported-by: Heiko Brey <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Lovekesh Solanki <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: s6sy761 - fix resume ordering and restore sensing [+ + +]
Author: David Heidelberg <[email protected]>
Date:   Mon Oct 5 16:54:37 2026 -0400

    Input: s6sy761 - fix resume ordering and restore sensing
    
    [ Upstream commit a215720959c5450b3699e243904b39c3f8f68888 ]
    
    System suspend powers the controller off and resume powers it back on,
    but the resume path enables the interrupt before s6sy761_power_on()
    checks the boot. The firmware raises its boot-complete event on the
    interrupt line, the threaded handler consumes it, s6sy761_power_on()
    then reads an empty event and resume fails with -ENODEV, skipping the
    touch function setup:
    
    s6sy761 2-0048: PM: dpm_run_callback(): s6sy761_resume [s6sy761] returns -19
    
    Power the chip on first and only then unmask the interrupt. Once resume
    completes the boot handshake the chip comes back with sensing off, as
    at probe where input_open() turns it on, so the touchscreen stays dead
    after resume. Send SENSE_ON again when the input device is open.
    
    Tested on a Pixel 3 XL over several s2idle cycles: resume succeeds and
    the touch function and sense status match the pre-suspend state.
    
    Assisted-by: LLM
    Cc: [email protected]
    Fixes: 0145a7141e59 ("Input: add support for the Samsung S6SY761 touchscreen")
    Signed-off-by: David Heidelberg <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    [ sashal: Replaced guard(mutex) with explicit mutex_lock()/mutex_unlock() calls for C90 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

Input: synaptics - add LEN205b entry to smbus_pnp_ids for ThinkPad T490 [+ + +]
Author: Lovekesh Solanki <[email protected]>
Date:   Mon Sep 21 01:37:30 2026 +0530

    Input: synaptics - add LEN205b entry to smbus_pnp_ids for ThinkPad T490
    
    commit a961417c5ae77bbb728a23d9577ecd8f4d8a4b5a upstream.
    
    Lenovo ThinkPad T490 has a Synaptics Touchpad that supports SMBus/RMI4
    mode, but is not listed in smbus_pnp_ids table.
    
    Add LEN205b to smbus_pnp_ids[] passlist.
    
    Reported-by: John Rosencutter <[email protected]>
    Closes: https://lore.kernel.org/all/CAOGuaRh025eKcBf9P8UrvtXNp68vQ0HVF2EbNMp-kpdaC1HNpA@mail.gmail.com/
    Signed-off-by: Lovekesh Solanki <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: synaptics - limit T440p InterTouch quirk to LEN0036 [+ + +]
Author: Raphaël Larocque <[email protected]>
Date:   Sat Sep 26 20:58:10 2026 -0400

    Input: synaptics - limit T440p InterTouch quirk to LEN0036
    
    commit f0fd8993082ca229faa3f9844f1c9fe182eca20b upstream.
    
    The ThinkPad L440 also uses board id 2722, but does not have the SMBus
    initialization problem seen on the T440p. On the L440, the SMBus
    companion becomes available shortly after psmouse probes, allowing the
    touchpad to use SMBus/RMI4 normally.
    
    The T440p's quirk is currently applied to all Synaptics touchpads with
    board id 2722, unnecessarily disabling SMBus InterTouch on the L440,
    as reported by Daniel Salmun.
    
    Restrict the quirk to PNP ID LEN0036, which identifies the T440p, so
    that other devices sharing board id 2722 retain their normal
    SMBus/RMI4 operation.
    
    Reported-by: Daniel Salmun <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Fixes: 26eb3d92c7a4 ("Input: synaptics - disable InterTouch on ThinkPad T440p (board id 2722)")
    Cc: [email protected]
    Signed-off-by: Raphaël Larocque <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
io-wq: order the exit bit against worker creation task work [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Mon Sep 21 15:44:53 2026 +0200

    io-wq: order the exit bit against worker creation task work
    
    commit 0e5663856b69219ef2f02e04bac9f5c5be19718a upstream.
    
    io_wq_exit_workers() cancels task work for queued worker creation with
    task_work_cancel_match(). That has a plain load of task->task_works.
    
    io_queue_worker_create() adds the new entry and tests IO_WQ_BIT_EXIT to
    cancel it if the workqueue is already on its way out.
    
    That must be ordered. task_work_add() has a full barrier via cmpxchg().
    But io_wq_exit_start() sets the bit with set_bit() which doesn't have
    any memory ordering.
    
    So afaict, on weakly ordered architectures the exiting task may load
    task_works before the store of the bit is visible. The other side tests
    the bit before the store is visible as well. So the entry remains queued
    with worker_refs and the exiting task waits on worker_done indefinitely.
    
    If the task still has rings then io_uring_del_tctx_node() provides the
    barrier via test_and_set_bit() in io_wq_set_exit_on_idle(). When it
    has closed all rings though that barrier is gone.
    
    Add the barrier after the set_bit().
    
    Fixes: 71a85387546e ("io-wq: check for wq exit after adding new worker task_work")
    Cc: [email protected]
    Reviewed-by: Jens Axboe <[email protected]>
    Acked-by: Oleg Nesterov <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
io_uring/rw: end write accounting from ->ki_complete [+ + +]
Author: Jens Axboe <[email protected]>
Date:   Wed Sep 16 20:37:20 2026 -0400

    io_uring/rw: end write accounting from ->ki_complete
    
    [ Upstream commit 796aa0547557e63338657ed1c487906f9fac4c73 ]
    
    Commit b000145e9907 moved both the fsnotify calls and the write
    accounting out of the kiocb completion handler and into the
    io_req_rw_complete() task_work. However, only the fsnotify part actually
    needed to move as it may sleep. Ending the write accounting is just a
    percpu_up_read() on the superblock writers sem.
    
    Deferring it is a problem, because it makes dropping SB_FREEZE_WRITE
    protection depend on the ring owner getting to running task_work. But
    the task may be blocked in freeze_super(), causing it to never get to
    that:
    
      task                             io-wq worker
      --------------------------------------------------------------
      io_write()
        io_kiocb_start_write()         (takes sb_writers, hidden from
                                        lockdep by __sb_writers_release)
        write_iter() -> -EIOCBQUEUED
      ioctl(FS_IOC_SHUTDOWN)
        bdev_freeze()
          freeze_super()
            percpu_down_write()        <- waits for the reader above
                                       io_write()
                                         kiocb_start_write()
                                           percpu_down_read()  <- queued
                                                                  behind the
                                                                  writer
      <bio completes>
        io_complete_rw()
          queues io_req_rw_complete()  <- never runs, task is in D state
    
    End the write from io_complete_rw() instead, and leave only the fsnotify
    calls in task_work.
    
    Reported-by: [email protected]
    Cc: [email protected]
    Fixes: b000145e9907 ("io_uring/rw: defer fsnotify calls to task context")
    Signed-off-by: Jens Axboe <[email protected]>
    [ placed write-accounting release after __io_complete_rw_common() to accommodate the older retry path’s early return. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ip6_gre: remove obsolete ERSPAN PMTU update [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Mon Oct 12 18:50:58 2026 -0400

    ip6_gre: remove obsolete ERSPAN PMTU update
    
    [ Upstream commit 8bc60db48e8cba35488bbd6e1f94aa990afa275a ]
    
    A tc tunnel_key action can attach a METADATA_IP_TUNNEL dst to an skb,
    and mirred can redirect it to a native ip6erspan device. The legacy PMTU
    update in ip6erspan_tunnel_xmit() treats that metadata dst as a route.
    Since it has no output device, dst_dev(dst)->mtu dereferences NULL.
    
    On v7.2 with KASAN, an initial UID/GID 65534 process with CapEff 0 used
    self-created user and network namespaces to trigger:
    
      KASAN: null-ptr-deref
      RIP: ip6erspan_tunnel_xmit+0x10fc/0x2cc0
      Kernel panic - not syncing: Fatal exception in interrupt
    
    The update is obsolete. Commit fe1a4ca0a2b7 ("ip6_gre: process toobig
    in a better way") changed IPv6 GRE Too Big handling to update the
    underlay route and removed the equivalent block from __gre6_xmit().
    ip6_tnl_xmit() then propagates the underlay PMTU to the overlay route.
    
    Remove the stale ERSPAN copy and its now-unused dst variable. This
    eliminates the metadata-dst dereference and keeps ERSPAN aligned with
    IPv6 GRE PMTU handling.
    
    Fixes: 5a963eb61b7c ("ip6_gre: Add ERSPAN native tunnel support")
    Cc: [email protected]
    Suggested-by: Ido Schimmel <[email protected]>
    Signed-off-by: Daehyeon Ko <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ sashal: Adjusted PMTU block context for direct dst->dev->mtu access instead of READ_ONCE(dst_dev(dst)->mtu). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ipmr: account multicast table and route memory [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 16 12:01:43 2026 -0400

    ipmr: account multicast table and route memory
    
    [ Upstream commit b7ee18725f2292ab554aa96a101ae42d45f008bd ]
    
    A netadmin in a user+net namespace can create many IPv4 and IPv6
    multicast routing tables with MRT_TABLE and MRT6_TABLE. Each unseen
    id allocates an mr_table via the shared mr_table_alloc(), links it
    into the per-net list, and leaves it until netns teardown. Those
    objects were not charged to memcg, so the host unreclaimable slab
    grows with the table count.
    
    Account mr_table allocations with GFP_KERNEL_ACCOUNT and mark the
    IPv4/IPv6 MFC caches SLAB_ACCOUNT. This matches the established
    handling of IP addresses, routes and alternate interface names.
    
    Unresolved MFC entries are still allocated from softIRQ with
    GFP_ATOMIC and are not charged. They expire after 10 seconds and are
    bounded by the socket receive queue; see commit 0079ad8e8dc3
    ("ipmr: remove hard code cache_resolve_queue_len limit").
    
    Fixes: f0ad0860d01e ("ipv4: ipmr: support multiple tables")
    Fixes: d1db275dd3f6 ("ipv6: ip6mr: support multiple tables")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/050b58f7fc6b45da0fb12768ebb62d18fa46133d.1788784801.git.zihanx@nebusec.ai
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted upstream allocation helpers to existing kzalloc() and kmem_cache_create() calls. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ipv4: avoid divide by zero in fib_rebalance [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Thu Aug 27 18:25:14 2026 +0000

    ipv4: avoid divide by zero in fib_rebalance
    
    commit 5046d2880fec7d49ebed2fd2866747ee1d06ad71 upstream.
    
    fib_rebalance() computes the total eligible nexthop weight in one pass
    and programs upper bounds in a second pass. A concurrent change to
    ignore_routes_with_linkdown can make the first pass return zero while
    the second pass sees an eligible nexthop, resulting in division by zero.
    
    If the first pass reports a zero total, set each nexthop upper bound to
    -1 and skip the division. This matches the IPv6 fix in commit
    d2c26c2911dd ("ipv6: avoid divide by zero in rt6_multipath_rebalance")
    and preserves the lock-free rebalance path.
    
    Fixes: 0e884c78ee19 ("ipv4: L3 hash-based multipath")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv4: do not warn on route notification size race [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Thu Oct 8 14:29:22 2026 +0900

    ipv4: do not warn on route notification size race
    
    commit e02a5b6588161673ef75a4bc5cdfb62bd493374d upstream.
    
    Commit 680aea08e78c ("net: ipv4: Emit notification when fib hardware
    flags are changed") added asynchronous route notifications for hardware
    flag changes.
    
    fib_alias_hw_flags_set() sizes the skb with fib_nlmsg_size() and later
    fills it with fib_dump_info() while holding only RCU.  With nexthop
    compatibility mode enabled, a concurrent replacement can grow the group
    between these independent snapshots.  fib_dump_info() can then
    legitimately return -EMSGSIZE, so the warning does not prove a sizing bug.
    
    Remove the warning.  The existing error path still frees the skb and
    reports the error to listeners.
    
    Fixes: 680aea08e78c ("net: ipv4: Emit notification when fib hardware flags are changed")
    Reported-by: Ido Schimmel <[email protected]>
    Link: https://lore.kernel.org/netdev/20261004082043.GB92032@shredder/
    Suggested-by: Ido Schimmel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Daehyeon Ko <[email protected]>
    Link: https://patch.msgid.link/b7e203fc5867651cb67ef84aa03e082f0f76008e.1791423190.git.4ncienth@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv4: stop PMTU walk when nexthop group shrinks [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Fri Oct 2 13:50:58 2026 +0900

    ipv4: stop PMTU walk when nexthop group shrinks
    
    commit 6619e01855e65ef35723685a557e3eb106f4ecf5 upstream.
    
    Commit 7d3f3b4367f3 ("net: ipv4: Cache pmtu for all packet paths if
    multipath enabled") made __ip_rt_update_pmtu() update every path.
    
    For nexthop objects, fib_info_num_path() and fib_info_nhc()
    independently load nh->nh_grp.  RCU protects each group's lifetime but
    does not make the loads observe the same group.  If replacement shrinks
    the group after the loop accepts an index, fib_info_nhc() returns NULL
    and update_or_create_fnhe() dereferences it.
    
    A deterministic probe only widened the existing window between the real
    operations.  On v7.2, an RTM_NEWNEXTHOP replacement published a
    one-member group after the PMTU reader accepted index 1 from a two-member
    group, producing:
    
      KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
      RIP: update_or_create_fnhe+0x45/0x15b0
    
    Stop when the indexed path is absent.  Groups are dense, so no later
    index exists in that snapshot.  The same real-writer window completed
    114,423 PMTU iterations without an oops with this check.  A reproducer
    is available on request.
    
    Replacement requires CAP_NET_ADMIN in the network namespace.  Where
    unprivileged user namespaces are permitted, a local user can obtain it
    in a new user and network namespace.
    
    Fixes: 7d3f3b4367f3 ("net: ipv4: Cache pmtu for all packet paths if multipath enabled")
    Cc: [email protected]
    Signed-off-by: Daehyeon Ko <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/4fb87ed994dfc067178fc845cdd8bc9b5446b039.1790915964.git.4ncienth@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv4: stop route notification sizing when nexthop group shrinks [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Fri Oct 2 13:51:00 2026 +0900

    ipv4: stop route notification sizing when nexthop group shrinks
    
    commit d3daa33c7af92e38f2274bbd2576f58bfbaf89e6 upstream.
    
    Commit 680aea08e78c ("net: ipv4: Emit notification when fib
    hardware flags are changed") added an RCU-only fib_nlmsg_size() call
    for asynchronous hardware flag notifications.
    
    fib_nlmsg_size() checks fib_info_num_path() before each iteration,
    then fib_info_nhc() independently reloads nh->nh_grp. If
    RTM_NEWNEXTHOP replaces a group with fewer paths between those loads,
    fib_info_nhc() returns NULL and fib_nexthop_nlmsg_size() dereferences
    it.
    
    Stop sizing when the indexed path is absent. Nexthop groups are
    dense, so the current snapshot has no later path.
    
    Fixes: 680aea08e78c ("net: ipv4: Emit notification when fib hardware flags are changed")
    Cc: [email protected]
    Signed-off-by: Daehyeon Ko <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/1054fa46165bba1b473782fa41367804aa908e86.1790915964.git.4ncienth@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv4: udp: Create exceptions before socket matching [+ + +]
Author: Ido Schimmel <[email protected]>
Date:   Thu Oct 22 18:04:53 2026 -0400

    ipv4: udp: Create exceptions before socket matching
    
    [ Upstream commit 4c3499f79f8c7e8561266bcc220a18538cec0458 ]
    
    Currently, when ICMP Fragmentation Needed and Redirect Message packets
    are locally delivered and quote a UDP packet, a FIB nexthop exception
    (FNHE) is only created if the kernel can match the UDP packet to an
    existing socket.
    
    This behavior allows off-path attackers to conduct a side-channel attack
    on the FNHE cache in order to discover the ephemeral port used by a
    connected UDP socket.
    
    Commit 6457378fe796 ("ipv4: use siphash instead of Jenkins in
    fnhe_hashfun()") and commit 67d6d681e15b ("ipv4: make exception cache
    less predictible") tried to mitigate such attacks by making it harder
    for attackers to discover hash collisions in the FNHE cache and by
    randomizing the number of exceptions a hash bucket can hold,
    respectively. Unfortunately, both of the mitigations can be bypassed.
    
    Instead, mitigate such attacks by always creating a FNHE, even before
    trying to find a matching socket. Do that by calling ipv4_update_pmtu()
    and ipv4_redirect(), the helpers used when the quoted packet did not
    originate from a socket.
    
    This means that guesses (right or wrong) from an off-path attacker will
    always result in a FNHE being created or updated in the cache that the
    attacker can observe.
    
    Pass an oif of 0, in a similar fashion to icmp_err(). This is also the
    oif used by the socket path for sockets that are not bound to a device.
    
    Note that this does not allow attackers to create FNHEs that they could
    not create before, as both helpers can already be reached with little to
    no validation. For example, by sending an ICMP error that quotes an ICMP
    Echo Reply or one that quotes a UDP source port that matches a wildcard
    socket.
    
    Also note that in the good case (matched socket) the above scheme comes
    at the cost of an extra route lookup, as the no socket helpers perform
    their own lookup before the one performed by ipv4_sk_update_pmtu() /
    ipv4_sk_redirect(). When the two resolve to different nexthops, it also
    results in two exceptions being created for the same destination IP. One
    in the FNHE cache of the nexthop resolved by the no socket helpers and
    another in the FNHE cache of the nexthop used by the socket.
    
    Fixes: 4895c771c7f0 ("ipv4: Add FIB nexthop exceptions.")
    Cc: [email protected]
    Reported-by: Amit Klein <[email protected]>
    Reported-by: Noam Caspi <[email protected]>
    Signed-off-by: Ido Schimmel <[email protected]>
    Reviewed-by: David Ahern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ sashal: inlined udp_err_update_exception() into the existing udp_err() wrapper ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ipv6: do not warn on route notification size race [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Thu Oct 8 14:29:23 2026 +0900

    ipv6: do not warn on route notification size race
    
    commit c97426ec649d99596d8969e1a052c16b14b7b485 upstream.
    
    fib6_info_hw_flags_set() sizes the skb with rt6_nlmsg_size() and later
    fills it with rt6_fill_node().  With nexthop compatibility mode enabled,
    a concurrent replacement can grow the group between these independent
    snapshots.  rt6_fill_node() can then legitimately return -EMSGSIZE, so
    the warning does not prove a sizing bug.
    
    Remove the warning.  The existing error path still frees the skb and
    reports the error to listeners.
    
    Fixes: 907eea486888 ("net: ipv6: Emit notification when fib hardware flags are changed")
    Reported-by: Ido Schimmel <[email protected]>
    Link: https://lore.kernel.org/netdev/20261007114003.GA1011260@shredder/
    Suggested-by: Ido Schimmel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Daehyeon Ko <[email protected]>
    Link: https://patch.msgid.link/4012604727e5ba80b69ccd4d08796511397ddaef.1791423190.git.4ncienth@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Mon Sep 28 19:45:24 2026 +0000

    ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel()
    
    [ Upstream commit 8ec454dcd00ce3375119111c6394964455b36d0d ]
    
    Since commit d58e468b1112 ("flow_dissector: implements flow dissector
    BPF hook") __skb_flow_dissect() needs a net pointer, either from
    skb->dev, skb->sk, or since commit 3cbf4ffba5ee ("net: plumb network
    namespace into __skb_flow_dissect") a caller provided pointer.
    
    syzbot was able to reach seg6_make_flowlabel() with an skb having
    neither skb->dev nor skb->sk set: a TIPC UDP bearer sends a discovery
    message through an IPv4 route using seg6 encap, while
    net.ipv6.seg6_flowlabel is set to 1.
    
    seg6_make_flowlabel() already has a net pointer, use skb_get_hash_net().
    
    WARNING: net/core/flow_dissector.c:1131 at __skb_flow_dissect+0x910/0x5368 net/core/flow_dissector.c:1126, CPU#0: syz.0.17/4930
    Call trace:
      __skb_flow_dissect+0x910/0x5368 net/core/flow_dissector.c:1126 (P)
      __skb_get_hash_net+0xe0/0x29c net/core/flow_dissector.c:1903
      skb_get_hash include/linux/skbuff.h:1663 [inline]
      seg6_make_flowlabel+0xcc/0x1ec net/ipv6/seg6_iptunnel.c:132
      __seg6_do_srh_encap+0x320/0xbf4 net/ipv6/seg6_iptunnel.c:161
      seg6_do_srh+0x4b4/0xa44 net/ipv6/seg6_iptunnel.c:431
      seg6_output_core+0x164/0x688 net/ipv6/seg6_iptunnel.c:681
      seg6_output+0x44/0x1ac net/ipv6/seg6_iptunnel.c:744
      lwtunnel_output+0x3d0/0x664 net/core/lwtunnel.c:356
      dst_output include/net/dst.h:470 [inline]
      ip_local_out+0x110/0x148 net/ipv4/ip_output.c:131
      iptunnel_xmit+0x50c/0xd38 net/ipv4/ip_tunnel_core.c:97
      udp_tunnel_xmit_skb+0x220/0x348 net/ipv4/udp_tunnel_core.c:187
      tipc_udp_xmit+0x75c/0x9c0 net/tipc/udp_media.c:202
      tipc_udp_send_msg+0x214/0x374 net/tipc/udp_media.c:274
      tipc_bearer_xmit_skb+0x260/0x3b0 net/tipc/bearer.c:576
      tipc_enable_bearer net/tipc/bearer.c:366 [inline]
      __tipc_nl_bearer_enable+0xc90/0xfb0 net/tipc/bearer.c:1048
      tipc_nl_bearer_enable+0x2c/0x48 net/tipc/bearer.c:1057
      genl_family_rcv_msg_doit+0x1e4/0x2d4 net/netlink/genetlink.c:1114
    
    Fixes: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/netdev/[email protected]/
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Xuanqiang Luo <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ipv6: use RCU in ip6_xmit() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Mon Oct 12 09:40:57 2026 -0700

    ipv6: use RCU in ip6_xmit()
    
    [ Upstream commit 9085e56501d93af9f2d7bd16f7fcfacdde47b99c ]
    
    Use RCU in ip6_xmit() in order to use dst_dev_rcu() to prevent
    possible UAF.
    
    Fixes: 4a6ce2b6f2ec ("net: introduce a new function dst_dev_put()")
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: David Ahern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    (cherry picked from commit 9085e56501d93af9f2d7bd16f7fcfacdde47b99c)
    [Harshit: Resolve conflict for missing BIG TCP hop-jumbo context]
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ipvs: bound LBLCR and LBLC cache growth [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Sat Oct 3 20:19:36 2026 -0400

    ipvs: bound LBLCR and LBLC cache growth
    
    [ Upstream commit 2a3c3de660f96865f303fd25f1285f2ffbfd521d ]
    
    ip_vs_lblcr_new() and ip_vs_lblc_new() create cache entries for
    every previously unseen destination address. The table max_size only
    tells the periodic collector to reclaim entries after the cache has
    already exceeded the limit. It does not reclaim entries that the
    attacker continues to use.
    
    Reject new cache entries once either table reaches max_size * 3 / 2.
    The extra headroom lets the periodic collector catch up while the
    existing scheduler fallback continues to use the selected destination
    when cache creation fails. New traffic therefore stays serviceable
    without growing the tables further.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Suggested-by: Julian Anastasov <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Acked-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    [ sashal: Retained kmalloc() instead of kmalloc_obj(). ]
    Signed-off-by: Sasha Levin <[email protected]>

ipvs: do not create invisible templates [+ + +]
Author: Julian Anastasov <[email protected]>
Date:   Sat Sep 19 21:07:32 2026 +0300

    ipvs: do not create invisible templates
    
    [ Upstream commit 616cf5c06934364ab1002b420ebe975850b4b208 ]
    
    The IP_VS_CONN_F_ONE_PACKET flag was implemented for normal
    connections. When conn template inherits this flag from
    dest->conn_flags it will not be hashed. As result, we will
    create new template for every new normal connection.
    
    Fix it to allow one template to be used by many normal
    connections.
    
    Fixes: 26ec037f9841 ("IPVS: one-packet scheduling")
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260916231652.127456-1-pablo%40netfilter.org
    Signed-off-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ipvs: filter some flags received in the backup server [+ + +]
Author: Julian Anastasov <[email protected]>
Date:   Sat Sep 19 21:07:33 2026 +0300

    ipvs: filter some flags received in the backup server
    
    [ Upstream commit f96e91748f6304668fe647e686d199d7207d36f1 ]
    
    While the IPVS SYNC protocol is not secure by design
    we can still protect the backup server from messages that
    can wreak havoc.
    
    This commit addresses problems from received connection flags
    or their combinations. We now drop messages as follows:
    
    1. the NO_CPORT+TEMPLATE combination allows lookups for normal
    connections to hit template which can break in many ways.
    While the master does not sync connections with NO_CPORT flag,
    i.e. before they are established, we still accept NO_CPORT
    without TEMPLATE.
    
    2. ONE_PACKET: it is not sent by master, so we do not
    expect it in backup. Before now it was ignored by
    IP_VS_CONN_F_BACKUP_MASK for protocol v1 while protocol
    v0 created connections that are not hashed and dropped
    immediately. Better to apply the IP_VS_CONN_F_BACKUP_MASK
    also to the flags from v0 messages for consistency with v1.
    
    Fixes: 87375ab47cd0 ("[IPVS]: ip_vs_ftp breaks connections using persistence")
    Signed-off-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ipvs: fix missing counter decrement in lblc [+ + +]
Author: Julian Anastasov <[email protected]>
Date:   Thu Sep 10 13:08:31 2026 +0300

    ipvs: fix missing counter decrement in lblc
    
    [ Upstream commit bdac17779f46817f60103baf09f0370546c3f023 ]
    
    LBLC may delete cache entries for destinations that are
    removed or overloaded and replace them with available ones.
    But ip_vs_lblc_new() forgets to decrement the tbl->entries
    counter after calling ip_vs_lblc_del(). This can lead to
    increased shrinking of the cache with every new garbage
    collection.
    
    Fixes: 2f3d771a35fe ("ipvs: do not use dest after ip_vs_dest_put in LBLC")
    Link: https://sashiko.dev/#/patchset/0bdd5abe9968ded7ca2b9cb6844ba83d94cc8d53.1787318053.git.zhilinz%40nebusec.ai
    Signed-off-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
kernel/params.c: Use kstrtobool() instead of strtobool() [+ + +]
Author: Christophe JAILLET <[email protected]>
Date:   Tue Sep 8 14:21:01 2026 -0400

    kernel/params.c: Use kstrtobool() instead of strtobool()
    
    [ Upstream commit def7b92efd868a6c78da86770704c1a03506016e ]
    
    strtobool() is the same as kstrtobool().
    However, the latter is more used within the kernel.
    
    In order to remove strtobool() and slightly simplify kstrtox.h, switch to
    the other function name.
    
    While at it, include the corresponding header file (<linux/kstrtox.h>)
    
    Signed-off-by: Christophe JAILLET <[email protected]>
    Reviewed-by: Miroslav Benes <[email protected]>
    Signed-off-by: Luis Chamberlain <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

 
keys/trusted_keys: return immediately after TPM unseal failure [+ + +]
Author: Srish Srinivasan <[email protected]>
Date:   Sat Sep 12 11:59:49 2026 +0530

    keys/trusted_keys: return immediately after TPM unseal failure
    
    commit f92d0ccb05bf9089072cb067dda0dffd5394c4ef upstream.
    
    trusted_tpm_unseal() proceeds to pcrlock() when the TPM unseal operation
    fails. If pcrlock() succeeds, its return value overwrites the unseal error,
    causing key instantiation to succeed.
    
    Return immediately when unseal fails to preserve the original error.
    
    Cc: [email protected] # v5.15+
    Fixes: 5d0682be3189 ("KEYS: trusted: Add generic trusted keys framework")
    Signed-off-by: Srish Srinivasan <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
keys: Avoid the owner account dereference in named keyring lookup [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Fri Oct 9 13:11:59 2026 +0800

    keys: Avoid the owner account dereference in named keyring lookup
    
    commit 51409aaa01f8602552c336009fd22b226b0cdf1d upstream.
    
    Named keyring lookup must keep the storage containing the owner UID
    alive through the namespace mapping check.  find_keyring_by_name()
    reads keyring->user->uid under keyring_name_lock, but that lock protects
    the keyring's name entry and allocation, not its separate key_user.
    
    A named session-keyring join can overlap a privileged KEYCTL_CHOWN on
    another CPU.  If the keyring holds the last reference to its old dynamic
    key_user and the ownership transfer succeeds, the following ordering is
    possible:
    
        Named join                         Chown
        find_keyring_by_name()              keyctl_chown_key()
          read_lock(keyring_name_lock)       down_write(key->sem)
          load old keyring->user
                                             replace key->user and key->uid
                                             up_write(key->sem)
                                             key_put(key)
                                             key_user_put(old user): free
          read old user->uid
          read_unlock(keyring_name_lock)
    
    Chown neither takes keyring_name_lock nor key_session_mutex, so it can
    free the old account between the pointer load and the UID read.  The
    lookup then reads freed memory even though the keyring itself is alive.
    
    Use keyring->uid for the mapping check.  key_alloc() initializes this
    inline owner UID and keyctl_chown_key() updates it on chown.
    The existing name lock keeps its containing keyring allocated throughout
    the check, so lookup no longer depends on the account's lifetime.  This
    also matches the owner UID used by the permission check.
    
    KASAN report as below:
    
        BUG: KASAN: slab-use-after-free in find_keyring_by_name+0x577/0x5d0
        Read of size 4 at addr ffff8881128ae2ec by task keycase/500
    
    Cc: [email protected]
    Fixes: 2ea190d0a006 ("keys: skip keys from another user namespace")
    Assisted-by: LLM
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0002-v3-2baa8cad2bb554364e10@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: Check the authorization payload in process keyring searches [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Fri Oct 9 13:52:16 2026 +0800

    keys: Check the authorization payload in process keyring searches
    
    commit 0a0ec45bf577a9b4d4960567f20d3877ef480de9 upstream.
    
    An authorization payload and its saved credentials must remain valid
    while search_process_keyrings_rcu() searches the requestor's keyrings.
    The function validates the authorization key, then separately loads
    payload.data[0] and unconditionally reads rka->cred. Validation does
    not prevent request_key_auth_revoke() from clearing the payload.
    
    A request-key helper can assume authority and fork a descendant that
    inherits the authorization key. If the descendant misses in its own
    keyrings, it falls back to the saved requestor credentials. Successful
    target instantiation invalidates the authorization key without clearing
    the payload. After the helper exits, UMH_WAIT_PROC returns to the
    requester, which calls complete_request_key() and revokes that key.
    
    With the descendant paused after validation, the paths can interleave
    as follows:
    
      1. The descendant enters search_process_keyrings_rcu() under RCU and
         key_validate() succeeds.
      2. The helper instantiates the target, invalidates the authorization
         key, and exits.
      3. The requester resumes from UMH_WAIT_PROC, calls
         complete_request_key(), and revokes the authorization key.
         request_key_auth_revoke() sets its payload pointer to NULL.
      4. The descendant loads NULL and dereferences rka->cred.
    
    This NULL dereference can oops the kernel. RCU delays payload disposal
    but does not prevent the pointer from being cleared.
    
    Load the payload with dereference_key_rcu() and require a non-NULL
    result before validating the authorization key and searching its saved
    credentials. A non-NULL payload and its credentials remain alive for
    the caller's RCU read-side section; a cleared payload skips the fallback
    search and follows the existing error selection.
    
    KASAN report as below:
    
        Oops: general protection fault, probably for non-canonical address 0xdffffc0000000005: 0000 [#1] SMP KASAN NOPTI
        KASAN: null-ptr-deref in range [0x0000000000000028-0x000000000000002f]
        RIP: 0010:search_process_keyrings_rcu+0x32b/0x790
    
    Cc: [email protected]
    Fixes: e59428f721ee ("keys: Move the RCU locks outwards from the keyring search functions")
    Assisted-by: LLM
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0004-v3-598361863b76bc25d58d@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: finalize persistent keyring timeout after link attempt [+ + +]
Author: Karl Mehltretter <[email protected]>
Date:   Sat Sep 12 11:54:40 2026 +0200

    keys: finalize persistent keyring timeout after link attempt
    
    commit 25bf14f817168079f731975b8998fc2af380f29e upstream.
    
    When no keyring exists for the requested UID, KEYCTL_GET_PERSISTENT
    creates and registers one before linking it to the requested destination.
    The configured timeout is set only after the destination link succeeds.
    
    A destination restricted with KEYCTL_RESTRICT_KEYRING makes that link fail
    with -EPERM. With persistent_keyring_expiry set to 60 seconds, /proc/keys
    still reports the registered keyring's expiry as "perm".
    The failed call therefore leaves a quota-exempt keyring in the namespace's
    hidden register, where it may remain until namespace teardown.
    
    Rename the write-locked helper to key_get_or_create_persistent() and return
    the key reference through a result parameter. Return 0 when it creates a
    keyring and 1 when the retry finds an existing one. Return a negative error
    on failure. Another caller may create the keyring between the initial
    read-locked lookup and the retry under the write lock.
    
    Set the timeout after permission checking and linking. Do this on success,
    or on failure if the call allocated the keyring. This leaves a new keyring
    collectible after failure without starting its timeout while linking is
    still in progress.
    
    Cc: [email protected] # v5.10+
    Fixes: f36f8c75ae2e ("KEYS: Add per-user_namespace registers for persistent per-UID kerberos caches")
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
KEYS: Fix add_key() race with keyring restriction [+ + +]
Author: 성병찬 <[email protected]>
Date:   Wed Sep 30 13:18:01 2026 +0900

    KEYS: Fix add_key() race with keyring restriction
    
    commit dd3ea3fcba7c75493760cdbccd35f029597e8d5e upstream.
    
    __key_create_or_update() snapshots keyring->restrict_link before taking
    the destination keyring's semaphore.  keyring_restrict() installs a
    restriction while holding that semaphore.
    
    This allows a writer to observe no restriction, wait for the keyring
    owner to install a reject-all restriction and return successfully, and
    then link a key using the stale NULL snapshot.  The writer only needs
    write permission on the destination keyring.
    
    Move the restrict_link read after __key_link_lock() and
    __key_link_begin().  The read and the subsequent restriction check are
    then serialized with restriction installation by keyring->sem.
    
    The race was reproduced on v7.2.8 in 19 executions where restriction
    installation returned before the link completed.  All 19 linked the key
    despite the reject-all restriction.  With this change, 312 executions
    reached the same ordering and every add_key() call failed with -EPERM.
    
    The issue was found by manual concurrency analysis assisted by AI-based
    analysis and independently verified with a QEMU reproducer and kernel
    instrumentation.
    
    Fixes: 5ac7eace2d00 ("KEYS: Add a facility to restrict new links into a keyring")
    Cc: [email protected]
    Signed-off-by: 성병찬 <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KEYS: Fix key_reject_and_link() race with keyring restriction [+ + +]
Author: Adrian Martinez <[email protected]>
Date:   Sat Oct 10 23:40:00 2026 +0300

    KEYS: Fix key_reject_and_link() race with keyring restriction
    
    commit 0b157166e612b70f98a332b6c7be7eac6f8e9593 upstream.
    
    The restrict_link check in key_reject_and_link() is done before taking
    the keyring semaphore, racing with a concurrent keyring_restrict()
    that installs the restriction while holding the semaphore in write
    mode.
    
    Move the check to after __key_link_lock(), so it is done under the
    semaphore, matching the pattern used in __key_create_or_update().
    
    Cc: [email protected]
    Fixes: 5ac7eace2d00 ("KEYS: Add a facility to restrict new links into a keyring")
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Adrian Martinez <[email protected]>
    Link: https://lore.kernel.org/r/CACO1+RT+m==BY+ZPkE+fo536D0qu3wog4xE1dfuXQ56g+=Qv=A@mail.gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
keys: make keyring indexes independent of kernel addresses [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Tue Oct 13 16:12:51 2026 -0700

    keys: make keyring indexes independent of kernel addresses
    
    commit de891c73c1cf41ac8de12c07fa2c84d6a912ad0c upstream.
    
    KEYCTL_READ returns the serial numbers in a keyring in associative-array
    traversal order.  The first word of the index is a public, deterministic
    hash of the type pointer, domain pointer and description.  An unprivileged
    user can therefore insert keys with known descriptions, predict their
    order for each possible KASLR slide, and recover the kernel image address.
    On an x86-64 build with 16 MiB alignment, 45 user keys suffice to
    distinguish the candidate slides.
    
    Remove the addresses from the whole index, not just its first hash word.
    Assign each key type and domain a nonzero 64-bit ID and hash those IDs and
    the description with a once-initialized SipHash key.  Use the full IDs in
    the later index chunks as well.  Truncating or hashing the IDs there would
    lose the guarantee that distinct type/domain/description tuples have a
    differing index bit.
    
    Allocate IDs lazily since private key types need not be registered.  Cache
    them in the index key so tree walks and copies of an existing index do not
    need to dereference a type descriptor that may have been unregistered.
    Keep the 32-bit chunk layout and diff_objects() bit offsets consistent,
    and retain the separate root slot for keyrings used by recursive search.
    The key comparison, permissions and userspace data format are unchanged;
    only the address-dependent in-memory ordering is replaced.
    
    Cc: [email protected]
    Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
    Assisted-by: Codex:gpt-6-astra
    Signed-off-by: Kyle Zeng <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: Protect the read method check against type removal [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Mon Oct 19 22:57:21 2026 +0800

    keys: Protect the read method check against type removal
    
    commit 925c84e3cc21caf09de92d9bcafab0147790debf upstream.
    
    keyctl_read_key() checks key->type->read without holding key->sem.
    A reference keeps the key alive, but does not pin the module containing
    its type. A surviving RxRPC key can therefore be read while AF_RXRPC
    is being unloaded:
    
      KEYCTL_READ task                    Module unload and key GC
      ----------------                   ------------------------
      lookup_user_key()
      permission / possession checks
      load key->type
                                         af_rxrpc_exit()
                                           unregister_key_type()
                                             GC: down_write(key->sem)
                                             GC: retype to key_type_dead
                                             GC: up_write(key->sem)
                                           unregister_key_type() returns
                                         free_module()
      read saved type's read member
    
    The final access can read freed module storage. The read invocation in
    __keyctl_read_key() is already protected by key->sem, but the earlier
    method check is outside that critical section.
    
    Move the method check into __keyctl_read_key(), after key_validate() and
    under its existing read hold on key->sem. The check and invocation then
    use the same protected type for length queries and every read retry.
    The GC cannot retype the key until the semaphore is released, and type
    unregistration waits for that GC pass before the module can be freed.
    
    Return -EOPNOTSUPP when validation succeeds and the type has no read
    method. A temporary buffer may now be allocated before this result;
    allocation and copying to userspace remain outside the semaphore.
    
    Assisted-by: LLM
    Cc: [email protected] # v5.10+
    Fixes: d3ec10aa9581 ("KEYS: Don't write out to userspace while holding key semaphore")
    Suggested-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0010-v7-fc85721ff5cfb9e33ac6@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: Protect the type name while describing a key [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Fri Oct 9 13:11:03 2026 +0800

    keys: Protect the type name while describing a key
    
    commit fced7238b7e80cf8aa688d5af976e4aa6e33c329 upstream.
    
    keyctl_describe_key() must keep the key type's name alive until
    kasprintf() has consumed it. The retained key reference keeps the key
    and its description alive, but does not pin the module providing its
    type. The name is passed to kasprintf() without holding key->sem.
    
    kvasprintf() uses the saved name pointer in two formatting passes, with
    a GFP_KERNEL allocation between them. With AF_RXRPC=m, a task that
    passes View permission before type retirement can overlap a privileged
    module unload in this order:
    
    1. KEYCTL_DESCRIBE looks up the key, saves key->type->name in the
       kasprintf() arguments and completes the first formatting pass.
    2. While the formatter is delayed before its second pass,
       af_rxrpc_exit() calls unregister_key_type(), which removes the type
       from the registry and waits for key_gc_keytype().
    3. The collector takes key->sem for writing, retypes the retained key
       to key_type_dead and completes retirement. Unregistration and module
       exit return, allowing free_module() to release the type and name.
    4. The formatter resumes its second pass and reads the saved name from
       released module storage, which can fault in string().
    
    Hold key->sem for reading across kasprintf(). The collector then cannot
    retype the key or complete retirement until both formatting passes have
    finished. If retirement wins the lock first, formatting uses the core
    key_type_dead name instead. Release the semaphore immediately after
    kasprintf(), including on allocation failure, before copying to
    userspace.
    
    Oops report as below:
    
        BUG: unable to handle page fault for address: fffffbfff8054794
        #PF: supervisor read access in kernel mode
        #PF: error_code(0x0000) - not-present page
        RIP: 0010:string+0x23f/0x470
        Call Trace:
         vsnprintf+0x330/0x1110
    
    Cc: [email protected]
    Fixes: aa9d4437893f ("KEYS: Fix the size of the key description passed to/from userspace")
    Assisted-by: LLM
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0009-v4-6b537c5732fd957c33fa@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
KEYS: trusted: Fix blob allocation size in tpm2_key_decode() [+ + +]
Author: Stefano Garzarella <[email protected]>
Date:   Wed Sep 23 19:35:06 2026 +0200

    KEYS: trusted: Fix blob allocation size in tpm2_key_decode()
    
    commit 11077cbcc2695f71c944a84a5f08c6672ab759f1 upstream.
    
    tpm2_key_decode() allocates 4 bytes more than needed. The ASN.1
    callbacks tpm2_key_priv() and tpm2_key_pub() provide the lengths
    of TPM2B_PRIVATE and TPM2B_PUBLIC, so ctx.priv_len and ctx.pub_len
    already account for the 2-byte `size` field each of those structures
    starts with.
    
    I noticed this while reviewing commit 114f00d738f1 ("KEYS: trusted:
    Fix tpm2_load_cmd() boundary check"), which correctly reports
    ctx.priv_len + ctx.pub_len as the decoded blob size [1].
    
    Let's allocate exactly that amount, matching the data copied into
    the blob.
    
    [1] https://lore.kernel.org/linux-integrity/apfoKo-BdwaLXtkT@sgarzare-redhat/
    
    Cc: [email protected] # v5.13+
    Fixes: f2219745250f ("security: keys: trusted: use ASN.1 TPM2 key format for the blobs")
    Signed-off-by: Stefano Garzarella <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KEYS: trusted: Fix TPM teardown ordering [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Thu Sep 3 11:22:02 2026 -0400

    KEYS: trusted: Fix TPM teardown ordering
    
    [ Upstream commit 5e2d672280d97d83de43031d93761b12dadd7b8a ]
    
    trusted_tpm_exit() drops the TPM chip reference and frees the digest
    array before unregistering the trusted key type. key_type_lookup()
    holds key_types_sem for reading until the key operation finishes, while
    unregister_key_type() takes it for writing. It therefore provides the
    synchronization point that must precede backend teardown.
    
    The current order permits this interleaving:
    
      CPU 0                              CPU 1
      trusted_tpm_exit()                 key_type_lookup("trusted")
        put_device(&chip->dev)             trusted_tpm_seal()
        kfree(digests)                       pcrlock()
        unregister_key_type()                  tpm_pcr_extend(..., digests)
    
    CPU 1 can consequently dereference the freed digest array. The chip can
    also be released before callbacks stop using it.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tpm_pcr_extend+0x1f0/0x200
      Read of size 2 at addr ffff88810872d000 by task poc/89
      Call Trace:
        tpm_pcr_extend+0x1f0/0x200
        pcrlock+0x42/0x70 [trusted]
        trusted_tpm_seal+0x1b6/0x570 [trusted]
        trusted_instantiate+0x293/0x340 [trusted]
        __key_instantiate_and_link+0xb2/0x2b0
        __key_create_or_update+0x61e/0xb50
        __do_sys_add_key+0x1b8/0x310
      Allocated by task 88:
        __kmalloc_noprof+0x1a7/0x490
        do_one_initcall+0xa1/0x390
        do_init_module+0x2df/0x840
      Freed by task 90:
        kfree+0x131/0x3c0
        trusted_tpm_exit+0x59/0xa0 [trusted]
        __do_sys_delete_module+0x346/0x510
    
    Move unregister_key_type() before releasing either resource. This stops
    new lookups and waits for in-flight key operations to finish before the
    backend state is destroyed.
    
    Fixes: 0b6cf6b97b7e ("tpm: pass an array of tpm_extend_digest structures to tpm_pcr_extend()")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Tested-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    [ preserved the additional trusted_shash_release() cleanup after unregister_key_type() ]
    Signed-off-by: Sasha Levin <[email protected]>

 
kgdboc: Fix tty driver reference leak in configure_kgdboc() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Sep 17 15:55:23 2026 +0000

    kgdboc: Fix tty driver reference leak in configure_kgdboc()
    
    commit ef3134cd0d4831ae2137aee2883987859b80b2c6 upstream.
    
    tty_find_polling_driver() returns the tty driver with an extra
    reference taken by tty_driver_kref_get(). configure_kgdboc() stores it
    in kgdb_tty_driver but the reference is never dropped: it is leaked when
    kgdb_register_io_module() fails, when the configuration is cleared, and
    on every reconfigure.
    
    Release the reference both when unconfiguring and on the error path.
    
    Fixes: 7d7b93c1452f ("tty: kref the tty driver object")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Reviewed-by: Douglas Anderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
kprobes: Protect kprobe_blacklist with RCU [+ + +]
Author: Masami Hiramatsu (Google) <[email protected]>
Date:   Thu Sep 10 11:37:51 2026 -0400

    kprobes: Protect kprobe_blacklist with RCU
    
    [ Upstream commit 0c4256196b3a105307e2235fbfd85e768bbcdd0f ]
    
    __within_kprobe_blacklist() traverses kprobe_blacklist without holding
    kprobe_mutex. When a module is unloaded, kprobe_remove_area_blacklist()
    removes blacklist entries and immediately frees them with kfree().
    A concurrent call to within_kprobe_blacklist() can therefore dereference
    freed memory.
    
    Furthermore, within_kprobe_blacklist() can be called in atomic or
    non-preemptible contexts where the sleeping kprobe_mutex cannot be taken.
    
    Protect kprobe_blacklist with RCU. Use guard(rcu)() and
    list_for_each_entry_rcu() for traversal, list_add_tail_rcu() for
    insertions, list_del_rcu() for deletions, and kfree_rcu() to reclaim
    entries safely after a grace period.
    
    Link: https://lore.kernel.org/all/178810004323.64882.16493230858653316962.stgit@devnote2/
    
    Fixes: 376e242429bf ("kprobes: Introduce NOKPROBE_SYMBOL() macro to maintain kprobes blacklist")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Assisted-by: Antigravity:gemini-3.7-flash
    Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
    [ Replaced guard(rcu)() with explicit rcu_read_lock()/rcu_read_unlock() to avoid declaration-after-statement warnings. ]
    Signed-off-by: Sasha Levin <[email protected]>

kprobes: Skip disarmed probes when checking optkprobe overlap [+ + +]
Author: Leon Hwang <[email protected]>
Date:   Sat Oct 3 20:08:37 2026 -0400

    kprobes: Skip disarmed probes when checking optkprobe overlap
    
    [ Upstream commit 7a39c732a22ec4a369af9e19fbe3d666ec83eec4 ]
    
    On x86, an optkprobe at A replaces five bytes with a jump. If a disabled
    probe B is at A+2, get_optimized_kprobe() stops at B when arming a new
    probe C at A+4. It leaves A optimized:
    
                  A    A+1  A+2  A+3  A+4
      A's jump  | e9 | d0 | d1 | d2 | d3 |
      after C   | e9 | d0 | d1 | d2 | cc |
    
    The INT3 for C overwrites the last byte of A's jump displacement, so
    execution can jump to the wrong address. B can have prepared optinsns
    while disarmed, but has no jump to unoptimize.
    
    Continue past disarmed and unprepared probes to find the active optimized
    probe before arming a probe in its jump.
    
    Link: https://lore.kernel.org/all/[email protected]/
    
    Fixes: afd66255b9a4 ("kprobes: Introduce kprobes jump optimization")
    Cc: [email protected]
    Signed-off-by: Leon Hwang <[email protected]>
    Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
    [ sashal: Adapted get_optimized_kprobe() to use unsigned long addresses with byte-wise scanning. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ksmbd: fill in FileSysIdentifier in FS_POSIX_INFORMATION [+ + +]
Author: Aleksandr Khromov <[email protected]>
Date:   Thu Oct 22 15:27:24 2026 -0400

    ksmbd: fill in FileSysIdentifier in FS_POSIX_INFORMATION
    
    [ Upstream commit db2267b27c054a6c2151ff7fbb67927e784f31d6 ]
    
    smb2_get_info_filesystem() reports 56 bytes for FS_POSIX_INFORMATION,
    that is the whole of FILE_SYSTEM_POSIX_INFO, but never assigns
    FileSysIdentifier.  Those eight bytes go to the client as they are found
    in the response buffer.
    
    The buffer is zeroed on allocation, so a standalone request leaks
    nothing.  A compound request can leak: the offset of the next response
    is advanced by the length pinned for the previous one, so a reply that
    was written into the buffer and then dropped in favour of the short
    error response of smb2_set_err_rsp() stays there, and the next reply is
    laid over it with only the header cleared.
    
    Report the file system id statfs() returned, which is what the field is
    for.  FileSysIdentifier is __le64 and f_fsid is a pair of ints, so
    assemble the value first, val[0] as the low half, and convert it on the
    way out.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Cc: [email protected]
    Signed-off-by: Aleksandr Khromov <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ksmbd: fix heap out-of-bounds write in krb5_authenticate() [+ + +]
Author: Ilan Dudnik <[email protected]>
Date:   Fri Aug 7 12:03:31 2026 +0300

    ksmbd: fix heap out-of-bounds write in krb5_authenticate()
    
    commit 23a0be6a84a38ac169eeab49017934e8e27c65f0 upstream.
    
    In krb5_authenticate(), out_len is calculated to determine available
    headroom in response_buf for the incoming Kerberos AP-REP token. However,
    when SMB2_SESSION_SETUP is processed as a non-first element of a compounded
    SMB2 request, the calculation omits work->next_smb2_rsp_hdr_off.
    
    This causes out_len to overstate remaining buffer headroom by
    the cumulative size of prior responses in the compound chain. Consequently,
    the length check in ksmbd_krb5_authenticate()
    (*out_len <= resp->spnego_blob_len) passes erroneously, allowing memcpy()
    to write the AP-REP blob past the end of response_buf into adjacent kernel
    heap memory.
    
    Fix this by subtracting work->next_smb2_rsp_hdr_off when computing out_len,
    ensuring it accurately reflects physical remaining buffer space.
    
    Signed-off-by: Ilan Dudnik <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ksmbd: initialize FileSystemControlFlags in FS_CONTROL_INFORMATION [+ + +]
Author: Aleksandr Khromov <[email protected]>
Date:   Thu Oct 22 15:23:23 2026 -0400

    ksmbd: initialize FileSystemControlFlags in FS_CONTROL_INFORMATION
    
    [ Upstream commit c0cd3fc6824122014da2b3b0cb7ddeaa2946ec8e ]
    
    smb2_get_info_filesystem() reports 48 bytes for FS_CONTROL_INFORMATION,
    that is the whole of struct smb2_fs_control_info, but never assigns
    FileSystemControlFlags.  Those four bytes go to the client as they are
    found in the response buffer.
    
    The buffer is zeroed on allocation, so a standalone request leaks
    nothing.  A compound request can leak: the offset of the next response
    is advanced by the length pinned for the previous one, so a reply that
    was written into the buffer and then dropped in favour of the short
    error response of smb2_set_err_rsp() stays there, and the next reply is
    laid over it with only the header cleared.
    
    ksmbd does not implement quota tracking, so report no control flags.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Cc: [email protected]
    Signed-off-by: Aleksandr Khromov <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ksmbd: zero the FS_OBJECT_ID_INFORMATION buffer before filling it in [+ + +]
Author: Aleksandr Khromov <[email protected]>
Date:   Thu Oct 22 15:27:17 2026 -0400

    ksmbd: zero the FS_OBJECT_ID_INFORMATION buffer before filling it in
    
    [ Upstream commit 399aa12450a61a5c73dc77e73f069ece9687c95d ]
    
    smb2_get_info_filesystem() reports 64 bytes for FS_OBJECT_ID_INFORMATION,
    that is the whole of struct object_id_info, but writes only 46 of them:
    
     - objid[] is 16 bytes, and when the volume UUID is not available only
       sizeof(stfs.f_fsid) (8) bytes are copied into it;
     - extended_info.version_string[] is STRING_LENGTH (28) bytes, and only
       strlen("1.1.0") (5) bytes are copied into it.
    
    The response buffer is zeroed on allocation (kvzalloc() in
    smb2_allocate_rsp_buf()), so for a standalone request the remaining 31
    bytes are zero.  In a compound request they need not be.  The offset of
    the next response is advanced by the length pinned for the previous one,
    so if a preceding command wrote its reply into the buffer and then
    failed, smb2_set_err_rsp() pins only the short error response and the
    next reply lands inside the area that has already been written.  Only
    the header is cleared there:
    
            memset((char *)rsp_hdr, 0, sizeof(struct smb2_hdr) + 2);
    
    The client then receives up to 31 bytes of a response it was not meant
    to see, including one that failed with an access denied error.
    
    Clear the structure before filling it in.  As a side effect
    version_string is now NUL terminated.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Suggested-by: ChenXiaoSong <[email protected]>
    Cc: [email protected]
    Signed-off-by: Aleksandr Khromov <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
KVM: arm64: Don't use the VMA to size stage-2 block mappings for VM_PFNMAP [+ + +]
Author: Mostafa Saleh <[email protected]>
Date:   Tue Oct 6 13:25:13 2026 +0000

    KVM: arm64: Don't use the VMA to size stage-2 block mappings for VM_PFNMAP
    
    [ Upstream commit 71cc2c67fb8f8d5aa8154eb482e9846d2214f11b ]
    
    get_vma_page_shift() derives the stage-2 block size for VM_PFNMAP VMAs
    from the VMA layout alone, which does not necessarily match what
    stage-1 maps for that VMA.
    
    Upstream commit 71cc2c67fb8f ("KVM: arm64: Use stage-1 leaf size for
    VM_PFNMAP") drops that calculation and lets transparent_hugepage_adjust()
    derive the mapping size from the stage-1 leaf instead. The second part
    is not applicable here: in this kernel transparent_hugepage_adjust()
    takes a reference on the backing struct page, which is not safe for
    MMIO, and stage-1 has no huge PFNMAP before v6.12 anyway. Only drop the
    VMA-based calculation, so VM_PFNMAP VMAs are mapped at PAGE_SIZE.
    
    Fixes: 2aa53d68cee6 ("KVM: arm64: Try stage2 block mapping for host device MMIO")
    Cc: [email protected]
    Signed-off-by: Mostafa Saleh <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

KVM: arm64: vgic-its: Don't dereference a NULL collection on ITT save [+ + +]
Author: Fuad Tabba <[email protected]>
Date:   Thu Oct 22 17:45:37 2026 +0000

    KVM: arm64: vgic-its: Don't dereference a NULL collection on ITT save
    
    [ Upstream commit c6c156d931c33b92362383cf76f6d6e1291dcbfe ]
    
    MAPC with V=0 drops ite->collection but leaves the ITE on the device's
    ITT list, and vgic_its_save_ite() dereferences it unconditionally. A
    guest that issues MAPD, MAPTI and then MAPC(V=0) therefore oopses the
    host when the VMM issues KVM_DEV_ARM_ITS_SAVE_TABLES to migrate it.
    That sequence is UNPREDICTABLE per the architecture, but KVM already
    handles the resulting state in the translate, MOVI and DISCARD paths.
    
    Save a zeroed entry, which vgic_its_restore_ite() reads back as
    invalid. Skipping the ITE instead would leave the ITT slot holding
    whatever is in guest memory, and restore rejects an entry naming a
    collection the restored collection table does not have.
    
    Fixes: eff484e0298da ("KVM: arm64: vgic-its: ITT save and restore")
    Cc: [email protected]
    Signed-off-by: Fuad Tabba <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Oliver Upton <[email protected]>
    [aarnahmd: Upstream vgic_its_write_entry_lock() takes in the kind of table
     entry (ite) and looks up its size, while 5.15 takes in the size of an ite
     directly via ite_esz, because commit 3b2c81d5feb2 ("KVM: arm64: vgic-its:
     Add stronger type-checking to the ITS entry sizes") is not in 5.15.]
    Signed-off-by: Aaron Ahmed <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

KVM: nVMX: Reset MMU back to the root MMU if loading L2 state fails for !VM-Entry [+ + +]
Author: Amirmohammad Eftekhar <[email protected]>
Date:   Thu Oct 1 14:43:54 2026 -0700

    KVM: nVMX: Reset MMU back to the root MMU if loading L2 state fails for !VM-Entry
    
    commit c8f4cfe1cf93bce924e27f2abead7a4c4a487505 upstream.
    
    Reset the vCPU's MMU pointer back to the root MMU if loading L2 state fails
    in the "not from VM-Entry" case, i.e. when emulating RSM or handling
    KVM_SET_NESTED_STATE.  Failure to unwind the MMU pointer results in KVM
    trying to run L1 with a nested MMU, and is especially problematic if the
    vCPU manages to free its nested state before the VM crashes.  Constructing
    the root for a nested EPT MMU goes through vmcs12, which is dynamically
    allocated/freed when nVMX is enabled/disabled.  And so if the nested state
    is freed with the MMU still pointing at the nested MMU, KVM will hit a NULL
    pointer deref when attempting to get L1=>L2 EPTP.
    
      BUG: kernel NULL pointer dereference, address: 0000000000000078
      #PF: supervisor read access in kernel mode
      #PF: error_code(0x0000) - not-present page
      PGD 114a2d067 P4D 111743067 PUD 11141f067 PMD 0
      Oops: Oops: 0000 [#1] SMP
      CPU: 20 UID: 1000 PID: 1272 Comm: nested_tdp_faul Not tainted 7.3.0-rc4-8c89f11d1a99b-sink-vm #1914 PREEMPTLAZY
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
      RIP: 0010:nested_ept_get_eptp+0xb/0x10 [kvm_intel]
      Call Trace:
       <TASK>
       kvm_mmu_load+0xcd/0x870 [kvm]
       kvm_arch_vcpu_ioctl_run+0x18f5/0x1f80 [kvm]
       kvm_vcpu_ioctl+0x2c7/0x970 [kvm]
       __x64_sys_ioctl+0x90/0xd0
       do_syscall_64+0x9c/0x4d0
       entry_SYSCALL_64_after_hwframe+0x4b/0x53
      RIP: 0033:0x47491b
       </TASK>
      Modules linked in: kvm_intel kvm irqbypass
      CR2: 0000000000000078
      ---[ end trace 0000000000000000 ]---
      RIP: 0010:nested_ept_get_eptp+0xb/0x10 [kvm_intel]
    
    Cc: David Woodhouse <[email protected]>
    Fixes: 72e9cbdb4338 ("KVM: nVMX: fix SMI injection in guest mode")
    Fixes: 8fcc4b5923af ("kvm: nVMX: Introduce KVM_CAP_NESTED_STATE")
    Cc: [email protected]
    Signed-off-by: Amirmohammad Eftekhar <[email protected]>
    [sean: write changelog]
    Signed-off-by: Sean Christopherson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Bonzini <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: s390: Zero initialize data structures for inject_pfault_token [+ + +]
Author: Christian Borntraeger <[email protected]>
Date:   Fri Sep 11 08:26:55 2026 -0400

    KVM: s390: Zero initialize data structures for inject_pfault_token
    
    [ Upstream commit 4e2c7f7cbc27418f9a290399b986c1b85ff93b90 ]
    
    __kvm_inject_pfault_token() only sets .type and .u.ext.ext_params2 of
    the on-stack struct kvm_s390_irq but the full ext substructure is copied
    into the cpu local variable on inject. ext_params and pad contain stale
    stack values.
    
    Interrupt delivery only uses ext_params2, so nothing leaks to the guest,
    but a host user can use the migration ioctls to get to the data.
    
    Fix by zero-initializing the irq struct.
    Do the same for the inti data structure.
    
    Fixes: 383d0b050106 ("KVM: s390: handle pending local interrupts via bitmap")
    Cc: [email protected]
    Signed-off-by: Christian Borntraeger <[email protected]>
    Reviewed-by: Matthew Rosato <[email protected]>
    Reviewed-by: Claudio Imbrenda <[email protected]>
    Signed-off-by: Claudio Imbrenda <[email protected]>
    Message-ID: <[email protected]>
    [ Adjusted context for missing inti_mem and ret declarations in __kvm_inject_pfault_token(). ]
    Signed-off-by: Sasha Levin <[email protected]>

KVM: SVM: Use the active VMCB's MSR bitmap when checking if MSR is intercepted [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Wed Oct 7 01:27:54 2026 -0400

    KVM: SVM: Use the active VMCB's MSR bitmap when checking if MSR is intercepted
    
    [ Upstream commit 9e06bbb9ade7cdf28d4a3b5b14e5812881c8df85 ]
    
    Use the MSR permission bitmap of the active VMCB instead of assuming that
    KVM is always using vmcb02's bitmap when L2 is active, as KVM uses msrpm02
    if and only if L1 wants to intercept MSR accesses, i.e. if and only if KVM
    needs to merge msprm01 with msrpm12.
    
    Don't bother tracking the virtual address of the bitmap that's being used,
    as __va() is cheap on x86, and caching the virtual address would introduce
    yet another source of potentially stale information.
    
    Fixes: b2ac58f90540 ("KVM/SVM: Allow direct access to MSR_IA32_SPEC_CTRL")
    Cc: [email protected]
    Reported-by: Stefan Teodorescu <[email protected]>
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-ID: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    [ sashal: Adapted SVM access to use to_svm(vcpu) with the existing kvm_vcpu parameter. ]
    Signed-off-by: Sasha Levin <[email protected]>

KVM: x86/mmu: Preserve nested TDP shadow page tables if they are used as roots [+ + +]
Author: Hyunwoo Kim <[email protected]>
Date:   Tue Oct 20 19:49:21 2026 -0700

    KVM: x86/mmu: Preserve nested TDP shadow page tables if they are used as roots
    
    [ Upstream commit 7a2c70e777a00c32ebafd376a6fe31ebb91c5b20 ]
    
    kvm_mmu_zap_oldest_mmu_pages() excludes a shadow page whose root_count
    is non-zero from top-level reclaim, because such a page cannot be
    freed. The path in mmu_page_zap_pte() that recursively zaps a parentless
    nested TDP child has no such check. As a result, a shadow page can
    be zapped even if the page itself can't be freed; as the comment in
    kvm_mmu_zap_oldest_mmu_pages() notes, zapping it will just force vCPUs
    to rebuild the page.
    
    As in top-level reclaim, do not recursively prepare zapping of a
    nested TDP child whose root_count is non-zero.
    
    Fixes: 2de4085cccea ("KVM: x86/MMU: Recursively zap nested TDP SPs when zapping last/only parent")
    Signed-off-by: Hyunwoo Kim <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    [sean: resolve minor conflict due to lack of lockless aging in 5.15]
    Signed-off-by: Sean Christopherson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

KVM: x86: Use active memslots for the per-vCPU MMIO cache [+ + +]
Author: Jinu Kim <[email protected]>
Date:   Fri Aug 7 20:28:18 2026 +0900

    KVM: x86: Use active memslots for the per-vCPU MMIO cache
    
    commit b3e6212dea2e4328a841ceb37f377583176dc735 upstream.
    
    KVM tags the per-vCPU MMIO cache with a memslot generation so that a
    memslot update invalidates cached MMIO information.  Both the fill and
    validation paths use kvm_memslots(), which unconditionally selects address
    space 0, even when the vCPU is running in SMM and using address space 1.
    
    Commit 56f17dd3fbc4 ("kvm: x86: fix stale mmio cache bug") added the
    memslot generation to the cache key so that a memslot update could not
    leave a stale entry valid.  When commit 699023e23965 ("KVM: x86: add SMM
    to the MMU role, support SMRAM address space") added the SMM address space,
    these helpers were not converted to use the active memslots.
    
    Consequently, an update to the SMM memslots can leave an entry from the old
    SMM address space apparently valid after the vCPU returns to the normal
    address space.  A guest can then cause an access to valid RAM at the same
    GFN to be returned to userspace as KVM_EXIT_MMIO.
    
    Completing that exit through the VMM's RAM address space writes the backing
    page without going through KVM's write-tracking path.  If the page backs a
    nested EPT table, KVM can continue using shadow translations derived from
    the old contents.  The WARN_ON_ONCE() in kvm_mmu_write_protect_fault()
    catches this invalid cache and memslot combination.
    
    Use the vCPU's active memslots when caching and validating the entry.
    Memslot generations are unique across address spaces, so the generation
    also distinguishes the normal and SMM views.  This matches the MMIO SPTE
    cache, which already uses kvm_vcpu_memslots().
    
    On an unpatched current-mainline kernel, a regression test that fills the
    cache in SMM and updates only the SMM memslots fails the intended RAM write
    and triggers the kvm_mmu_write_protect_fault() warning.  With this change,
    the same test completes the RAM write without a warning.  The x86/smm_test,
    set_memory_region_test, and memslot_modification_stress_test selftests also
    pass.
    
    Fixes: 699023e23965 ("KVM: x86: add SMM to the MMU role, support SMRAM address space")
    Cc: [email protected]
    Signed-off-by: Jinu Kim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sean Christopherson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Linux: Linux 5.15.224 [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Fri Oct 30 12:57:45 2026 +0100

    Linux 5.15.224
    
    Link: https://lore.kernel.org/r/[email protected]
    Tested-by: Florian Fainelli <[email protected]>
    Tested-by: Richard Narron <[email protected]>
    Tested-by: Brett A C Sheffield <[email protected]>
    Tested-by: Pavel Machek (CIP) <[email protected]>
    Tested-by: Ron Economos <[email protected]>
    Tested-by: SJ Park <[email protected]>
    Tested-by: Shuah Khan <[email protected]>
    Tested-by: Barry K. Nathan <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
lockd: fix swapped arguments in nlmsvc_match_ip() [+ + +]
Author: Oscar Ou <[email protected]>
Date:   Wed Sep 9 06:57:22 2026 -0400

    lockd: fix swapped arguments in nlmsvc_match_ip()
    
    [ Upstream commit b9060689f49dc663e9a3d069c4a65ff63a836e66 ]
    
    When releasing locks by server IP address via /proc/fs/nfsd/unlock_ip,
    nlmsvc_unlock_all_by_ip() calls nlm_traverse_files() with the server
    sockaddr as the opaque @data argument:
    
            nlm_traverse_files(server_addr, nlmsvc_match_ip, NULL);
    
    The match callback is later invoked from nlm_traverse_locks() as:
    
            match(lockhost, host);
    
    where the first argument is the nlm_host that owns the lock, and the
    second argument is the @data that was originally passed down (here the
    server sockaddr).  This is the convention every other match callback
    relies on (nlmsvc_mark_host(), nlmsvc_same_host(), nlmsvc_is_client()):
    arg1 is the real nlm_host, arg2 is the caller-supplied reference value.
    
    nlmsvc_match_ip() has had these two arguments reversed ever since the
    unlock-by-IP feature was introduced in commit 4373ea84c84d ("lockd:
    unlock lockd locks associated with a given server ip"):
    
            return rpc_cmp_addr(nlm_srcaddr(host), datap);
    
    Here @host is actually the server sockaddr, so nlm_srcaddr(host)
    dereferences a struct sockaddr as a struct nlm_host and reads garbage
    at the offset of h_srcaddr; meanwhile @datap is actually the lock
    owner's nlm_host but is compared as a sockaddr.  As a result the
    comparison practically never matches and locks are not released for the
    requested IP.
    
    Swap the arguments so the lock owner's source address is compared
    against the requested server address:
    
            return rpc_cmp_addr(nlm_srcaddr(datap), (struct sockaddr *)host);
    
    Fixes: 4373ea84c84d ("lockd: unlock lockd locks associated with a given server ip")
    Cc: [email protected]
    Signed-off-by: Oscar Ou <[email protected]>
    [ cel: fix the misleading typedef parameter names too ]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mctp: Add refcounts to mctp_dev [+ + +]
Author: Jeremy Kerr <[email protected]>
Date:   Wed Sep 29 15:26:08 2021 +0800

    mctp: Add refcounts to mctp_dev
    
    [ Upstream commit 43f55f23f70881e9c397557f15c8090b368d0af2 ]
    
    Currently, we tie the struct mctp_dev lifetime to the underlying struct
    net_device, and hold/put that device as a proxy for a separate mctp_dev
    refcount. This works because we're not holding any references to the
    mctp_dev that are different from the netdev lifetime.
    
    In a future change we'll break that assumption though, as we'll need to
    hold mctp_dev references in a workqueue, which might live past the
    netdev unregister notification.
    
    In order to support that, this change introduces a refcount on the
    mctp_dev, currently taken by the net_device->mctp_ptr reference, and
    released on netdev unregister events. We can then use this for future
    references that might outlast the net device.
    
    Signed-off-by: Jeremy Kerr <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Stable-dep-of: aadf655e8ea9 ("net/mctp: publish the mctp_dev only after it is initialised")
    Signed-off-by: Sasha Levin <[email protected]>

 
md: move initialization and destruction of 'io_acct_set' to md.c [+ + +]
Author: Yu Kuai <[email protected]>
Date:   Thu Jun 22 00:51:03 2023 +0800

    md: move initialization and destruction of 'io_acct_set' to md.c
    
    [ Upstream commit c567c86b90d4715081adfe5eb812141a5b6b4883 ]
    
    'io_acct_set' is only used for raid0 and raid456, prepare to use it for
    raid1 and raid10, so that io accounting from different levels can be
    consistent.
    
    By the way, follow up patches will also use this io clone mechanism to
    make sure 'active_io' represents in flight io, not io that is dispatching,
    so that mddev_suspend will wait for io to be done as designed.
    
    Signed-off-by: Yu Kuai <[email protected]>
    Reviewed-by: Xiao Ni <[email protected]>
    Signed-off-by: Song Liu <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
media: rkvdec: Propagate platform_get_irq() errors [+ + +]
Author: Narasimharao Vadlamudi <[email protected]>
Date:   Fri Sep 11 08:47:10 2026 -0400

    media: rkvdec: Propagate platform_get_irq() errors
    
    [ Upstream commit c37aca64206fafe938119e801a3fd10a537a051f ]
    
    platform_get_irq() returns a positive IRQ number on success and a
    negative error code on failure. It no longer returns zero. The driver
    currently returns -ENXIO for all failures, which loses useful errors
    such as -EPROBE_DEFER.
    
    Return the error from platform_get_irq() directly.
    
    Fixes: cd33c830448b ("media: rkvdec: Add the rkvdec driver")
    Cc: [email protected]
    Signed-off-by: Narasimharao Vadlamudi <[email protected]>
    Reviewed-by: Detlev Casanova <[email protected]>
    Signed-off-by: Nicolas Dufresne <[email protected]>
    Signed-off-by: Hans Verkuil <[email protected]>
    [ adjusted the patch path to drivers/staging/media/rkvdec/rkvdec.c. ]
    Signed-off-by: Sasha Levin <[email protected]>

media: saa7164: fix cleanup on resource allocation failure [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Fri Sep 11 08:08:41 2026 -0400

    media: saa7164: fix cleanup on resource allocation failure
    
    [ Upstream commit 28e84c6e2e6753ed238ea097b2842a32a6a6879b ]
    
    saa7164_dev_setup() adds the device to the global saa7164_devlist before
    requesting the PCI BAR memory regions.
    
    If get_resources() fails, saa7164_dev_setup() decrements the device count
    and returns an error, but leaves the device on saa7164_devlist. The probe
    error path then frees the device, leaving a dangling entry on the global
    list.
    
    Reuse the existing MMIO mapping error path to remove the device from
    saa7164_devlist and decrement the device count before returning.
    
    Also release BAR0 if it was successfully requested but the BAR2 request
    fails.
    
    Fixes: 443c1228d505 ("V4L/DVB (12923): SAA7164: Add support for the NXP SAA7164 silicon")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Hans Verkuil <[email protected]>
    [ Inlined err_devlist cleanup with explicit mutex locking because the shared MMIO cleanup path is absent. ]
    Signed-off-by: Sasha Levin <[email protected]>

media: zoran: Avoid freeing a registered video_device twice [+ + +]
Author: Ruoyu Wang <[email protected]>
Date:   Fri Sep 11 08:29:43 2026 -0400

    media: zoran: Avoid freeing a registered video_device twice
    
    [ Upstream commit 0735e0b5a96761a9ce277a238e834008ad92a0a5 ]
    
    zoran_init_video_device() installs zoran_vdev_release() as the
    video_device release callback through zoran_template. After
    video_register_device() succeeds, video_unregister_device() drops the
    registered video_device reference and the V4L2 core eventually invokes
    that release callback, which kfree()s the video_device.
    
    zoran_exit_video_devices() called video_unregister_device() and then
    kfree(zr->video_dev), so device teardown could free the same
    video_device twice.
    
    Remove the direct kfree() and clear the cached pointer after
    unregistering. The pre-registration failure path keeps its manual free
    because the video_device was not registered there.
    
    This issue was found by a static analysis checker and confirmed by
    manual source review.
    
    Fixes: 82e3a496eb56 ("media: staging: media: zoran: move videodev alloc")
    Cc: [email protected]
    Signed-off-by: Ruoyu Wang <[email protected]>
    Signed-off-by: Hans Verkuil <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
memstick: core: wait for request completion before freeing card [+ + +]
Author: Raj Ojha <[email protected]>
Date:   Fri Sep 25 00:59:55 2026 +0530

    memstick: core: wait for request completion before freeing card
    
    commit aa0a37b5024d921e96ac4f8f487c8bfbf1f1a582 upstream.
    
    In memstick_alloc_card() and memstick_set_rw_addr(),
    wait_for_completion_timeout() is used to wait for device identification
    and address configuration requests to complete.
    
    The memstick subsystem does not provide an abort or cancellation
    callback in struct memstick_host for in-flight requests. If
    wait_for_completion_timeout() expires (for instance, when a USB transfer
    or command retry is delayed), memstick_alloc_card() returns an error and
    frees the memstick_dev structure via kfree(card).
    
    However, the host controller driver (such as rtsx_usb_ms) is still
    running the request asynchronously in worker context. When the transfer
    eventually finishes, the driver writes into host->req->data, which
    points to memory inside the already freed card structure. This leads to
    a KASAN slab-use-after-free write:
    
      BUG: KASAN: slab-use-after-free in ms_read_bytes+0x8fe/0x990
      Write of size 1 at addr ffff88813c188079 by task kworker/1:5/5239
      Workqueue: events rtsx_usb_ms_handle_req
      Call Trace:
       ms_read_bytes+0x8fe/0x990 drivers/memstick/host/rtsx_usb_ms.c:450
       rtsx_usb_ms_issue_cmd drivers/memstick/host/rtsx_usb_ms.c:477 [inline]
       rtsx_usb_ms_handle_req+0x557/0x1a00 drivers/memstick/host/rtsx_usb_ms.c:531
       process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
       worker_thread+0x5ef/0xe50 kernel/workqueue.c:3560
       kthread+0x373/0x450 kernel/kthread.c:436
    
      Allocated by task 1662:
       memstick_alloc_card drivers/memstick/core/memstick.c:383 [inline]
       memstick_check+0x2c1/0x10d0 drivers/memstick/core/memstick.c:452
       process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
    
      Freed by task 1662:
       kfree+0x20c/0x650 mm/slub.c:6792
       memstick_alloc_card drivers/memstick/core/memstick.c:420 [inline]
       memstick_check+0x72b/0x10d0 drivers/memstick/core/memstick.c:452
       process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
    
    Host controller drivers (rtsx_usb_ms, jmb38x_ms, tifm_ms, r592) already
    implement their own hardware and bus timeouts, and callers in
    mspro_block and ms_block already rely on wait_for_completion()
    unconditionally.
    
    Replace wait_for_completion_timeout() with wait_for_completion() in
    memstick_set_rw_addr() and memstick_alloc_card() so that the card
    structure is never freed while an asynchronous request is in flight.
    
    Fixes: baf8532a147d ("memstick: initial commit for Sony MemoryStick support")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=ccffdf05833ebdaeae70
    Cc: [email protected]
    Signed-off-by: Raj Ojha <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

memstick: rtsx_usb_ms: complete requests after eject instead of dropping them [+ + +]
Author: Nguyen Ngoc Thang <[email protected]>
Date:   Wed Sep 30 21:07:48 2026 +0700

    memstick: rtsx_usb_ms: complete requests after eject instead of dropping them
    
    commit c96ca94425b076dc398d929366e378d1e22ec794 upstream.
    
    memstick_check() can pass its host->removing check just before
    rtsx_usb_ms_drv_remove() sets eject/removing. Its next request is then
    silently dropped: rtsx_usb_ms_request() skips schedule_work() once eject
    is set, and drv_remove's cancel_work_sync() can also cancel a queued
    handle_req before it picks the request up. Nobody completes
    card->mrq_complete.
    
    Once memstick core waits for requests without a timeout ("memstick: core:
    wait for request completion before freeing card"), this hangs removal:
    memstick_check() never returns and memstick_remove_host() blocks in
    flush_workqueue():
    
      INFO: task kworker/u10:3:65 blocked for more than 20 seconds.
      Workqueue: kmemstick memstick_check
       __wait_for_common
       memstick_check
    
      INFO: task kworker/1:1:33 blocked for more than 20 seconds.
      Workqueue: usb_hub_wq hub_event
       __flush_workqueue
       memstick_remove_host
       rtsx_usb_ms_drv_remove
    
    Never drop a request. rtsx_usb_ms_request() always schedules handle_req,
    and handle_req fails requests with -ENOMEDIUM once eject is set, without
    touching the device. drv_remove flushes handle_req instead of cancelling
    it, and cancels it only after memstick_remove_host(), when no new
    request can arrive, so it cannot run on a freed host.
    
    The host_mutex drain in drv_remove is removed: handle_req always leaves
    host->req NULL when it finishes, so the drain never had anything to do,
    and it would now race with handle_req.
    
    Fixes: 99451dceeb5f ("memstick: Add realtek USB memstick host driver")
    Cc: [email protected]
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Nguyen Ngoc Thang <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
mm/huge_memory: transfer the pmd dirty bit to the folio on zap [+ + +]
Author: Usama Arif <[email protected]>
Date:   Sat Oct 24 16:38:48 2026 +0800

    mm/huge_memory: transfer the pmd dirty bit to the folio on zap
    
    [ Upstream commit fe6cf984939d8e12cb33a99673c8d026c5135e68 ]
    
    zap_huge_pmd_folio() propagates the pmd young bit to the folio for the
    file case, but not the dirty bit.  The pte path does propagate it, in
    zap_present_folio_ptes() and so does the pmd split path, in
    __split_huge_pmd_locked().
    
    For most file mappings the omission is harmless, because writing to a
    shared file mapping goes through page_mkwrite(), which dirties the folio.
    tmpfs is different: it has no page_mkwrite(), and vma_wants_writenotify()
    is false for it, so a *read* fault on a MAP_SHARED tmpfs mapping installs
    a writable pmd via do_read_fault().  do_read_fault() does not call
    fault_dirty_shared_page(), so subsequent stores through that mapping set
    only the hardware dirty bit in the pmd and never call folio_mark_dirty().
    A shmem folio allocated by a fault is marked uptodate but not dirty (see
    the clear: block in shmem_get_folio_gfp()), so PG_dirty is never set at
    all.
    
    Unmapping such a folio - munmap(), or exit_mmap() when the process dies -
    then loses the only record that it was written, because zap_huge_pmd()
    drops the pmd without transferring the dirty bit.  Reclaim afterwards sees
    a clean shmem folio: the whole swap-out block in shrink_folio_list() is
    inside "if (folio_test_dirty(folio))", so pageout() is skipped and the
    folio falls into __remove_mapping().  There, folio_is_file_lru() is false
    for a swapbacked folio, so no shadow entry is created and
    __filemap_remove_folio(folio, NULL) simply empties the i_pages slot.  The
    data is freed without ever being written to swap, and the next fault on
    that index returns a freshly zeroed folio.
    
    This is silent data loss for any process that keeps state in a MAP_SHARED
    tmpfs segment across an unmap - for example a cache handed from one
    process generation to the next through /dev/shm.  It requires the folio to
    be PMD-mapped, so it only shows up once shmem THP is enabled (which is
    what we did in Meta fleet and started noticing crashes); with THP off the
    pte path transfers the dirty bit correctly.  It also only becomes visible
    when swap is enabled, because with no swap device shmem folios (which are
    on the anon LRU) are not scanned by reclaim at all, so the clean folio is
    never dropped.
    
    Reproduced on x86_64 with a tmpfs mounted huge=within_size: read-fault a
    2MB-backed region, write a known pattern through the resulting mapping,
    munmap, force reclaim of the cgroup, then re-map and read back.  Without
    this patch the region reads back as zeros and vmstat shows zswpout 0 - the
    data was discarded rather than swapped.  With this patch the region reads
    back correctly and the pages are swapped out as expected.  With
    huge=never, or when the first touch is a write, the test passes either
    way.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: b5072380eb61 ("thp: support file pages in zap_huge_pmd()")
    Signed-off-by: Usama Arif <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Reviewed-by: Kiryl Shutsemau <[email protected]>
    Acked-by: Hugh Dickins <[email protected]>
    Tested-by: Lance Yang <[email protected]>
    Reviewed-by: Zi Yan <[email protected]>
    Reviewed-by: Lorenzo Stoakes (ARM) <[email protected]>
    Reviewed-by: Baolin Wang <[email protected]>
    Cc: Barry Song <[email protected]>
    Cc: Dev Jain <[email protected]>
    Cc: Johannes Weiner <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Nhat Pham <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: Ryan Roberts <[email protected]>
    Cc: Shakeel Butt <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ Ting-Han: zap_huge_pmd_folio() does not exist in this tree; the file
      branch is open-coded in zap_huge_pmd(), so transfer the dirty bit
      there. This tree has no folio_mark_dirty(), so use set_page_dirty()
      on the head page, as zap_pte_range() does for dirty ptes ]
    Assisted-by: LLM
    Signed-off-by: Ting-Han Hou <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/hugetlb: fix avoid_reserve to allow taking folio from subpool [+ + +]
Author: Peter Xu <[email protected]>
Date:   Sat Sep 26 09:39:16 2026 +0200

    mm/hugetlb: fix avoid_reserve to allow taking folio from subpool
    
    commit 58db7c5fbe7daa42098d4965133a864f98ba90ba upstream.
    
    Patch series "mm/hugetlb: Refactor hugetlb allocation resv accounting",
    v2.
    
    This is a follow up on Ackerley's series here as replacement:
    
    https://lore.kernel.org/r/[email protected]
    
    The goal of this series is to cleanup hugetlb resv accounting, especially
    during folio allocation, to decouple a few things:
    
      - Hugetlb folios v.s. Hugetlbfs: IOW, the hope is in the future hugetlb
        folios can be allocated completely without hugetlbfs.
    
      - Decouple VMA v.s. hugetlb folio allocations: allocating a hugetlb folio
        should not always require a hugetlbfs VMA.  For example, either it got
        allocated from the inode level (see hugetlbfs_fallocate() where it used
        a pesudo VMA for allocation), or it can be allocated by other kernel
        subsystems.
    
    It paves way for other users to allocate hugetlb folios out of either
    system reservations, or subpools (instead of hugetlbfs, as a file system).
    For longer term, this prepares hugetlb as a separate concept versus
    hugetlbfs, so that hugetlb folios can be allocated by not only hugetlbfs
    and other things.
    
    Tests I've done:
    
    - I had a reproducer in patch 1 for the bug I found, this will start to
      work after patch 1 or the whole set applied.
    
    - Hugetlb regression tests (on x86_64 2MBs), includes:
    
      - All vmtests on hugetlbfs
    
      - libhugetlbfs test suite (which may fail some tests, but no new failures
        will be introduced by this series, so all such failures happen before
        this series so shouldn't be relevant).
    
    This patch (of 7):
    
    Since commit 04f2cbe35699 ("hugetlb: guarantee that COW faults for a
    process that called mmap(MAP_PRIVATE) on hugetlbfs will succeed"),
    avoid_reserve was introduced for a special case of CoW on hugetlb private
    mappings, and only if the owner VMA is trying to allocate yet another
    hugetlb folio that is not reserved within the private vma reserved map.
    
    Later on, in commit d85f69b0b533 ("mm/hugetlb: alloc_huge_page handle
    areas hole punched by fallocate"), alloc_huge_page() enforced to not
    consume any global reservation as long as avoid_reserve=true.  This
    operation doesn't look correct, because even if it will enforce the
    allocation to not use global reservation at all, it will still try to take
    one reservation from the spool (if the subpool existed).  Then since the
    spool reserved pages take from global reservation, it'll also take one
    reservation globally.
    
    Logically it can cause global reservation to go wrong.
    
    I wrote a reproducer below, trigger this special path, and every run of
    such program will cause global reservation count to increment by one, until
    it hits the number of free pages:
    
      #define _GNU_SOURCE             /* See feature_test_macros(7) */
      #include <stdio.h>
      #include <fcntl.h>
      #include <errno.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <sys/mman.h>
    
      #define  MSIZE  (2UL << 20)
    
      int main(int argc, char *argv[])
      {
          const char *path;
          int *buf;
          int fd, ret;
          pid_t child;
    
          if (argc < 2) {
              printf("usage: %s <hugetlb_file>\n", argv[0]);
              return -1;
          }
    
          path = argv[1];
    
          fd = open(path, O_RDWR | O_CREAT, 0666);
          if (fd < 0) {
              perror("open failed");
              return -1;
          }
    
          ret = fallocate(fd, 0, 0, MSIZE);
          if (ret != 0) {
              perror("fallocate");
              return -1;
          }
    
          buf = mmap(NULL, MSIZE, PROT_READ|PROT_WRITE,
                     MAP_PRIVATE, fd, 0);
    
          if (buf == MAP_FAILED) {
              perror("mmap() failed");
              return -1;
          }
    
          /* Allocate a page */
          *buf = 1;
    
          child = fork();
          if (child == 0) {
              /* child doesn't need to do anything */
              exit(0);
          }
    
          /* Trigger CoW from owner */
          *buf = 2;
    
          munmap(buf, MSIZE);
          close(fd);
          unlink(path);
    
          return 0;
      }
    
    It can only reproduce with a sub-mount when there're reserved pages on the
    spool, like:
    
      # sysctl vm.nr_hugepages=128
      # mkdir ./hugetlb-pool
      # mount -t hugetlbfs -o min_size=8M,pagesize=2M none ./hugetlb-pool
    
    Then run the reproducer on the mountpoint:
    
      # ./reproducer ./hugetlb-pool/test
    
    Fix it by taking the reservation from spool if available.  In general,
    avoid_reserve is IMHO more about "avoid vma resv map", not spool's.
    
    I copied stable, however I have no intention for backporting if it's not a
    clean cherry-pick, because private hugetlb mapping, and then fork() on top
    is too rare to hit.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Fixes: d85f69b0b533 ("mm/hugetlb: alloc_huge_page handle areas hole punched by fallocate")
    Signed-off-by: Peter Xu <[email protected]>
    Reviewed-by: Ackerley Tng <[email protected]>
    Tested-by: Ackerley Tng <[email protected]>
    Reviewed-by: Oscar Salvador <[email protected]>
    Cc: Breno Leitao <[email protected]>
    Cc: Muchun Song <[email protected]>
    Cc: Naoya Horiguchi <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: Roman Gushchin <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ Karl Mehltretter: The upstream changes map directly to this stable tree's
      page-based HugeTLB API. The backport retains this stable tree's inline
      free-minus-reserved calculation and direct -ENOSPC return; the functional
      changes otherwise match upstream. ]
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/mremap: fix locked_vm leak by splitting VMA for MREMAP_DONTUNMAP [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Mon Oct 12 20:04:59 2026 -0400

    mm/mremap: fix locked_vm leak by splitting VMA for MREMAP_DONTUNMAP
    
    [ Upstream commit 597e4b9ab48a3f841080f627722064853d3f650e ]
    
    The MREMAP_DONTUNMAP feature is highly unusual in that it permits mremap()
    operations that keep the original VMA in place.
    
    Historically this has led to a lot of bugs where non-obvious interactions
    occur between existing mremap() operations and the original VMA.
    
    Fix another of these - partial copies.
    
    The long-standing mremap() partial VMA logic has the baked-in assumption
    that the originating VMA is unmapped and thus moved.
    
    However MREMAP_DONTUNMAP defeats this by performing a partial copy
    instead since it keeps the source VMA around.
    
    An mremap(..., MREMAP_DONTUNMAP) operation disallows resizing of the VMA,
    but the operation can be performed partially:
    
                               |-----------------|
                               |                 |
                               |                 v
                            <------>          <------>
                            .new_sz.           new_sz
                         |--.------.--|       |------|
                         |  .source.  |       | dest |
                         |--.------.--|       |------|
                         <------------>
                             old_sz
    
    The page tables in the specified range are moved, but the original VMA is
    kept intact.
    
    This interacts poorly with mlock()'d VMAs, as the VMA_LOCKED_BIT flag is
    cleared for the entire source VMA and set for the entire destination VMA.
    
    This results in an mm->locked_vm leak as the change is therefore not
    accounted correctly.
    
    The clear solution here is to make the portion of the source VMA which is
    mremap()'d distinct from the rest of it, a.k.a. split it.
    
    Therefore resolve this issue by splitting it ahead of the rest of the
    mremap() operation if the VMA is mlock()'d.
    
    This is valid, as the source VMA will lose its VMA_LOCKED_BIT flag, so if a
    partial remap it will become distinct from the rest of the VMA.
    
    In order to make this change re-expose split_vma() in vma.h for
    CONFIG_MMU (nommu doesn't compile mremap.c and uses a static helper
    instead).
    
    Finally, update the sys_map_count check to account for this case.
    
    Note that the early check does not use needs_pre_split() - this is because
    the VMA has not been looked up by this point, so be conservative and assume
    that the VMA is mlock()'d in this case for the purposes of the
    sys_map_count check.
    
    Link: https://lore.kernel.org/20260930-fix-dontunmap-partial-self-merge-v2-2-f388985a0f0a@kernel.org
    Fixes: e346b3813067 ("mm/mremap: add MREMAP_DONTUNMAP to mremap()")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Reviewed-by: Pedro Falcato <[email protected]>
    Acked-by: Kiryl Shutsemau (Meta) <[email protected]>
    Reviewed-by: Jose A. Perez de Azpillaga <[email protected]>
    Tested-by: Anirudh Srinivasan <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Vlastimil Babka <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Brian Geffon <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: <[email protected]>
    [ sashal: Inlined VMA preparation into move_vma() because the upstream preparation helpers are absent. ]
    Signed-off-by: Sasha Levin <[email protected]>

mm/mremap: fix locked_vm leak from MREMAP_DONTUNMAP self-merge [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Tue Oct 13 18:07:30 2026 +0100

    mm/mremap: fix locked_vm leak from MREMAP_DONTUNMAP self-merge
    
    [ Upstream commit 838bb60dc21553e32df90f2f3bac5b905376e7aa ]
    
    The MREMAP_DONTUNMAP feature is highly unusual in that it permits mremap()
    operations that keep the original VMA in place.
    
    Historically this has led to a lot of bugs where non-obvious interactions
    occur between existing mremap() operations and the original VMA.
    
    Fix another of these - self-merge.
    
    Self-merge occurs when a VMA is moved in front of or behind itself and the
    attributes of the VMA permit such a merge.
    
    Practically this can only happen for unfaulted anonymous VMAs due to the
    page offset equality requirement for merge:
    
                               |------------|
                               |            |
                               |            v
            |...........||-----------||...........|
            |           || unfaulted ||           |
            |...........||-----------||...........|
                  ^            |
                  |            |
                  |------------|
    
    This becomes problematic if the VMA is configured by the user to
    mlock-on-fault, i.e. the VMA_LOCKED_BIT, VMA_LOCKONFAULT_BIT VMA flags are
    set.
    
    MREMAP_DONTUNMAP clears mlock flags for the source VMA and maintains them
    for the destination VMA.
    
    Self-merge makes this impossible (there is only one VMA) and incorrectly
    clears the destination VMA's mlock flags.
    
    This causes a leak in mm->locked_vm as clearing this flag does not
    decrement the counter and the VMA no longer has VMA_LOCKED_BIT set so it
    is not decremented on unmap.
    
    Resolve this by simply disallowing a self-merge in this case - the source
    and destination VMAs are kept distinct and then are able to have distinct
    mlock() flags.
    
    Update to make the now-redundant self-merge check a VM_WARN_ON_ONCE()
    instead to guard against future regressions.
    
    Fixes: e346b3813067 ("mm/mremap: add MREMAP_DONTUNMAP to mremap()")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Reviewed-by: Pedro Falcato <[email protected]>
    Acked-by: Kiryl Shutsemau (Meta) <[email protected]>
    Reviewed-by: Jose A. Perez de Azpillaga <[email protected]>
    Tested-by: Anirudh Srinivasan <[email protected]>
    Cc: <[email protected]>
    [ ljs - Converted to work with vma_merge(), tweaked commit msg. ]
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

mm/mremap: reset unfaulted VMA page offset for MREMAP_DONTUNMAP [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Fri Sep 11 06:51:33 2026 -0400

    mm/mremap: reset unfaulted VMA page offset for MREMAP_DONTUNMAP
    
    [ Upstream commit 35b0fb391b0df57383bc15985bb769f4555c97ba ]
    
    Uniquely an mremap() invocation using the MREMAP_DONTUNMAP flag can reset
    a faulted VMA into an unfaulted one.
    
    It does so after the page tables have been moved to the copied VMA with
    MREMAP_DONTUNMAP leaving the old VMA in place which is naturally unfaulted
    as the page tables it had are no longer present.
    
    However, in doing so, it violates the invariant that the anonymous page
    offset of an unfaulted VMA is vma->vm_start >> PAGE_SHIFT.
    
    This is because a VMA may have been faulted in, mremap()'d (causing a
    delta between its page offset and vma->vm_start >> PAGE_SHIFT), and then
    mremap()'d again with MREMAP_DONTUNMAP resulting in the unfaulting.
    
    This condition is a violation of a fundamental assumption in mm, but now
    also triggers an assert in assert_sane_pgoff() which explicitly checks for
    this condition.
    
    Correct it by resetting the VMA's page offset at the point of completing
    the MREMAP_DONTUNMAP operation.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: 1583aa278f5f ("mm: mremap: unlink anon_vmas when mremap with MREMAP_DONTUNMAP success")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/
    Tested-by: [email protected]
    Acked-by: Vlastimil Babka (SUSE) <[email protected]>
    Reviewed-by: Kunwu Chan <[email protected]>
    Reviewed-by: Pedro Falcato <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Li Xinhai <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ adapted dontunmap_complete() changes to move_vma() using direct vm_pgoff assignment instead of unavailable helpers. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/rmap: fix missing barrier between anon_vma init and vma->anon_vma publish [+ + +]
Author: Jinjiang Tu <[email protected]>
Date:   Tue Sep 29 15:30:16 2026 -0400

    mm/rmap: fix missing barrier between anon_vma init and vma->anon_vma publish
    
    [ Upstream commit b6ac0b3f6013c168f22cad97e79967accacb08e1 ]
    
    On arm64 server, we find that a task trying to grab the anon_vma lock
    triggers hungtask.
    
    INFO: task main:2354726 blocked for more than 120 seconds.
          Tainted: G            E     5.10.0-0021.aarch64 #1
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    task:main            state:D stack:    0 pid:2354726 ppid:2350673 flags:0x00000a01
    Call trace:
     __switch_to+0x7c/0xbc
     __schedule+0x3b4/0x8a0
     schedule+0x50/0xe0
     rwsem_down_write_slowpath+0x3cc/0x6cc
     down_write+0x60/0x260
     __anon_vma_prepare+0x6c/0x210
     do_anonymous_page+0x258/0x660
     handle_pte_fault+0x188/0x214
     __handle_mm_fault+0x1b0/0x380
     handle_mm_fault+0xf4/0x284
     do_page_fault+0x19c/0x494
     do_translation_fault+0xcc/0xf8
     do_mem_abort+0x48/0xac
     el0_da+0x44/0x80
     el0_sync_handler+0x88/0xb4
     el0_sync+0x160/0x180
    
    After analyzing the vmcore, we found the anon_vma->root->rwsem.count is
    -1.  There is another anon_vma whose anon_vma->root->rwsem.count is 1, the
    anon_vma->root->rwsem.owner shows the lock is held, but the stack of the
    task shows the task doesn't hold the anon_vma lock.
    
    After adding more debugging info, we found __anon_vma_prepare() reuses
    anon_vma and triggers the UAF of anon_vma->root due to missing memory
    barrier, leading to locking and unlocking two different anon_vma->root,
    thus leading to an anon_vma will never be unlocked, and another anon_vma
    couldn't be locked anymore.
    
    This race requires two adjacent VMAs that are not merged but are
    anon_vma-compatible (e.g., they differ in VMA_ACCESS_FLAGS that can be
    changed by mprotect()).  Two threads fault on each VMA concurrently, both
    calling __anon_vma_prepare() with only mmap_lock held for reading.
    
        THREAD A                             THREAD B
    __anon_vma_prepare                __anon_vma_prepare
     find_mergeable_anon_vma() -> NULL
     anon_vma = anon_vma_alloc();
       anon_vma->root = anon_vma;
     // the two stores may be reordered
     vma->anon_vma = anon_vma;
                                       // finds A's anon_vma
                                       anon_vma = find_mergeable_anon_vma(vma);
                                       anon_vma_lock_write(anon_vma);
                                         // may still see the old root
                                         down_write(&anon_vma->root->rwsem);
                                       anon_vma_unlock_write(anon_vma);
                                         // see the new root, never unlock old
                                         up_write(&anon_vma->root->rwsem);
    
    thread A triggers page fault and calls __anon_vma_prepare() to prepare
    anon_vma for the faulting vma.  __anon_vma_prepare() allocates and
    initializes a new anon_vma, and then publishes it to the vma with a plain
    store.  anon_vma_prepare() only requires the mmap_lock to be held for
    reading, so two threads can fault on adjacent VMAs at the same time.
    While thread A publishes a new anon_vma, thread B could find the anon_vma
    via find_mergeable_anon_vma() and then locks anon_vma->root->rwsem.
    
    The store to anon_vma->root in anon_vma_alloc() and the store to
    vma->anon_vma can be reordered.  The anon_vma_lock_write() and spin_lock()
    only provide acquire semantics, which do not prevent prior stores from
    being reordered after them.  The release semantics of the corresponding
    spin_unlock() and anon_vma_unlock_write() come too late, the store to
    vma->anon_vma is already published before they take effect.  As a result,
    thread B can observe the following order:
    
        vma->anon_vma = anon_vma;
        anon_vma->root = anon_vma;
    
    The anon_vma slab is SLAB_TYPESAFE_BY_RCU, so a newly allocated anon_vma
    may reuse memory from a previously freed one.  The constructor
    (anon_vma_ctor) does not reset anon_vma->root, and __put_anon_vma()
    doesn't clear it either, so the old root value persists until
    anon_vma_alloc() overwrites it.  If that store isn't visible, thread B
    reads a root that points to the old anon_vma and locks it.
    
    As a result, thread B can call anon_vma_lock_write() with the old root,
    and call anon_vma_unlock_write() with the new root, leading to an anon_vma
    will never be unlocked, and another anon_vma couldn't be locked anymore
    (its count is dropped from 0 to -1 due to wrong unlock).
    
    To fix it, change the plain store `vma->anon_vma = anon_vma` to store
    release, so that the fields of anon_vma are visible before anon_vma is
    published to vma->anon_vma.
    
    At read side, the load of anon_vma and anon_vma->root have address
    dependency.  According to Documentation/memory-barriers.txt and some
    investigations, only Alpha needs address-dependency barriers and it has
    been handled by READ_ONCE() in reusable_anon_vma().
    
    We reproduced this issue in v5.10 with KSM enabled.  The kernel doesn't
    merge commit cf7e7a3503df ("mm: prevent KSM from breaking VMA merging for
    new VMAs"), so there are many adjacent VMAs that aren't merged but are
    compatible for anon_vma.
    
    Without this fix, our production environment could reproduce this issue
    about 2-5 times each month.  After adding a smp_mb() before
    anon_vma_lock_write(anon_vma) in __anon_vma_prepare(), which is different
    to this patch, this issue hasn't been reproduced for one month.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: 5c341ee1dfc8 ("mm: track the root (oldest) anon_vma")
    Signed-off-by: Jinjiang Tu <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Reviewed-by: Lance Yang <[email protected]>
    Reviewed-by: Lorenzo Stoakes (ARM) <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Acked-by: Vlastimil Babka (SUSE) <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: Harry Yoo <[email protected]>
    Cc: Hiroyouki Kamezawa <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Jinjiang Tu <[email protected]>
    Cc: Kefeng Wang <[email protected]>
    Cc: Larry Woodman <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Nanyong Sun <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: <[email protected]>
    [ adjusted context for mm/mmap.c and the existing anon_vma_chain_link() helper. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Tue Oct 20 10:30:17 2026 +0100

    mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF
    
    [ Upstream commit 26444eb71465c9934d9d418ef69c43f61185329b ]
    
    Currently there is a nasty race between ptdump and vmap when attempting to
    map a huge P4D, PUD or PMD entry:
    
    * ptdump walks kernel page table ranges it doesn't own.
    
    * When vmap maps ranges it tries to promote existing ones to huge page
      tables in vmap_try_huge_[p4d,pud,pmd]() at P4D, PUD and PMD level,
      freeing the lower page table in [p4d,pud,pmd]_free_[pud,pmd,pte]_page()
      when it succeeds.
    
    Both of these things can happen at the same time and as a result ptdump
    can access a freed page table, resulting in a use-after-free and memory
    corruption.
    
    This is possible because while ptdump_walk_pgd() holds both the mem
    hotplug lock and the mmap write lock before invoking
    walk_page_range_novma(), vmap takes no relevant locks at all.
    
    Fix this by holding the mmap read lock in vmap_try_huge_*() when freeing
    page tables.
    
    The read lock is sufficient: ptdump is the only walker that must be
    excluded and it holds the mmap write lock.  Other holders of the read lock
    may run concurrently, but each exclusively owns the range it operates on
    and cannot reach the page tables freed here.
    
    We also hold the lock while assigning the huge page table entry, which
    means page table walkers observe only the huge or non-huge page table
    entry.
    
    We use a trylock to prevent ptdump from blocking vmap making forward
    progress.  This is fine because it's an optimisation in any case, and thus
    the vmap can safely proceed regardless.
    
    All other kernel page table walkers that touch vmalloc ranges either
    exclusively own the memory walked or acquire the mmap lock, so this
    correctly excludes those walkers.
    
    The issue has existed as long as ptdump was available and vmap freed page
    tables when promoting to a huge leaf entry, that is, since commit
    b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table")
    for huge ioremap, and commit 121e6f3258fe ("mm/vmalloc: hugepage vmalloc
    mappings") for huge vmalloc.
    
    Since the former is the earlier of the two we choose that for our Fixes
    tag.
    
    This patch is based on work by David Carlier (linked), with gratitude!
    
    Fixes: b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/T/
    Link: https://lore.kernel.org/linux-mm/[email protected]/
    Reviewed-by: Mike Rapoport (Microsoft) <[email protected]>
    Reviewed-by: Dev Jain <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Reviewed-by: Kiryl Shutsemau <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ ljs - Open-coded missing stuff + other smaller changes. Updated commit
       msg to reflect. ]
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mmc: cavium-octeon: destroy slot platform devices on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Tue Sep 15 23:57:24 2026 +0800

    mmc: cavium-octeon: destroy slot platform devices on remove
    
    commit 0f4d4424fc1d651ec3fa63a0a8060ba9087eb0ec upstream.
    
    octeon_mmc_probe() creates host->slot_pdev[i] with
    of_platform_device_create(), while octeon_mmc_remove() does not destroy
    the child platform devices.
    
    The probe failure path removes each MMC slot and destroys its associated
    platform device, but the normal remove path only removes the MMC slot.
    As a result, the child platform devices remain registered after the
    Octeon MMC controller is removed.
    
    Destroy each slot platform device during removal after cleaning up the
    corresponding MMC slot, matching the probe failure cleanup path.
    
    This issue was found by manual code inspection.
    
    Fixes: 01d95843335c ("mmc: cavium: Add MMC support for Octeon SOCs.")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: cavium-thunderx: destroy slot platform devices on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 16 00:13:10 2026 +0800

    mmc: cavium-thunderx: destroy slot platform devices on remove
    
    commit 29ee8cf18a21b02cd0b2e35f741b61cd1fe3e14e upstream.
    
    thunder_mmc_probe() creates host->slot_pdev[i] with
    of_platform_device_create(), while thunder_mmc_remove() does not destroy
    the child platform devices.
    
    The probe failure path removes each MMC slot and destroys its associated
    platform device, but the normal remove path only removes the MMC slot.
    As a result, the child platform devices remain registered after the
    ThunderX MMC controller is removed.
    
    Destroy each slot platform device during removal after cleaning up the
    corresponding MMC slot, matching the probe failure cleanup path. Keep an
    extra device reference around of_platform_device_destroy() as done in
    the existing error path.
    
    This issue was found by manual code inspection.
    
    Fixes: 166bac38c3c56 ("mmc: cavium: Add MMC PCI driver for ThunderX SOCs")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: mtk-sd: Cancel request timeout work on remove [+ + +]
Author: Yibo Tan <[email protected]>
Date:   Tue Sep 15 22:44:57 2026 +0800

    mmc: mtk-sd: Cancel request timeout work on remove
    
    commit b38af5386a74416e898955443f2e26547b358cb2 upstream.
    
    The driver queues req_timeout while a request is active.
    msdc_request_done() uses cancel_delayed_work(), which does not wait for
    a timeout callback that has already started.
    
    The timeout callback calls mmc_request_done(), which wakes the request
    waiter, and then continues to use host->dev_comp and check the SDIO IRQ.
    During unbind, msdc_drv_remove() can return and the managed mmc_host can
    be freed before the callback finishes.
    
    KASAN reported use-after-free accesses in msdc_request_done() and
    msdc_recheck_sdio_irq() in each of three unbind tests.  The same tests
    completed without a kernel diagnostic after this change.
    
    Call cancel_delayed_work_sync() after mmc_remove_host() has stopped new
    requests and before the driver releases the host resources.
    
    Fixes: 208489032bdd ("mmc: mediatek: Add Mediatek MMC driver")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Yibo Tan <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: sdhci-sprd: disable runtime PM on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 16 00:19:47 2026 +0800

    mmc: sdhci-sprd: disable runtime PM on remove
    
    commit e1c6c10a6a70a69e29b04fcc1ebe4b9bcbc7a49a upstream.
    
    sdhci_sprd_probe() enables runtime PM, while sdhci_sprd_remove() does
    not perform the corresponding runtime PM cleanup.
    
    The probe failure path disables runtime PM before disabling the clocks,
    but the normal remove path directly disables clocks that are also
    managed by the runtime PM callbacks. If the device is runtime
    suspended, those clocks may already be disabled.
    
    Resume the device before removal, disable runtime PM and drop the
    temporary runtime PM reference before disabling the clocks.
    
    This issue was found by manual code inspection.
    
    Fixes: fb8bd90f83c4 ("mmc: sdhci-sprd: Add Spreadtrum's initial host controller")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Reviewed-by: Baolin Wang <[email protected]>
    Acked-by: Adrian Hunter <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: via-sdmmc: cancel card-detect work on remove [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 10:29:22 2026 -0400

    mmc: via-sdmmc: cancel card-detect work on remove
    
    [ Upstream commit 57e5d877f898d5e5c9d672a77bb6bdd24f0d9bf5 ]
    
    Disabling the device interrupt and freeing the IRQ prevents new card-detect
    work from being queued, but carddet_work already queued by the handler can
    still run after via_sd_remove() returns. via_sdc_card_detect() recovers the
    host through container_of() and dereferences its MMIO base; once remove()
    returns the host can be freed, so that work would touch freed memory.
    
    Cancel carddet_work after freeing the IRQ and before cancelling
    finish_bh_work, which the card-detect handler can also queue. carddet_work
    can re-enable the interrupt through via_reset_pcictrl(); mask it again
    afterwards.
    
    This issue was found by an in-house static analysis tool and confirmed by
    manual code review.
    
    Fixes: f0bf7f61b840 ("mmc: Add new via-sdmmc host controller driver")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    [ adjusted context to retain del_timer_sync() instead of timer_delete_sync(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
mtd: block2mtd: Fix divide error when erase_size is zero [+ + +]
Author: Pei Xiao <[email protected]>
Date:   Tue Oct 6 13:56:21 2026 -0400

    mtd: block2mtd: Fix divide error when erase_size is zero
    
    [ Upstream commit b5965c4221165045e19736794ca5f48ae3d67142 ]
    
    The erase size is parsed from the "block2mtd" module parameter and can
    be set to zero. add_device() then evaluates
    
            if (size % erase_size)
    
    with a zero divisor, which triggers a divide error:
    
    divide error: 0000 [#1] PREEMPT SMP PTI
    RIP: 0010:add_device drivers/mtd/devices/block2mtd.c:296 [inline]
    RIP: 0010:block2mtd_setup2+0x592/0xda0 drivers/mtd/devices/block2mtd.c:459
    Call Trace:
    block2mtd_setup+0x27/0xe0 drivers/mtd/devices/block2mtd.c:476
    param_attr_store+0x214/0x310 kernel/params.c:589
    module_attr_store+0x65/0x90 kernel/params.c:904
    kernfs_fop_write_iter+0x3a4/0x540 fs/kernfs/file.c:345
    ...
    
    Reject a zero erase size before performing the modulo operation so the
    existing "erasesize must be a divisor of device size" error path
    reports the invalid argument and frees the device.
    
    Fixes: ea6d833a3fdd ("mtd: block2mtd: check device size")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/lkml/[email protected]/
    Suggested-by: Jörn Engel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Pei Xiao <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    [ sashal: adapted the size variable check to direct dev->blkdev->bd_inode->i_size access ]
    Signed-off-by: Sasha Levin <[email protected]>

mtd: call external _get and _put in right order [+ + +]
Author: Alexander Usyskin <[email protected]>
Date:   Tue Jun 20 16:19:05 2023 +0300

    mtd: call external _get and _put in right order
    
    [ Upstream commit 79c4a56250216991f1d965ee26dcd273376e4e91 ]
    
    MTD provider provides mtd_info object to mtd subsystem.
    With kref patch the mtd_info object can be alive after
    provider released mtd device.
    Fix calling order in _get and _put functions to allow
    mtd provider to safely alloc and release mtd object.
    
    Execute:
    1) call external _get
    2) get_module
    3) add internal kref
    in the get function and opposite order in the put one.
    
    The _put_device callback should be the last in put
    as the master struct memory may be freed in this callback.
    
    Signed-off-by: Alexander Usyskin <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Stable-dep-of: 12b31d1acd20 ("mtd: core: call _get_device() with the master MTD")
    Signed-off-by: Sasha Levin <[email protected]>

mtd: Clean refcounting with MTD_PARTITIONED_MASTER [+ + +]
Author: Miquel Raynal <[email protected]>
Date:   Mon Jul 31 11:09:03 2023 +0200

    mtd: Clean refcounting with MTD_PARTITIONED_MASTER
    
    commit 264725e35fbc3b67e053a405e022393a6017e6da upstream.
    
    The logic is way too convoluted, let's clean the kref_get/put section to
    clarify what this block does when using CONFIG_MTD_PARTITIONED_MASTER:
    - Iterate through all the parent mtd devices
    - Grab a reference over them all but the master
    - Only grab the master whith CONFIG_MTD_PARTITIONED_MASTER
    Same logic must apply in the put path, otherwise it would be broken.
    
    Cc: Tomas Winkler <[email protected]>
    Cc: Alexander Usyskin <[email protected]>
    Cc: Zhang Xiaoxu <[email protected]>
    Fixes: 19bfa9ebebb5 ("mtd: use refcount to prevent corruption")
    Signed-off-by: Miquel Raynal <[email protected]>
    Tested-by: Alexander Usyskin <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: core: call _get_device() with the master MTD [+ + +]
Author: Karl Mehltretter <[email protected]>
Date:   Sun Aug 16 18:30:58 2026 +0200

    mtd: core: call _get_device() with the master MTD
    
    [ Upstream commit 12b31d1acd20b3185bb5f0748db0cf6874c8e9d1 ]
    
    __get_mtd_device() calls the master's _get_device() callback with mtd,
    which may be a partition. __put_mtd_device() passes the master.
    
    This breaks gluebi partitions because gluebi_get_device() uses
    container_of() and therefore requires the master MTD. Pass the master
    to _get_device(), matching _put_device().
    
    Fixes: 46b5889cc2c5 ("mtd: implement proper partition handling")
    Assisted-by: Codex:gpt-5.6-sol
    Signed-off-by: Karl Mehltretter <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

mtd: core: clear out unregistered devices a bit more [+ + +]
Author: Zev Weiss <[email protected]>
Date:   Fri Oct 15 11:50:48 2021 -0700

    mtd: core: clear out unregistered devices a bit more
    
    [ Upstream commit 00596576a05145a1b5672897a82ef87af00becf4 ]
    
    This allows an MTD device that has been unregistered to be easily
    re-registered later without triggering spurious "already registered"
    warnings in mtd_device_parse_register() and add_mtd_device().
    
    Signed-off-by: Zev Weiss <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Stable-dep-of: 12b31d1acd20 ("mtd: core: call _get_device() with the master MTD")
    Signed-off-by: Sasha Levin <[email protected]>

mtd: core: Drop duplicate NULL checks around nvmem_unregister() [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Sun Feb 20 15:15:26 2022 +0000

    mtd: core: Drop duplicate NULL checks around nvmem_unregister()
    
    [ Upstream commit bcf4ef28b0839a55bfae75b2bf4794c1d7244e61 ]
    
    Since nvmem_unregister() checks for NULL, no need to repeat in
    the caller. Drop duplicate NULL checks.
    
    Acked-by: Miquel Raynal <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Signed-off-by: Srinivas Kandagatla <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 12b31d1acd20 ("mtd: core: call _get_device() with the master MTD")
    Signed-off-by: Sasha Levin <[email protected]>

mtd: core: Fix refcount error in del_mtd_device() [+ + +]
Author: Shang XiaoJing <[email protected]>
Date:   Sat Nov 19 14:39:15 2022 +0800

    mtd: core: Fix refcount error in del_mtd_device()
    
    [ Upstream commit 56570bdad5e31c5c538cd6efff5c4510256e1bb4 ]
    
    del_mtd_device() will call of_node_put() to mtd_get_of_node(mtd), which
    is mtd->dev.of_node. However, memset(&mtd->dev, 0) is called before
    of_node_put(). As the result, of_node_put() won't do anything in
    del_mtd_device(), and causes the refcount leak.
    
    del_mtd_device()
        memset(&mtd->dev, 0, sizeof(mtd->dev) # clear mtd->dev
        of_node_put()
            mtd_get_of_node(mtd) # mtd->dev is cleared, can't locate of_node
                                 # of_node_put(NULL) won't do anything
    
    Fix the error by caching the pointer of the device_node.
    
    OF: ERROR: memory leak, expected refcount 1 instead of 2,
    of_node_get()/of_node_put() unbalanced - destroy cset entry: attach
    overlay node /spi/spi-sram@0
    CPU: 3 PID: 275 Comm: python3 Tainted: G N 6.1.0-rc3+ #54
        0d8a1edddf51f172ff5226989a7565c6313b08e2
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
    rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014
    Call Trace:
    <TASK>
        dump_stack_lvl+0x67/0x83
        kobject_get+0x155/0x160
        of_node_get+0x1f/0x30
        of_fwnode_get+0x43/0x70
        fwnode_handle_get+0x54/0x80
        fwnode_get_nth_parent+0xc9/0xe0
        fwnode_full_name_string+0x3f/0xa0
        device_node_string+0x30f/0x750
        pointer+0x598/0x7a0
        vsnprintf+0x62d/0x9b0
        ...
        cfs_overlay_release+0x30/0x90
        config_item_release+0xbe/0x1a0
        config_item_put+0x5e/0x80
        configfs_rmdir+0x3bd/0x540
        vfs_rmdir+0x18c/0x320
        do_rmdir+0x198/0x330
        __x64_sys_rmdir+0x2c/0x40
        do_syscall_64+0x37/0x90
        entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    Fixes: 00596576a051 ("mtd: core: clear out unregistered devices a bit more")
    Signed-off-by: Shang XiaoJing <[email protected]>
    [<[email protected]>: Light reword of the commit log]
    Signed-off-by: Miquel Raynal <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Stable-dep-of: 12b31d1acd20 ("mtd: core: call _get_device() with the master MTD")
    Signed-off-by: Sasha Levin <[email protected]>

mtd: fix double free and WARN_ON in add_mtd_device() error paths [+ + +]
Author: Xue Lei <[email protected]>
Date:   Wed Jul 1 20:10:42 2026 +0800

    mtd: fix double free and WARN_ON in add_mtd_device() error paths
    
    commit 9d4af746af8ce27eefc2338b2feaa1e01f28b6c3 upstream.
    
    When device_register() or mtd_nvmem_add() fails inside
    add_mtd_device() for a partition, the error handling triggers
    mtd_release() via put_device() or device_unregister(). mtd_release()
    calls release_mtd_partition() which frees the mtd_info structure.
    However, callers such as mtd_add_partition() and add_mtd_partitions()
    also call free_partition() in their error paths, resulting in a double
    free.
    
    Additionally, release_mtd_partition() hits WARN_ON(!list_empty(
    &mtd->part.node)) because the partition node is still linked in the
    parent's partitions list when the release callback fires from the
    add_mtd_device() error path.
    
    Fix this by overriding dev->type and dev->release before put_device()
    in the error paths, so that device_release() invokes a no-op function
    instead of mtd_release(). For the mtd_nvmem_add() failure case,
    device_unregister() is replaced with device_del() to separate the
    device removal from the final kobject reference drop, allowing the
    override to take effect before put_device() is called.
    
    The callers' error paths (list_del + free_partition) remain the sole
    owners of mtd_info lifetime on add_mtd_device() failure, which is the
    expected contract.
    
    The normal partition teardown path is not affected: del_mtd_device()
    goes through kref_put() -> mtd_device_release() -> device_unregister()
    with dev->type still set to &mtd_devtype, so mtd_release() ->
    release_mtd_partition() continues to work correctly for the regular
    removal case.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=e9c76b56dc05023b8117
    Fixes: 19bfa9ebebb5 ("mtd: use refcount to prevent corruption")
    Signed-off-by: Xue Lei <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: fix use-after-free in mtd release [+ + +]
Author: Alexander Usyskin <[email protected]>
Date:   Mon Jul 31 14:58:36 2023 +0300

    mtd: fix use-after-free in mtd release
    
    commit e9714c22c1a8238a85d069b1517941fc723312f7 upstream.
    
    I case of partition device_unregister() in mtd_device_release()
    calls mtd_release() which frees mtd_info structure for partition.
    All code after device_unregister in mtd_device_release thus
    uses already freed memory.
    
    Move part of code to mtd_release() and restict mtd->dev cleanup
    to non-partion object.
    For partition object such cleanup have no sense as partition
    mtd_info is removed.
    
    Cc: Miquel Raynal <[email protected]>
    Cc: Zhang Xiaoxu <[email protected]>
    Fixes: 19bfa9ebebb5 ("mtd: use refcount to prevent corruption")
    Reviewed-by: Tomas Winkler <[email protected]>
    Signed-off-by: Alexander Usyskin <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: maps: vmu-flash: Fix the (mtd core) switch to ref counters [+ + +]
Author: Miquel Raynal <[email protected]>
Date:   Tue Dec 5 08:59:36 2023 +0100

    mtd: maps: vmu-flash: Fix the (mtd core) switch to ref counters
    
    commit a7d84a2e7663bbe12394cc771107e04668ea313a upstream.
    
    While switching to ref counters for track mtd devices use, the vmu-flash
    driver was forgotten. The reason for reading the ref counter seems
    debatable, but let's just fix the build for now.
    
    Fixes: 19bfa9ebebb5 ("mtd: use refcount to prevent corruption")
    Reported-by: kernel test robot <[email protected]>
    Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
    Cc: [email protected]
    Signed-off-by: Miquel Raynal <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: rawnand: cadence: Initialize IRQ state before requesting IRQ [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Wed Sep 2 15:05:42 2026 +0800

    mtd: rawnand: cadence: Initialize IRQ state before requesting IRQ
    
    commit 21f027016b1290d13c30b198ae7a00e6b3d1d5a5 upstream.
    
    The Cadence NAND interrupt handler uses both the IRQ lock and completion
    object. Registering the IRQ before initializing them leaves a window in
    which a pending interrupt can access uninitialized synchronization state.
    
    Initialize them before registering the handler.
    
    Fixes: ec4ba01e894d ("mtd: rawnand: Add new Cadence NAND driver to MTD subsystem")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Runyu Xiao <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: rawnand: vf610_nfc: fix false bitflips on reads of erased pages [+ + +]
Author: Mehmet Fide <[email protected]>
Date:   Tue Sep 1 09:39:07 2026 +0200

    mtd: rawnand: vf610_nfc: fix false bitflips on reads of erased pages
    
    [ Upstream commit 68fe2faf5c69d0e21f94cd695d28f0ba677d484f ]
    
    When the ECC engine fails to decode a page, the driver re-reads the OOB
    area with the engine bypassed, but runs the erased-page check for the
    data area on the buffer left in the controller SRAM by the failed
    transfer.
    
    That buffer does not hold what is on the flash: the failing engine
    writes a bogus single-bit "correction" into it. In the 60-byte ECC mode
    the all-0xff content of an erased page always decodes to the same error
    location, so every erased page shows one stale zero bit at data offset
    0x5FD, which the erased-page check then reports as a corrected bitflip.
    
    Edward Karpicz discovered this behaviour and identified the offset on a
    Colibri VF61; the analysis and the fix build on his finding. Measured
    with an instrumented driver on a Colibri VF50 (MX30LF1G18AC, 32-bit
    ECC): reading a 126 MiB partition with nanddump increased the corrected
    counter by 18035, exactly one per erased page, while raw reads of the
    same pages return clean 0xff. A v4.4 kernel on the VF61 (MX30LF4G28AC)
    accumulates the same false counts, so the behaviour follows the
    controller rather than the chip or the driver generation. Neither the
    Vybrid reference manual nor the published mask set errata (VFXXX_2N02G)
    document it. The 45-byte ECC mode is not affected.
    
    Restoring the known byte is not enough: on pages that fail to decode
    with content other than all-0xff the engine writes its correction
    wherever the syndrome points (measured at a different offset on such a
    page), so the check has to run on what the flash holds. Re-read the data
    area with the ECC engine bypassed, exactly as already done for the OOB
    area. The corrected counter then stays at zero on both boards.
    
    Reported-by: Edward Karpicz <[email protected]>
    Link: https://community.toradex.com/t/colibri-vf50-vf61-on-the-current-bsp-mainline-u-boot-v2026-07-and-linux-6-18-lts/30735
    Signed-off-by: Mehmet Fide <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

mtd: rawnand: vf610_nfc: fix reads on chips with more than 64 bytes of OOB [+ + +]
Author: Mehmet Fide <[email protected]>
Date:   Tue Sep 1 09:39:06 2026 +0200

    mtd: rawnand: vf610_nfc: fix reads on chips with more than 64 bytes of OOB
    
    commit 37adc9c5789c76db3b1ee7aeec3999b8503020d0 upstream.
    
    The controller transfers 64 spare bytes per page and the driver only
    implements the matching 64-byte ECC layout, so attach_chip() shrinks
    mtd->oobsize when the chip provides more. That clamp does not survive:
    nand_scan_tail() runs nanddev_init() after ->attach_chip(), and it
    restores mtd->oobsize from the memory organization, which still holds
    the value detected from the chip. The driver then transfers writesize
    plus the chip's full OOB size, the hardware ECC parity ends up at a
    different offset than the layout the controller was set up for, and
    every ECC-protected read fails with -EBADMSG.
    
    Measured on a Colibri VF61 (MX30LF4G28AC, 2048-byte pages, 112 bytes of
    OOB): with the clamp lost, UBI cannot read the erase counter headers of
    the pages U-Boot has just written, and the on-flash bad block table
    written by an older kernel reads back with ECC errors, so the board
    does not boot. Kernels before commit a7ab085d7c16 ("mtd: rawnand:
    Initialize the nand_device object") are not affected because nothing
    overwrote the clamp there, which is why the same chip works with a v4.4
    kernel and with U-Boot, whose copy of this driver has no memory
    organization to restore the value from. Edward Karpicz reported that
    the clamp no longer takes effect on this chip; see the link below.
    
    Instead of modifying the memory organization, keep the detected OOB
    size and give the driver its own mtd_ooblayout_ops: the same layout the
    NAND core uses for large pages, but computed on the first 64 OOB bytes
    instead of the whole OOB, so the ECC bytes stay where U-Boot and the
    old kernels put them. The data paths transfer writesize plus those 64
    bytes, as the controller always has.
    
    Since mtd->oobsize now reports the chip's real spare size, fill the
    tail of oob_poi with 0xff after the 64 transferred bytes on ECC page
    reads: the core may copy the full mtd->oobsize from it, which would
    otherwise expose whatever the buffer held before. 0xff also matches
    what a raw read returns from flash, since the write path only ever
    programs the first 64 spare bytes.
    
    Reported-by: Edward Karpicz <[email protected]>
    Link: https://community.toradex.com/t/colibri-vf50-vf61-on-the-current-bsp-mainline-u-boot-v2026-07-and-linux-6-18-lts/30735
    Suggested-by: Miquel Raynal <[email protected]>
    Fixes: a7ab085d7c16 ("mtd: rawnand: Initialize the nand_device object")
    Cc: [email protected]
    Signed-off-by: Mehmet Fide <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: spinand: Enable QE on all dies [+ + +]
Author: Han Xu <[email protected]>
Date:   Tue Oct 6 18:10:51 2026 -0400

    mtd: spinand: Enable QE on all dies
    
    [ Upstream commit 63d6cace2c4a7f36c1cb44f1bb5e0f3ef19e5c7f ]
    
    The QUAD ENABLE (QE) bit is stored in a per-die configuration
    register on some SPI-NAND devices. When a device contains multiple
    dies, updating the QE bit only on the currently selected die can
    leave the remaining dies operating in non-quad mode.
     
    Iterate over all targets and update the QE setting on each die
    during initialization to ensure consistent quad I/O operation
    across the entire device.
    
    Tested on ISSI IS38SMW04G8B.
    
    Fixes: 7529df465248 ("mtd: nand: Add core infrastructure to support SPI NANDs")
    Cc: [email protected]
    Signed-off-by: Han Xu <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    [ sashal: adapted to spinand_init_quad_enable() computing enable internally instead of accepting a boolean argument ]
    Signed-off-by: Sasha Levin <[email protected]>

mtd: spinand: fix zero oobavail when no ECC engine is used [+ + +]
Author: Nuno Sá <[email protected]>
Date:   Mon Aug 31 16:07:18 2026 +0100

    mtd: spinand: fix zero oobavail when no ECC engine is used
    
    commit 636fe10d8f3559210ff63108a208d39ea2e9c3bd upstream.
    
    Commit 00c15b78b4b4 ("mtd: spinand: Allow the case where there is no
    ECC engine") made the OOB free bytes count conditional on having an
    ECC engine so that probing would not fail when none is requested.
    However mtd->oobavail is still assigned from ret just after that
    block, and ret is 0 there, so the device ends up advertising no
    available OOB bytes at all.
    
    mtd_oobavail() returns mtd->oobavail for MTD_OPS_AUTO_OOB, so a zero
    value makes every automatic OOB access fail with -EINVAL. JFFS2 fares
    worse: it keeps its cleanmarker in the OOB area on NAND and refuses to
    mount outright, reporting "inconsistent device description".
    
    No ECC engine also means no ooblayout was ever installed, which would
    make the count return -ENOTSUPP, so install the same fallback layout
    the on-die path already uses before counting unconditionally.
    
    Fixes: 00c15b78b4b4 ("mtd: spinand: Allow the case where there is no ECC engine")
    Cc: [email protected]
    Signed-off-by: Nuno Sá <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: use refcount to prevent corruption [+ + +]
Author: Tomas Winkler <[email protected]>
Date:   Tue Jun 20 16:19:04 2023 +0300

    mtd: use refcount to prevent corruption
    
    [ Upstream commit 19bfa9ebebb5ec0695def57eb1d80de7e9cab369 ]
    
    When underlying device is removed mtd core will crash
    in case user space is holding open handle.
    Need to use proper refcounting so device is release
    only when has no users.
    
    Signed-off-by: Tomas Winkler <[email protected]>
    Signed-off-by: Alexander Usyskin <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Link: https://lore.kernel.org/linux-mtd/[email protected]
    Stable-dep-of: 12b31d1acd20 ("mtd: core: call _get_device() with the master MTD")
    Signed-off-by: Sasha Levin <[email protected]>

 
namespace: check a submount for references right before unmounting it [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Sep 30 15:31:54 2026 +0200

    namespace: check a submount for references right before unmounting it
    
    commit 32bf92416614a1e3ff3524fc6b780259c7aad3ef upstream.
    
    shrink_submounts() and mark_mounts_for_expiry() first collect all the
    mounts they are allowed to unmount and then unmount them.
    
    Whether a mount is busy is decided by propagate_mount_busy() on the
    tree. But unmounting the first mount changes the tree that the second
    one propagates into. propagate_umount()
    moves a surviving overmount off a copy it unmounts and mounts it where
    the copy was mounted. If that's where the propagated copy of the second
    victim is looked up the overmount becomes a candidate of the second
    umount_tree(). It's childless and so trim_one() commits it without
    looking at its reference count.
    
    So a synchronous umount pulls out a busy mount that is in use somewhere
    else and marks it MNT_SYNC_UMOUNT while it has users:
    
      umount2(/tmp/plshrink/p1, 0) = 0 errno 0
      cwd is (unreachable)
    
    The same two umounts requested one after the other fail with EBUSY.
    This needs a mount with MNT_SHRINKABLE, i.e., automounted submounts of
    NFS, AFS and CIFS or the tracefs mount below debugfs. Bind mounts
    inherit the flag.
    
    Check each mount right before it is unmounted under the same hold of
    namespace_sem and mount_lock as the umount itself. Make sure that the
    algorithm stays linear.
    
    Fixes: 1064f874abc0 ("mnt: Tuck mounts under others instead of creating shadow/side mounts.")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

namespace: check the mounts before reading their parents in pivot_root() [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 21:28:43 2026 -0400

    namespace: check the mounts before reading their parents in pivot_root()
    
    [ Upstream commit 6b7c001eb5857fa09041f47673666060a2e5fc1c ]
    
    path_pivot_root() reads the parents of new_root and of the caller's root
    and checks whether they are shared before it checks that either mount is
    in the caller's mount namespace. Only namespace_sem is held. That's fine
    for a mount that is in the caller's mount namespace.
    
    But new_root can be a file descriptor to a mount that has been unmounted
    and that only the file descriptor keeps alive. If that mount stayed
    attached to its parent when it was unmounted nothing pins the parent for
    it. The final mntput() of the parent unhooks the children under
    mount_lock alone and frees the parent afterwards:
    
      pivot_root()                     close(fd), last ref on the parent
      ------------                     ---------------------------------
      ex_parent = new_mnt->mnt_parent
                                       mntput_no_expire_slowpath()
                                         __umount_mnt(new_mnt)
                                       cleanup_mnt()
                                         call_rcu()
      IS_MNT_SHARED(ex_parent)
    
      BUG: KASAN: slab-use-after-free in path_pivot_root+0xf1a/0x1840
      Read of size 4 at addr ffff8881047382f8 by task pivot_widen/157
       path_pivot_root+0xf1a/0x1840
       __x64_sys_pivot_root+0x165/0x190
    
    The same goes for the caller's root via chroot(). Both outcomes of the
    check end in EINVAL so nothing but the read itself goes wrong. It's the
    same thing commit bb4609405752 ("statmount: read the parent of an
    unmounted mount under mount_lock") fixed for statmount().
    
    Check that both mounts are in the caller's namespace before their
    parents are read. Every path returns EINVAL either way.
    
    Fixes: e0c9c0afd2fc ("mnt: Update detach_mounts to leave mounts connected")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: Adapted the checks to the pivot_root syscall using goto out4 instead of returning -EINVAL. ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: check the target before walking it in do_mount_setattr() [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 19:04:48 2026 -0400

    namespace: check the target before walking it in do_mount_setattr()
    
    [ Upstream commit 08f4288a37ef4b3d19b4a9599ec3048219cac828 ]
    
    When mount_setattr() changes the propagation type to MS_SHARED
    do_mount_setattr() takes namespace_sem and calls invent_group_ids()
    which walks the whole target tree with next_mnt() and allocates a peer
    group id for every mount that doesn't have one.
    
    Whether the caller may touch the target at all is only checked
    afterwards under mount_lock. If it may not, cleanup_group_ids() walks
    the tree a second time on the way out to free the ids again.
    
    A detached tree that a file descriptor keeps alive, a mount in another
    mount namespace or a mount below the root of an anonymous mount
    namespace does a bunch of allocation work that is completely useless
    because it will fail and revert right after.
    
    Do the right thing and check the target right after taking namespace_sem
    instead. A mount leaves its namespace only under namespace_sem so the
    mount stays stable. The check under mount_lock stays for the case where
    no propagation change is requested and namespace_sem isn't taken.
    Callers get the same EINVAL as before.
    
    Fixes: 2a1867219c7b ("fs: add mount_setattr()")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: Replaced anon_ns_root() with existing mount eligibility checks guarded by is_mounted(). ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: don't copy an unmounted mount tree [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 19:04:17 2026 -0400

    namespace: don't copy an unmounted mount tree
    
    [ Upstream commit 8bacbf6be959973b28b691713a872c12eae69eec ]
    
    may_copy_tree() accepts a mount whose root is an nsfs or pidfs file
    before it checks whether that mount is mounted. This exception exists
    for nsfs and pidfs mounts. They are part of no mount namespace so
    neither check_mnt() nor is_mounted() would let them through and
    bind-mounting a nsfsfd or a pidfd wouldn't work.
    
    Problem is that exception also admits a bind mount of such a file when
    it was lazily unmounted and is only kept alive by a file descriptor:
    
      mount --bind /proc/self/ns/net /tmp/x
      exec 3< /tmp/x
      umount -l /tmp/x
      mount --rbind /proc/self/fd/3 /tmp/y
    
    With MS_REC or AT_RECURSIVE copy_tree() doesn't stop at the unmounted
    mount. It copies every mount that stayed attached to it as well. So if
    you have a bunch of overmounts over the nsfsfd or the pidfd the whole
    unmounted stack is copied. That's a bug.
    
    So refuse to walk an unmounted tree. Copying its root alone stays
    possible. So a bind mount of a namespace that is gone can still be
    recreated from a file descriptor on the old one. The file descriptor
    pins that mount and its root and __has_locked_children() only reads the
    direct children which don't leave the parent's list without
    namespace_sem. The internal mounts carry MNT_NS_INTERNAL instead of NULL
    and are still walked. Copying an unmounted tree recursively fails with
    EINVAL.
    
    Fixes: e149ed2b805f ("take the targets of /proc/*/ns/* symlinks to separate fs")
    Fixes: ef4144ac2dec ("pidfs: allow bind-mounts")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adjusted context for inline mount validation in __do_loopback() ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: don't inherit MNT_UMOUNT in clone_mnt() [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 20:44:07 2026 -0400

    namespace: don't inherit MNT_UMOUNT in clone_mnt()
    
    [ Upstream commit e2c6d326216642011da318b9edfd5d57ebd5a56f ]
    
    MNT_UMOUNT gets raised on a mount that umount_tree() or umount_one() has
    taken out of its namespace. It's never cleared. __detach_mounts()
    unhooks a mount that carries it instead of unmounting it.
    
    disconnect_mount() lets an unmounted child stay attached only if its
    parent carries it. propagate_umount() takes it as the sign that a mount
    is going to be unmounted when it decides what else can be unmounted,
    where a chain of locked mounts ends and where a for reparenting an
    overmount.
    
    clone_mnt() copies the flags of the source and only masks
    MNT_INTERNAL_FLAGS which doesn't include MNT_UMOUNT. A mount that was
    lazily unmounted but is kept alive by a file descriptor can still be
    copied when its root is an nsfs or pidfs file because may_copy_tree()
    accepts those before checking whether the source is mounted at all:
    
      mount --bind /proc/self/ns/net /tmp/x
      exec 3< /tmp/x
      umount -l /tmp/x
      mount --bind /proc/self/fd/3 /tmp/y
    
    The mount on /tmp/y is attached to the caller's namespace with
    MNT_UMOUNT already set and every copy of it inherits the flag again.
    
    That causes a number of bugs:
    
    - Unlink its mountpoint from a mount namespace where it isn't one.
      __detach_mounts() takes it for a mount that was unmounted earlier,
      unhooks it from its parent and drops the reference the namespace
      holds on it. It stays in the namespace with one reference too few
      and as its own parent, so it can't be unmounted through the file
      descriptor anymore and the namespace never finds it again. When the
      namespace goes away it's leaked and points to a freed struct
      mnt_namespace that may_change_propagation() and anon_ns_root() read
      on the next propagation change or mount_setattr() through the file
      descriptor.
    
    - Make it shared and unmount a peer. trace_transfers() follows the
      flag from the peer into it and strips it from its peer group.
    
    - Let a propagated umount reach it. gather_candidates() marks it with
      T_UMOUNT_CANDIDATE but never puts it on the candidate list, so the
      mark is never cleared and every later propagated umount skips it. If
      it's the parent of a locked mount handle_locked() takes it as the
      cutoff and commits the locked child that should have stayed and
      disconnect_mount() leaves that child attached to it, unmounted under
      a mounted parent, which is what disconnect_mount() exists to
      prevent. When the namespace goes away umount_tree() visits the child
      a second time. And once __detach_mounts() has made it its own parent
      reparent() never finds the end of the chain of unmounted parents.
    
    A clone is a new mount that has never been unmounted. Add MNT_UMOUNT
    to MNT_INTERNAL_FLAGS so clone_mnt() never copies it. And warn when
    umount_tree() reaches a mount that already has it set.
    
    Fixes: 590ce4bcbfb4 ("mnt: Add MNT_UMOUNT flag")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adapted to the explicit clone_mnt() flag mask and used WARN_ON_ONCE() instead of VFS_WARN_ON_ONCE(). ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: handle mount locking for automounts correctly [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 22:45:05 2026 -0400

    namespace: handle mount locking for automounts correctly
    
    [ Upstream commit 33aadc7c72055fca93cb5a3691d836ebf8b31c9b ]
    
    If mounts are propagated across user namespaces, attach_recursive_mnt()
    locks every copy of the source mount to protect overmounts from
    vanishing and revealing the underlying files or directories.
    
    The user namespace is taken from the caller's mount namespaces since
    this is where the mounts end up. Except, that's not always true.
    Automounts may legitimately get popped in by tasks located in a
    different mount and user namespace during path lookup.
    
    Then check doesn't make sense at that point. The copy in the namespace
    of the parent - which may be the host's - is now locked and the host
    cannot change the flags of its own mounts anymore.
    
    Here's the reproducer:
    
    - host has debugfs mounted nosuid,nodev,noexec and shared
    - tracefs automount below it is not yet active
    - hand a child process a directory descriptor on that mount
    - child process enters auser and mount namespace
    - child process' namespace now holds a locked copy of the host's debugfs
      mount that receives propagation from it
    - child process stats "tracing/." through the descriptor
    - lookup runs on the host's mount so the automount lands below the host's mount
    - propagation puts a copy below the child's copy
    - both try to clear the flags on the mount they got, with a bind remount:
    
        host, on its own automount:            MS_REMOUNT|MS_BIND = EPERM
        child, on the copy in its namespace:   MS_REMOUNT|MS_BIND = 0
    
    So the lock landed on the host's mount instead of the child's copy.
    Congrats. So we need to compare with the owner of the namespace the
    mount actually gets mounted on. For all regular cases that is the
    caller's mount namespace and so nothing changes.
    
    Detached trees in anonymous mount namespaces by be handed over via
    SCM_RIGHTS or inherited in other ways on purpose so the attaching task's
    mount namespace is authoritative, not the creator of the detached tree.
    
    Fixes: 132c94e31b8b ("vfs: Carefully propogate mounts across user namespaces")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adjusted context for attach_recursive_mnt() using separate mount and mountpoint arguments instead of pinned_mountpoint ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: refuse an automount below a mount that is in no namespace [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Fri Oct 2 15:52:36 2026 +0200

    namespace: refuse an automount below a mount that is in no namespace
    
    commit ba985ce08471c555af2a2fbe217c1bc2e72a6d8c upstream.
    
    It's possible to add autmounts even when the parent mount isn't in the
    mount namespace of the caller. The only requirement we have is that the
    parent mount namespace must not be NULL, i.e., unmounted.
    
    Problem is that clone_private_mount() has MNT_NS_INTERNAL which makes
    that trivially true. So that passes the test and attach_recursive_mnt()
    accepts that as a mount point and funny enough, count_mounts()
    dereferences MNT_NS_INTERNAL. The problem is it is an error pointer...
    
    So we can reach this in userspace via fanotify. A filesystem mark on the
    lower filesystem of an overlay reports paths on the layer clone and
    reading the event hands out a descriptor on it. For example with debugfs
    as the lower layer it goes kaboom:
    
      openat(evfd, "tracing", O_DIRECTORY)
    
      Oops: general protection fault
      KASAN: null-ptr-deref in range [0x1d0-0x1d7]
      RIP: 0010:count_mounts+0x35/0x200
       attach_recursive_mnt
       finish_automount
    
    And since that sleeping beauty happens under namespace_sem held for
    writing every mount operation on the system blocks from then on.
    Congrats.
    
    Use is_mounted() instead which rejects unmounted and internal mounts
    alike. The open fails with EINVAL just as it did before
    clone_private_mount() used MNT_NS_INTERNAL.
    
    Fixes: df820f8de4e4 ("ovl: make private mounts longterm")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

namespace: unhash a dentry before detaching the mounts on it [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 20:44:15 2026 -0400

    namespace: unhash a dentry before detaching the mounts on it
    
    [ Upstream commit 528b383dc35d1e5caf64ddf5d35f983ae543b0d0 ]
    
    unlink(), rmdir() and rename() remove the entry from the filesystem,
    call detach_mounts() on the entry with the inode locked and then call
    d_delete() once the inode is unlocked.
    
    The thing is that between detach_mounts() and d_delete() the dentry is
    still hashed and positive. But after detach_mounts() nothing covers the
    dentry anymore. A lookup that finds this dentry in the dcache can
    uncover what the mounts hid.
    
    That's a problem when unlinking files or directories that are
    mountpoints in other mount namespaces. Everybody who had the underlying
    entry covered can race the detach_mount() call until d_delete() has run.
    
    The race window isn't all that small. It encompasses namespace_unlock()
    with a full synchronize_rcu_expedited() grace period and the
    inode_unlock() of the entry.
    
    In my experiments three walkers that kept trying read an overmounted
    file in 11938 of the 16140 unlinks that removed its mountpoint from a
    bind mount of the filesystem within a minute.
    
    Fun fact, d_invalidate() has the same ordering problem but gets it
    right. It unhashes the dentry first and detaches the mounts afterwards.
    Let's do the same in __detach_mounts():
    
    - A lookup that hasn't found the dentry yet misses it in the dcache and
      waits for the directory lock that the caller holds until the name is
      gone for good.
    
    - A lockless lookup that found it already fails the mount_lock check
      while the dentry still counts as a mountpoint and the d_seq check once
      it doesn't, and retries.
    
    This fixes the lockless path. We still need to fix the reference count
    lookup in a follow-up patch.
    
    So d_drop() the dentry. The dentry stays positive and held but can't be
    found anymore. Then proceed with the detach and unlink.
    
    Reproducer:
    
    The reads were counted with the program below, three walkers for 60 s
    in a VM with 4 CPUs. The race window is stretched with the debug patch
    pasted here. fs.detach_race_walk_us sleeps in lookup_fast() once it
    found a mountpoint dentry and before its mounts are crossed.
    fs.detach_race_unlink_us sleeps in vfs_unlink() between detach_mounts()
    and d_delete().
    
      // SPDX-License-Identifier: GPL-2.0
      /*
       * unlink_covered: unlink a file that is a mountpoint in a detached copy of
       * its mount, against lookups that open it through that copy.
       *
       * A is a tmpfs with the file f1 (content SECRET_F) and the plain file
       * MARK_A. A' is an open_tree(OPEN_TREE_CLONE) copy of A with MARK_A bound
       * on A'/f1, held through an O_PATH fd on its root once the tree fd is
       * closed. Walkers open f1 through that fd while the driver unlinks A/f1,
       * where nothing is mounted on it. A walker may read MARK_A or get ENOENT.
       * A read of SECRET_F is a hit: the name was found after its mount was
       * gone. The lockless walks use openat2(RESOLVE_CACHED).
       *
       * usage: unlink_covered [-t seconds] [-w walkers]
       */
      #ifndef _GNU_SOURCE
      #define _GNU_SOURCE
      #endif
      #include <errno.h>
      #include <fcntl.h>
      #include <pthread.h>
      #include <stdatomic.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <sys/mount.h>
      #include <sys/stat.h>
      #include <sys/syscall.h>
      #include <linux/openat2.h>
    
      #ifndef __NR_open_tree
      #define __NR_open_tree 428
      #endif
      #ifndef __NR_move_mount
      #define __NR_move_mount 429
      #endif
      #ifndef __NR_openat2
      #define __NR_openat2 437
      #endif
      #ifndef OPEN_TREE_CLONE
      #define OPEN_TREE_CLONE 1
      #endif
      #ifndef OPEN_TREE_CLOEXEC
      #define OPEN_TREE_CLOEXEC O_CLOEXEC
      #endif
      #ifndef MOVE_MOUNT_F_EMPTY_PATH
      #define MOVE_MOUNT_F_EMPTY_PATH 0x00000004
      #endif
    
      #define WORK "/tmp/uc"
      #define ADIR WORK "/A"
    
      static int duration = 60, nwalkers = 3;
      static atomic_int stop, writer_waiting;
      static pthread_rwlock_t cur_lock = PTHREAD_RWLOCK_INITIALIZER;
      static int cur_fd = -1;               /* the root of A', -1 while there is none */
      static atomic_long n_unlink, n_walk, n_mark, n_enoent, n_other, n_secret,
                       n_secret_cached;
    
      static void die(const char *what)
      {
            fprintf(stderr, "FATAL %s: %s\n", what, strerror(errno));
            exit(2);
      }
    
      static void put_file(int dfd, const char *name, const char *content)
      {
            int fd = openat(dfd, name, O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC,
                            0644);
    
            if (fd < 0 || write(fd, content, strlen(content)) < 0)
                    die(name);
            close(fd);
      }
    
      /* "plain/../" @n times, then f1: a longer walk that checks nothing on its way */
      static char *longpath(int n)
      {
            char *p = malloc(n * 9 + 3), *q = p;
    
            for (int i = 0; i < n; i++, q += 9)
                    memcpy(q, "plain/../", 9);
            strcpy(q, "f1");
            return p;
      }
    
      static void try_read(int dfd, const char *path, int cached)
      {
            struct open_how how = { .flags = O_RDONLY | O_CLOEXEC,
                                    .resolve = RESOLVE_CACHED };
            char buf[32] = "";
            long n;
            int fd;
    
            if (cached)
                    fd = syscall(__NR_openat2, dfd, path, &how, sizeof(how));
            else
                    fd = openat(dfd, path, O_RDONLY | O_CLOEXEC);
            atomic_fetch_add(&n_walk, 1);
            if (fd < 0) {
                    if (errno == ENOENT)
                            atomic_fetch_add(&n_enoent, 1);
                    else if (!cached || errno != EAGAIN)
                            atomic_fetch_add(&n_other, 1);
                    return;
            }
            n = read(fd, buf, sizeof(buf) - 1);
            close(fd);
            if (n >= 6 && !strncmp(buf, "SECRET", 6)) {
                    if (cached)
                            atomic_fetch_add(&n_secret_cached, 1);
                    if (!atomic_fetch_add(&n_secret, 1))
                            printf("HIT: read \"%s\" through %s (%s walk)\n", buf,
                                   path, cached ? "lockless" : "any");
            } else {
                    atomic_fetch_add(&n_mark, 1);
            }
      }
    
      static void *walker(void *arg)
      {
            unsigned int r = (long)arg * 2654435761u;
    
            while (!atomic_load(&stop)) {
                    char *p_long, *p_short;
                    int dfd;
    
                    while (atomic_load(&writer_waiting) && !atomic_load(&stop))
                            usleep(20);
                    pthread_rwlock_rdlock(&cur_lock);
                    dfd = cur_fd;
                    if (dfd < 0) {
                            pthread_rwlock_unlock(&cur_lock);
                            usleep(100);
                            continue;
                    }
                    r = r * 1103515245u + 12345u;
                    p_long = longpath(1 + (r >> 8) % 400);
                    p_short = longpath(0);
                    try_read(dfd, p_long, 0);
                    try_read(dfd, p_short, 0);
                    try_read(dfd, p_long, 1);
                    pthread_rwlock_unlock(&cur_lock);
                    free(p_long);
                    free(p_short);
            }
            return NULL;
      }
    
      /* hand the walkers a new A' (or none), close the old one */
      static void publish(int fd)
      {
            int old;
    
            atomic_fetch_add(&writer_waiting, 1);
            pthread_rwlock_wrlock(&cur_lock);
            old = cur_fd;
            cur_fd = fd;
            pthread_rwlock_unlock(&cur_lock);
            atomic_fetch_sub(&writer_waiting, 1);
            if (old >= 0)
                    close(old);
      }
    
      static void *driver(void *arg __attribute__((unused)))
      {
            int a;
    
            if (mkdir(ADIR, 0755) && errno != EEXIST)
                    die("mkdir A");
            if (mount("A", ADIR, "tmpfs", 0, "size=4M"))
                    die("mount A");
            a = open(ADIR, O_PATH | O_DIRECTORY | O_CLOEXEC);
            if (a < 0 || mkdirat(a, "plain", 0755))
                    die("A/plain");
            put_file(a, "MARK_A", "MARK_A");
            while (!atomic_load(&stop)) {
                    int t, m, fd_a;
    
                    put_file(a, "f1", "SECRET_F");
                    t = syscall(__NR_open_tree, a, "",
                                OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC | AT_EMPTY_PATH);
                    if (t < 0)
                            die("open_tree A");
                    m = syscall(__NR_open_tree, a, "MARK_A",
                                OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
                    if (m < 0)
                            die("open_tree MARK_A");
                    if (syscall(__NR_move_mount, m, "", t, "f1",
                                MOVE_MOUNT_F_EMPTY_PATH))
                            die("move_mount");
                    close(m);
                    fd_a = openat(t, ".", O_PATH | O_DIRECTORY | O_CLOEXEC);
                    if (fd_a < 0)
                            die("open A'");
                    publish(fd_a);
                    usleep(200 + rand() % 1000);
                    close(t);                       /* A' is unmounted, fd_a holds it */
                    usleep(200 + rand() % 1000);
                    if (unlinkat(a, "f1", 0))       /* through A, a plain file there */
                            die("unlink f1");
                    atomic_fetch_add(&n_unlink, 1);
                    usleep(rand() % 300);
                    publish(-1);
            }
            close(a);
            umount2(ADIR, MNT_DETACH);
            return NULL;
      }
    
      int main(int argc, char **argv)
      {
            pthread_t d, *w;
            int c, i;
    
            setvbuf(stdout, NULL, _IOLBF, 0);
            while ((c = getopt(argc, argv, "t:w:")) != -1) {
                    switch (c) {
                    case 't':
                            duration = atoi(optarg);
                            break;
                    case 'w':
                            nwalkers = atoi(optarg);
                            break;
                    default:
                            fprintf(stderr, "usage: unlink_covered [-t seconds] [-w walkers]\n");
                            return 2;
                    }
            }
            if (unshare(CLONE_NEWNS) ||
                mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL))
                    die("unshare");
            if (mkdir(WORK, 0755) && errno != EEXIST)
                    die("mkdir");
            w = calloc(nwalkers, sizeof(*w));
            for (i = 0; i < nwalkers; i++)
                    if (pthread_create(&w[i], NULL, walker, (void *)(long)i))
                            die("pthread_create");
            if (pthread_create(&d, NULL, driver, NULL))
                    die("pthread_create");
            sleep(duration);
            atomic_store(&stop, 1);
            pthread_join(d, NULL);
            for (i = 0; i < nwalkers; i++)
                    pthread_join(w[i], NULL);
            printf("unlink_covered: %d s, %d walkers: unlinks %ld walks %ld mark %ld enoent %ld other %ld SECRET %ld (lockless %ld)\n",
                   duration, nwalkers, atomic_load(&n_unlink), atomic_load(&n_walk),
                   atomic_load(&n_mark), atomic_load(&n_enoent),
                   atomic_load(&n_other), atomic_load(&n_secret),
                   atomic_load(&n_secret_cached));
            return atomic_load(&n_secret) ? 1 : 0;
      }
    
    #  diff --git a/fs/namei.c b/fs/namei.c
    #  --- a/fs/namei.c
    #  +++ b/fs/namei.c
    #  @@ -35,6 +35,7 @@
    #   #include <linux/fcntl.h>
    #   #include <linux/device_cgroup.h>
    #   #include <linux/fs_struct.h>
    #  +#include <linux/delay.h>
    #   #include <linux/posix_acl.h>
    #   #include <linux/hash.h>
    #   #include <linux/bitops.h>
    #  @@ -1205,9 +1206,26 @@ static int sysctl_protected_symlinks __read_mostly;
    #   static int sysctl_protected_hardlinks __read_mostly;
    #   static int sysctl_protected_fifos __read_mostly;
    #   static int sysctl_protected_regular __read_mostly;
    #  +/* debug: widen the two windows of the detach_mounts() race */
    #  +static int sysctl_detach_race_walk_us __read_mostly;
    #  +static int sysctl_detach_race_unlink_us __read_mostly;
    #
    #   #ifdef CONFIG_SYSCTL
    #   static const struct ctl_table namei_sysctls[] = {
    #  +    {
    #  +            .procname       = "detach_race_walk_us",
    #  +            .data           = &sysctl_detach_race_walk_us,
    #  +            .maxlen         = sizeof(int),
    #  +            .mode           = 0644,
    #  +            .proc_handler   = proc_dointvec,
    #  +    },
    #  +    {
    #  +            .procname       = "detach_race_unlink_us",
    #  +            .data           = &sysctl_detach_race_unlink_us,
    #  +            .maxlen         = sizeof(int),
    #  +            .mode           = 0644,
    #  +            .proc_handler   = proc_dointvec,
    #  +    },
    #       {
    #               .procname       = "protected_symlinks",
    #               .data           = &sysctl_protected_symlinks,
    #  @@ -1878,6 +1896,10 @@ static struct dentry *lookup_fast(struct nameidata *nd)
    #               dentry = __d_lookup(parent, &nd->last);
    #               if (unlikely(!dentry))
    #                       return NULL;
    #  +            /* debug: between finding a mountpoint and crossing its mounts */
    #  +            if (unlikely(sysctl_detach_race_walk_us) && d_mountpoint(dentry))
    #  +                    usleep_range(sysctl_detach_race_walk_us,
    #  +                                 sysctl_detach_race_walk_us + 10);
    #               status = d_revalidate(nd->inode, &nd->last, dentry, nd->flags);
    #       }
    #       if (unlikely(status <= 0)) {
    #  @@ -5693,6 +5715,10 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir,
    #                       if (!error) {
    #                               dont_mount(dentry);
    #                               detach_mounts(dentry);
    #  +                            /* debug: the mounts are gone, d_delete() is still to come */
    #  +                            if (unlikely(sysctl_detach_race_unlink_us))
    #  +                                    usleep_range(sysctl_detach_race_unlink_us,
    #  +                                                 sysctl_detach_race_unlink_us + 10);
    #                       }
    #               }
    #       }
    
    Fixes: 8ed936b5671b ("vfs: Lazily remove mounts on unlinked files and directories.")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adapted mountpoint access from mp.node to the existing mp->m_list representation ]
    Signed-off-by: Sasha Levin <[email protected]>

 
net/iucv: fix the recvmsg window update [+ + +]
Author: Bryam Vargas <[email protected]>
Date:   Fri Aug 28 14:07:47 2026 -0500

    net/iucv: fix the recvmsg window update
    
    commit fa5acd038ea657ad5033713d6916214cbd349151 upstream.
    
    iucv_sock_recvmsg() sends the HiperSockets-only AF_IUCV_FLAG_WIN without
    testing the transport, so on a classic z/VM socket iucv_send_ctrl() sizes
    the skb through a NULL iucv->hs_dev. SO_MSGLIMIT accepts 1, so msglimit / 2
    is zero and one recvmsg() on its own socket is enough for an unprivileged
    process to take a spurious disconnect.
    
    It also calls iucv_send_ctrl() under spin_lock_bh(&message_q.lock), which
    allocates GFP_KERNEL inside a section the code treats as atomic. Sending
    outside that lock lets two recvmsg() reach afiucv_hs_send() at once, where
    msg_recv is sampled for the advertised window and subtracted after
    dev_queue_xmit() -- and sendmsg reaches that counter under lock_sock()
    while recvmsg holds no socket lock, so both can subtract the same value,
    the counter goes negative and the credit reaches the peer twice.
    
    Test the transport, claim the credit with atomic_xchg() after the last
    error exit and hand it back if the transmit fails, and send once the lock
    is dropped.
    
    Fixes: 3881ac441f64 ("af_iucv: add HiperSockets transport")
    Fixes: 238965b71b96 ("net/af_iucv: build proper skbs for HiperTransport")
    Cc: [email protected]
    Tested-by: Aswin Karuvally <[email protected]>
    Signed-off-by: Bryam Vargas <[email protected]>
    Reviewed-by: Alexandra Winter <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net/mctp: publish the mctp_dev only after it is initialised [+ + +]
Author: Binbin Deng <[email protected]>
Date:   Tue Sep 22 21:19:19 2026 +0800

    net/mctp: publish the mctp_dev only after it is initialised
    
    [ Upstream commit aadf655e8ea9a8ffa24bb8d69f504572e8d18181 ]
    
    mctp_add_dev() links the new mctp_dev into dev->mctp_ptr before mdev->dev
    is assigned, so a reader that picks the device up in that window
    dereferences a net_device pointer that is still NULL:
    
    KASAN: null-ptr-deref in range [0x00000000000000b0-0x00000000000000b7]
    Call Trace:
     <TASK>
     ? __pfx_mctp_sendmsg (./include/linux/sockptr.h:49)
     ? __pfx_mctp_dst_output (net/mctp/route.c:41)
     ? selinux_socket_sendmsg (security/selinux/hooks.c:5278)
     ____sys_sendmsg (net/socket.c:775 (discriminator 1) net/socket.c:790
     (discriminator 1) net/socket.c:2684 (discriminator 1))
     ? __pfx_____sys_sendmsg (net/socket.c:1131)
     ? __pfx_copy_msghdr_from_user (net/socket.c:2590)
     ? update_cfs_rq_load_avg (kernel/sched/fair.c:5478)
     ___sys_sendmsg (net/socket.c:2738)
     ? __pfx____sys_sendmsg (net/socket.c:2625)
     ? perf_event_task_tick (./include/linux/rcupdate.h:838)
     ? sched_tick (kernel/sched/core.c:5818)
     ? clockevents_program_event (kernel/time/clockevents.c:372)
     ? fdget (./include/linux/rcupdate.h:873 fs/file.c:1100)
     __sys_sendmsg (net/socket.c:2770)
     ? __pfx___sys_sendmsg (net/socket.c:2751)
     do_syscall_64 (arch/x86/entry/syscall_64.c:63)
     entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
     </TASK>
    
    Fix by publishing only once the object is fully initialised:
    __mctp_dev_get() runs under rcu_read_lock() only and hands
    this object to readers as soon as mctp_ptr is assigned, so
    they must never observe mdev->dev == NULL.
    
    Fixes: 583be982d934 ("mctp: Add device handling and netlink interface")
    Signed-off-by: Binbin Deng <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
net/mlx5e: Order ICOSQ cc update after CQ doorbell [+ + +]
Author: Li RongQing <[email protected]>
Date:   Tue Oct 6 13:58:20 2026 +0300

    net/mlx5e: Order ICOSQ cc update after CQ doorbell
    
    [ Upstream commit b056ca4d3742d0769f91137bb1ce3215428398f7 ]
    
    mlx5e_poll_ico_cq() requires sq->cc to be updated only after
    mlx5_cqwq_update_db_record(), otherwise a CQ overrun may occur.
    
    The current implementation updates sq->cc before the CQ doorbell
    record, violating this ordering requirement.
    
    Update the CQ doorbell record first and use dma_wmb() before updating
    sq->cc. This ensures that the CQ space is released to the device
    before the corresponding ICOSQ consumer index is updated by software.
    
    Fixes: fd9b4be8002c ("net/mlx5e: RX, Support multiple outstanding UMR posts")
    Signed-off-by: Li RongQing <[email protected]>
    Reviewed-by: Dragos Tatulea <[email protected]>
    Signed-off-by: Tariq Toukan <[email protected]>
    Reviewed-by: Daniel Machon <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
net/packet: guard the ll header push in packet_rcv_spkt() [+ + +]
Author: Quchaosheng <[email protected]>
Date:   Mon Sep 28 19:31:08 2026 +0800

    net/packet: guard the ll header push in packet_rcv_spkt()
    
    commit 28bc1ef699610ee09ce3d46a00552f5a0a0144bd upstream.
    
    packet_rcv_spkt() restores the link layer header with
    
            skb_push(skb, skb->data - skb_mac_header(skb));
    
    That subtraction is only meaningful when the device actually has a link
    layer header.  packet_rcv() and tpacket_rcv() both wrap it in
    dev_has_header(), which is also the predicate the block comment at the
    top of the file states the restore in terms of; packet_rcv_spkt() does
    not.  commit d549699048b4 ("net/packet: fix packet receive on L3
    devices without visible hard header") introduced the helper and changed
    the two call sites, and this one stayed behind.
    
    A device without a visible ll header can leave skb->mac_header at the
    0xFFFF sentinel that __alloc_skb() initialises it to.  A CAN skb does:
    init_can_skb() sets pkt_type and ip_summed but does not reset the
    headers, and commit 9f10374bb024 ("can: remove private CAN skb
    headroom infrastructure") dropped the skb_reset_*_header() calls that
    used to be there.  skb_mac_header() is then 0xFFFF, the length becomes
    a large negative number and skb_push() reports it through
    skb_under_panic() -- from softirq context, so it is a full system panic
    even with panic_on_oops=0:
    
      skbuff: skb_under_panic: text:ffffffff8bd21bc1 len:-65455 put:-65471 head:... data:... tail:0x50 end:0x180 dev:can0
      kernel BUG at net/core/skbuff.c:214!
      RIP: 0010:skb_panic+0x50/0x60
      Call Trace:
       <IRQ>
       skb_push+0x38/0x40
       packet_rcv_spkt+0xe1/0x170
       __netif_receive_skb_core.constprop.0+0x7e8/0xd30
       ...
      Kernel panic - not syncing: Fatal exception in interrupt
    
    The socket type is reachable: packet_create() accepts SOCK_PACKET
    alongside SOCK_RAW and SOCK_DGRAM behind the same CAP_NET_RAW check,
    and neither the socket length nor a capability check keeps it away
    from a CAN interface.
    
    The missing skb_reset_*_header() calls in init_can_skb() are a
    regression in their own right and are being fixed separately, but a
    packet socket should not turn a link layer that did not initialise its
    mac header into a kernel panic.  Guard the push the way the other two
    receive paths do.
    
    Tested on v7.3-rc5 under QEMU with a slcan device on a pty, which is
    the driver RX path: vcan does not reproduce it, because can_send()
    resets the headers on the way out.  One SOCK_PACKET socket bound to
    can0 and one frame written into the line discipline panics an
    unpatched kernel with the trace above; the same image with this patch
    prints no panic and powers off normally.  Both kernels are this tree,
    defconfig plus CONFIG_CAN_SLCAN=y, differing only in this hunk.
    
    Fixes: d549699048b4 ("net/packet: fix packet receive on L3 devices without visible hard header")
    Cc: [email protected]
    Signed-off-by: Quchaosheng <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net/packet: prevent TX_RING byte count overflow [+ + +]
Author: Ilkka Lappeteläinen <[email protected]>
Date:   Fri Sep 25 15:48:29 2026 +0300

    net/packet: prevent TX_RING byte count overflow
    
    commit 2cf81fc9505b148b1b70068303ea6ea4b1212403 upstream.
    
    tpacket_snd() drains every SEND_REQUEST frame in a TX ring and adds
    each valid packet length to the signed int len_sum. Userspace can
    recycle completed frames concurrently, so a single blocking send call
    is not bounded by the ring size.
    
    After enough successful transmissions len_sum wraps into the negative
    range. In particular, 65536 65535-byte frames followed by a 65007-byte
    frame produce 0xfffffdef, or -EIOCBQUEUED. sock_sendmsg_nosec() treats
    that as an impossible return and triggers a BUG. On systems configured
    to panic on oops, a CAP_NET_RAW holder can panic the host kernel.
    
    Stop before the next frame would make the byte count exceed INT_MAX.
    The positive short count leaves that frame pending for a later send
    call.
    
    A two-thread TPACKET_V2 reproducer triggered the BUG on an arm64 build
    of Linux 7.3-rc4. With this change, the same reproducer returned the
    expected positive short count without an oops.
    
    Fixes: 69e3c75f4d54 ("net: TX_RING and packet mmap")
    Cc: [email protected]
    Signed-off-by: Ilkka Lappeteläinen <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net/rds: don't let the rdma_cm destroy an id RDS still owns on route failure [+ + +]
Author: Allison Henderson <[email protected]>
Date:   Sat Oct 3 09:34:08 2026 -0700

    net/rds: don't let the rdma_cm destroy an id RDS still owns on route failure
    
    [ Upstream commit 98d446b7c013254a8a7b49720557676a3a851fde ]
    
    rds_rdma_cm_event_handler_cmn() hands the return value of
    rdma_resolve_route() straight back to the rdma_cm on
    RDMA_CM_EVENT_ADDR_RESOLVED.  A synchronous failure there - -ENOMEM
    from the route work allocation, an SA query that cannot be set up, a
    RoCE route with no usable device - makes addr_handler() destroy the
    id the event was delivered on.  That id is ic->i_cm_id, and nothing
    clears the pointer: the connection sits in RDS_CONN_CONNECTING with a
    freed id until its shutdown calls rdma_disconnect() and
    rdma_destroy_id() on it.
    
    The ROUTE_RESOLVED case already avoids this: rds_ib_cm_initiate_connect()
    forces a zero return while ic->i_cm_id == cm_id, as the comment there
    explains.  Do the same here - drop the connection and return 0 - so
    the id stays RDS's to destroy from the shutdown, and the reconnect
    gets a fresh one.
    
    Fixes: 55b7ed0b582f ("RDS: Common RDMA transport code")
    Assisted-by: LLM
    Signed-off-by: Allison Henderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
net/sched: act_api: release all action references on NEWACTION failure [+ + +]
Author: Xuanqiang Luo <[email protected]>
Date:   Wed Sep 16 20:19:18 2026 -0400

    net/sched: act_api: release all action references on NEWACTION failure
    
    [ Upstream commit 478eb5abb51931a152abab068f8a717b7ff480fd ]
    
    When a batched RTM_NEWACTION request replaces an existing action,
    tcf_idr_check_alloc() takes a temporary reference on it. If a later
    action fails to initialize, tcf_action_destroy() uses strict release
    semantics to clean up the actions initialized so far. For an action
    bound to a filter, the strict check returns -EPERM without dropping
    the temporary reference.
    
    This error also makes tcf_action_destroy() return before releasing
    subsequent entries. Any new action initialized between the bound
    action and the failing entry is leaked together with its reserved
    IDR slot, preventing reuse of its index.
    
    Use tcf_idr_release() to drop each reference held by the batch without
    rejecting bound actions. This allows cleanup to continue through all
    initialized entries and preserves the module reference release when
    an action is destroyed. Explicit action deletion and flushing retain
    their separate bind-count checks.
    
    Fixes: 55334a5db5cd ("net_sched: act: refuse to remove bound action outside")
    Cc: [email protected]
    Signed-off-by: Xuanqiang Luo <[email protected]>
    Reviewed-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: cls_api: reclaim an empty proto on the error path [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Thu Sep 24 04:32:49 2026 -0400

    net/sched: cls_api: reclaim an empty proto on the error path
    
    [ Upstream commit 0bb8eab29b55045281a4963d4557f2776cdf8cfa ]
    
    Two racing tc filter add requests on the same chain/prio of an
    unlocked classifier both run change() on the shared proto and both
    can fail: the winner's tcf_chain_tp_delete_empty() attempt gives up
    because the loser's handle is still in the idr, and the loser's
    error path drops only its own reference without a second reclamation
    attempt. The empty proto stays linked in the chain, holding the
    chain reference, a block reference and the classifier module
    reference until the chain or block is torn down.
    
    Reclaim the proto on the error path of any failed request that holds
    a proto reference. The reclamation is emptiness-gated:
    tcf_chain_tp_delete_empty() unlinks the proto only when
    delete_empty() admits it is empty, so a live shared proto is never
    unlinked. A proto the request created is reclaimed unconditionally -
    it is the only owner, so marking it for deletion is safe even without
    a delete_empty callback. Classifiers without one (the check marks the
    proto unconditionally) are rtnl-serialized, so the raced window this
    guard closes cannot arise for them.
    
    This is a follow-up to commit d4e359b3608a ("net/sched: cls_api: fix
    teardown of an adopted proto on insert-race loss"), which stopped the
    loser of the insert race from unlinking the winner's live proto but
    left the empty-proto residual in place.
    
    Conditions to recreate:
    - CONFIG_NET_CLS_FLOWER=y; veth pair
    - tc qdisc add dev veth0 ingress
    - two concurrent `tc filter add dev veth0 ingress protocol ip pref 1
      flower skip_sw ... action drop` (both fail in fl_hw_replace_filter
      after publishing their handle in the idr); repeat in a loop
    - an empty flower tp stays linked after both requests fail; visible
      as a bare `filter protocol ip pref 1 flower chain 0` header in
      `tc filter show` with no filter entries
    - CAP_NET_ADMIN (namespace-local via unshare -Urn suffices)
    
    Fixes: 8b64678e0af8 ("net: sched: refactor tp insert/delete for concurrent execution")
    Reported-by: Sashiko (nipa) <[email protected]>
    Closes: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/[email protected]
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: cls_flower: validate mask pointer after nla_next() [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Wed Aug 26 10:51:20 2026 +0800

    net/sched: cls_flower: validate mask pointer after nla_next()
    
    commit fee10655709c5c597e8e9f722f3035d9ea31ff3a upstream.
    
    fl_set_enc_opt() iterates the key's nested tunnel-option attributes
    with nla_for_each_attr() while advancing a single mask pointer via
    nla_next() at the bottom of each loop, so the mask cursor is driven
    by the number of key attributes rather than by the mask's own
    attributes.  The nla_ok() added by commit c96adff956191 ("cls_flower:
    call nla_ok() before nla_next()") only validates the mask pointer
    that was just consumed; the pointer produced by nla_next() is used by
    the next iteration (fl_set_geneve_opt() and siblings) without any
    validation.
    
    The mask's nested attributes are validated with NL_VALIDATE_LIBERAL,
    which merely warns on trailing bytes that do not form a complete
    attribute.  A mask carrying one valid attribute plus 1-3 residue
    bytes (or a non-aligned attribute length making msk_depth negative)
    therefore reaches the next iteration with msk_depth != 0, so neither
    the !msk_depth check in fl_set_enc_opt() nor the !depth check in the
    per-type helpers fires.  nla_type() then reads past the mask payload
    and nla_parse_nested_deprecated() iterates with an nla_len taken
    from those bytes, reading well beyond the mask attribute (KASAN:
    slab-out-of-bounds read in __nla_validate_parse from fl_change()).
    
    Validate the advanced mask pointer as well: when the mask is not
    legitimately exhausted (msk_depth != 0) and the new pointer fails
    nla_ok(), reject the filter with -EINVAL.  An exactly exhausted mask
    still skips the check, preserving exact-match behaviour for the
    remaining key attributes.
    
    Fixes: c96adff95619 ("cls_flower: call nla_ok() before nla_next()")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Signed-off-by: Aohan Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net/sched: cls_u32: skip hash tables in u32_bind_class() [+ + +]
Author: Zhang Changzhong <[email protected]>
Date:   Tue Oct 20 22:24:58 2026 +0200

    net/sched: cls_u32: skip hash tables in u32_bind_class()
    
    [ Upstream commit 6d3724e616faf952c3adcf8414fc21a828ef3709 ]
    
    u32_walk() enumerates both struct tc_u_hnode and struct tc_u_knode
    through the walker callback. u32_bind_class() unconditionally casts the
    passed fh to tc_u_knode and accesses &n->res, so when fh is actually a
    tc_u_hnode, which has no tcf_result member, this results in a
    slab-out-of-bounds read of res->classid in tc_cls_bind_class().
    
    The issue can be reproduced with the following commands:
    
        tc qdisc add dev lo root handle 1: hfsc
        tc class add dev lo parent 1: classid 1:1 hfsc sc rate 1000kbit
        tc filter add dev lo parent 1:1 protocol ip prio 1 u32 match u32 0 0 flowid 1:1
        tc class add dev lo parent 1: classid 1:2 hfsc sc rate 2000kbit
    
    Fix this by skipping hash tables via the TC_U32_KEY(handle) check.
    
    Fixes: 07d79fc7d94e ("net_sched: add reverse binding for tc class")
    Signed-off-by: Zhang Changzhong <[email protected]>
    Acked-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: em_text: reject unterminated algo before autoload [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Wed Sep 30 03:31:02 2026 -0400

    net/sched: em_text: reject unterminated algo before autoload
    
    [ Upstream commit c9728fcf2e7fb4a7a8d08ebd9524c3b02ae1a021 ]
    
    This is a follow-up to commit 9c572a83037a ("net/sched: fix potential
    stack infoleak in em_text_dump()"), which zero-initialised the dump-side
    struct. Sashiko pointed at a pre-existing bug that exposed the change-side
    input-validation gap open.
    
    em_text_change() casts the raw netlink attribute payload to struct
    tcf_em_text and passes conf->algo, a 16-byte array with no enforced NUL
    terminator, to textsearch_prepare().  On the TS_AUTOLOAD retry
    textsearch_prepare() calls request_module("ts_%s", algo); vsnprintf()
    walks %s until it finds a NUL, so an algo[] with no NUL reads past the
    array into the adjacent struct fields and payload and feeds those bytes
    to the usermode helper command line.  This is an out-of-bounds read and
    a kernel memory disclosure.
    
    Reject the attribute when no NUL exists within TC_EM_TEXT_ALGOSIZ bytes,
    matching the check xt_string has had since 3ab720881b6e.
    
    Conditions to recreate the bug:
    - CAP_NET_ADMIN on the target netns (namespace-local via unshare -Urn
      is enough)
    - install clsact on an interface, then add a basic filter with one text
      ematch whose algo[] is 16 bytes with no NUL (e.g. "A"*16) and
      pattern_len at least 1
    - the add fails with -ENOENT and the kernel invokes modprobe with a
      module name made of "ts_" plus the 16 bytes and the adjacent payload
    
    Fixes: d675c989ed2d4 ("[PKT_SCHED]: Packet classification based on textsearch (ematch)")
    Reported-by: Sashiko (gemini) <[email protected]>
    Closes: https://sashiko.dev/#/patchset/20260918133953.12494-1-bernard.ladenthin%40gmail.com
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: fix use-after-free in __tcf_action_put() [+ + +]
Author: Jérémy Jean <[email protected]>
Date:   Thu Oct 8 18:13:49 2026 +0000

    net/sched: fix use-after-free in __tcf_action_put()
    
    commit 7b16eb911091aae237a8673da94e4dfb9cd21d54 upstream.
    
    __tcf_action_put() decrements the reference count before decrementing the
    binding count. Another thread can free the action between these operations,
    causing the binding-count update to access freed memory. KASAN reports it
    as:
    
      BUG: KASAN: slab-use-after-free in __tcf_action_put+0x327/0x340
      Write of size 4 at addr ff11000000d46420 by task tc-put-pause/64
    
    Hold the action IDR mutex across both counter updates and IDR removal,
    keeping cleanup outside the lock.
    
    Fixes: 16af6067392c ("net: sched: implement reference counted action release")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Jérémy Jean <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net/sched: fq_codel: match the no-drop threshold to the packet size [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Sat Sep 26 14:03:27 2026 -0400

    net/sched: fq_codel: match the no-drop threshold to the packet size
    
    [ Upstream commit d031465acc362866f27e4f8f79cfecf1037fe2e5 ]
    
    commit d9ebd8f9aa8b ("net/sched: fq_codel: clamp default quantum and mtu")
    clamped both q->quantum and q->cparams.mtu to [256, FQ_CODEL_QUANTUM_MAX].
    The two fields mean different things: quantum is a DRR credit that wants
    the 256 floor, but cparams.mtu is the CoDel no-drop threshold
    (codel_impl.h "*backlog <= params->mtu"). On a link whose maximum
    transmitted packet size is below 256, the floor extends CoDel's
    minimum-backlog exemption beyond one packet and delays drop or mark
    eligibility by several small packets.
    
    Split the clamp. quantum keeps [256, FQ_CODEL_QUANTUM_MAX]; cparams.mtu
    tracks psched_mtu() (the device MTU plus its hard-header length) with
    only the upper bound that guards the original overflow (psched_mtu()
    wrapping to ~2 GiB on a huge-MTU device).
    
    Conditions to recreate the bug: attach an fq_codel qdisc on a link
    whose MTU plus hard_header_len is below 256 (e.g. a CAN interface). At
    that MTU the no-drop threshold must equal the device MTU plus its
    hard-header length; before this patch it was forced to 256.
    Basic Testing done: with dev->mtu=100 and hard_header_len=14, a
    return probe on fq_codel_init() observed cparams.mtu change from 256 to 114
    
    Fixes: d9ebd8f9aa8b ("net/sched: fq_codel: clamp default quantum and mtu")
    Reported-by: Sashiko (nipa) <[email protected]>
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/[email protected]
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: sch_codel: match the no-drop threshold to the packet size [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Sat Sep 26 14:03:28 2026 -0400

    net/sched: sch_codel: match the no-drop threshold to the packet size
    
    [ Upstream commit 54518e0e827f4ca9229ae657022c60bf60f5c1bf ]
    
    commit 6439461f1618 ("net/sched: sch_codel: clamp default mtu to avoid
    disabling CoDel") clamped q->params.mtu to [256, 1 << 20]. The value is
    the CoDel no-drop threshold (codel_impl.h "*backlog <= params->mtu"), so
    on a link whose maximum transmitted packet size is below 256 the floor
    extends CoDel's minimum-backlog exemption beyond one packet and delays
    drop or mark eligibility by several small packets.
    
    Keep the upper bound that guards the original overflow (psched_mtu()
    wrapping to ~2 GiB on a huge-MTU device) but drop the 256 floor, so the
    threshold tracks the real device packet size.
    
    Conditions to recreate the bug: attach a codel qdisc on a link whose
    MTU plus hard_header_len is below 256 (e.g. a CAN interface). At that
    MTU the no-drop threshold must equal the device MTU plus its
    hard-header length; before this patch it was forced to 256.
    Requires CAP_NET_ADMIN in a user namespace.
    
    Fixes: 6439461f1618 ("net/sched: sch_codel: clamp default mtu to avoid disabling CoDel")
    Reported-by: Sashiko (nipa) <[email protected]>
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/[email protected]
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
net/smc: protect clcsock lifetime in smc_getname [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Thu Oct 8 16:44:44 2026 +0800

    net/smc: protect clcsock lifetime in smc_getname
    
    commit 64a6b36b0e1855288080bc5f89769f27d6dc03c8 upstream.
    
    smc_getname() dereferences smc->clcsock without holding
    clcsock_release_lock. Link-group termination can release the CLC socket
    through smc_close_active_abort() while the SMC socket is still open,
    for example after shutdown(SHUT_WR).
    
    A getsockname() caller can load smc->clcsock, then the termination worker
    can clear the pointer and call sock_release() before the caller accesses
    clcsock->ops or invokes getname(). This causes a use-after-free; if the
    worker clears the pointer before the load, it causes a NULL dereference.
    The syscall's file reference keeps the SMC socket alive but does not
    prevent asynchronous release of its CLC socket.
    
    KASAN reported the following with test-only timing instrumentation:
    
      BUG: KASAN: slab-use-after-free in smc_getname+0x19e/0x1b0
      Read of size 8 at addr ffff888109abb4e0 by task poc/103
      Call Trace:
       smc_getname+0x19e/0x1b0
       do_getsockname+0xe5/0x170
       __sys_getsockname+0x8c/0x100
    
      Allocated by task 95:
       sock_alloc_inode+0x1e/0x280
       sock_alloc+0x3d/0x240
       __sock_create+0x7e/0x430
       smc_create+0x121/0x240
    
      Freed by task 0:
       kmem_cache_free+0xcc/0x340
       rcu_core+0x50a/0x1850
    
      Last potentially related work creation:
       evict+0x446/0x6c0
       smc_clcsock_release+0xa8/0xd0
       smc_close_active_abort+0x26a/0x3a0
       __smc_lgr_terminate.part.0+0x137/0x2e0
    
    Hold clcsock_release_lock across the pointer check and the getname()
    callback to serialize with smc_clcsock_release(). Return -EBADF if the
    CLC socket has already been released, preserving the existing peer
    state check and the callback's return value otherwise.
    
    Fixes: b03faa1fafc8 ("net/smc: postpone release of clcsock")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Reviewed-by: Mahanta Jambigi <[email protected]>
    Reviewed-by: Dust Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net: add and use skb_get_hash_net [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Sun Jun 9 00:10:39 2024 +0200

    net: add and use skb_get_hash_net
    
    [ Upstream commit b975d3ee5962237c1e2f5d5aeeaaf0dc2173486c ]
    
    Years ago flow dissector gained ability to delegate flow dissection
    to a bpf program, scoped per netns.
    
    Unfortunately, skb_get_hash() only gets an sk_buff argument instead
    of both net+skb.  This means the flow dissector needs to obtain the
    netns pointer from somewhere else.
    
    The netns is derived from skb->dev, and if that is not available, from
    skb->sk.  If neither is set, we hit a (benign) WARN_ON_ONCE().
    
    Trying both dev and sk covers most cases, but not all, as recently
    reported by Christoph Paasch.
    
    In case of nf-generated tcp reset, both sk and dev are NULL:
    
    WARNING: .. net/core/flow_dissector.c:1104
     skb_flow_dissect_flow_keys include/linux/skbuff.h:1536 [inline]
     skb_get_hash include/linux/skbuff.h:1578 [inline]
     nft_trace_init+0x7d/0x120 net/netfilter/nf_tables_trace.c:320
     nft_do_chain+0xb26/0xb90 net/netfilter/nf_tables_core.c:268
     nft_do_chain_ipv4+0x7a/0xa0 net/netfilter/nft_chain_filter.c:23
     nf_hook_slow+0x57/0x160 net/netfilter/core.c:626
     __ip_local_out+0x21d/0x260 net/ipv4/ip_output.c:118
     ip_local_out+0x26/0x1e0 net/ipv4/ip_output.c:127
     nf_send_reset+0x58c/0x700 net/ipv4/netfilter/nf_reject_ipv4.c:308
     nft_reject_ipv4_eval+0x53/0x90 net/ipv4/netfilter/nft_reject_ipv4.c:30
     [..]
    
    syzkaller did something like this:
    table inet filter {
      chain input {
        type filter hook input priority filter; policy accept;
        meta nftrace set 1
        tcp dport 42 reject with tcp reset
       }
       chain output {
        type filter hook output priority filter; policy accept;
        # empty chain is enough
       }
    }
    
    ... then sends a tcp packet to port 42.
    
    Initial attempt to simply set skb->dev from nf_reject_ipv4 doesn't cover
    all cases: skbs generated via ipv4 igmp_send_report trigger similar splat.
    
    Moreover, Pablo Neira found that nft_hash.c uses __skb_get_hash_symmetric()
    which would trigger same warn splat for such skbs.
    
    Lets allow callers to pass the current netns explicitly.
    The nf_trace infrastructure is adjusted to use the new helper.
    
    __skb_get_hash_symmetric is handled in the next patch.
    
    Reported-by: Christoph Paasch <[email protected]>
    Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/494
    Reviewed-by: Willem de Bruijn <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: 8ec454dcd00c ("ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel()")
    Signed-off-by: Sasha Levin <[email protected]>

net: bonding: fix use-after-free in bond_xmit_broadcast() [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Sun Oct 25 09:47:25 2026 +0100

    net: bonding: fix use-after-free in bond_xmit_broadcast()
    
    [ Upstream commit 2884bf72fb8f03409e423397319205de48adca16 ]
    
    bond_xmit_broadcast() reuses the original skb for the last slave
    (determined by bond_is_last_slave()) and clones it for others.
    Concurrent slave enslave/release can mutate the slave list during
    RCU-protected iteration, changing which slave is "last" mid-loop.
    This causes the original skb to be double-consumed (double-freed).
    
    Replace the racy bond_is_last_slave() check with a simple index
    comparison (i + 1 == slaves_count) against the pre-snapshot slave
    count taken via READ_ONCE() before the loop.  This preserves the
    zero-copy optimization for the last slave while making the "last"
    determination stable against concurrent list mutations.
    
    The UAF can trigger the following crash:
    
    ==================================================================
    BUG: KASAN: slab-use-after-free in skb_clone
    Read of size 8 at addr ffff888100ef8d40 by task exploit/147
    
    CPU: 1 UID: 0 PID: 147 Comm: exploit Not tainted 7.0.0-rc3+ #4 PREEMPTLAZY
    Call Trace:
     <TASK>
     dump_stack_lvl (lib/dump_stack.c:123)
     print_report (mm/kasan/report.c:379 mm/kasan/report.c:482)
     kasan_report (mm/kasan/report.c:597)
     skb_clone (include/linux/skbuff.h:1724 include/linux/skbuff.h:1792 include/linux/skbuff.h:3396 net/core/skbuff.c:2108)
     bond_xmit_broadcast (drivers/net/bonding/bond_main.c:5334)
     bond_start_xmit (drivers/net/bonding/bond_main.c:5567 drivers/net/bonding/bond_main.c:5593)
     dev_hard_start_xmit (include/linux/netdevice.h:5325 include/linux/netdevice.h:5334 net/core/dev.c:3871 net/core/dev.c:3887)
     __dev_queue_xmit (include/linux/netdevice.h:3601 net/core/dev.c:4838)
     ip6_finish_output2 (include/net/neighbour.h:540 include/net/neighbour.h:554 net/ipv6/ip6_output.c:136)
     ip6_finish_output (net/ipv6/ip6_output.c:208 net/ipv6/ip6_output.c:219)
     ip6_output (net/ipv6/ip6_output.c:250)
     ip6_send_skb (net/ipv6/ip6_output.c:1985)
     udp_v6_send_skb (net/ipv6/udp.c:1442)
     udpv6_sendmsg (net/ipv6/udp.c:1733)
     __sys_sendto (net/socket.c:730 net/socket.c:742 net/socket.c:2206)
     __x64_sys_sendto (net/socket.c:2209)
     do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94)
     entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
     </TASK>
    
    Allocated by task 147:
    
    Freed by task 147:
    
    The buggy address belongs to the object at ffff888100ef8c80
     which belongs to the cache skbuff_head_cache of size 224
    The buggy address is located 192 bytes inside of
     freed 224-byte region [ffff888100ef8c80, ffff888100ef8d60)
    
    Memory state around the buggy address:
     ffff888100ef8c00: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc
     ffff888100ef8c80: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    >ffff888100ef8d00: fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
                                                        ^
     ffff888100ef8d80: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb
     ffff888100ef8e00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ==================================================================
    
    Fixes: 4e5bd03ae346 ("net: bonding: fix bond_xmit_broadcast return value error bug")
    Reported-by: Weiming Shi <[email protected]>
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    [ Backport to 5.15.y: 5.15's bond_xmit_broadcast() walks the live slave
      list, not the all_slaves array upstream indexes into (that walk came
      with ce7a381697cb "net: bonding: add broadcast_neighbor option for
      802.3ad"), so there is no index/count pair that stays consistent
      while the list changes. Instead of choosing the "last" slave up
      front, defer it: clone the skb for each up slave as the next one is
      found, and transmit the original skb to the last up slave seen only
      after the walk has finished. The original skb is consumed exactly
      once and not touched afterwards, however the list changes during
      the RCU walk; slave pointers stay valid under rcu_read_lock() since
      __bond_release_one() does synchronize_rcu() before freeing. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: bridge: avoid recursive multicast port cleanup [+ + +]
Author: Zixuan Chai <[email protected]>
Date:   Sun Sep 27 01:04:39 2026 +0800

    net: bridge: avoid recursive multicast port cleanup
    
    commit 5158353121bae4f552cb677ce8c5c3ef52f93a0d upstream.
    
    br_multicast_sg_del_exclude_ports() removes automatically added STAR_EXCL
    port groups by calling br_multicast_del_pg(). For S,G entries, that
    deletion calls back into br_multicast_sg_del_exclude_ports(), so a large
    number of STAR_EXCL ports consumes one kernel stack frame per port and can
    hit the stack guard page.
    
    Keep the complete port-group deletion path for cleanup, but suppress the
    S,G exclude-port cleanup while that helper is already walking the same
    entry. Normal deletion callers retain the existing behavior.
    
    Fixes: 8266a0491e92 ("net: bridge: mcast: handle port group filter modes")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Zixuan Chai <[email protected]>
    Signed-off-by: Ren Wei <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net: bridge: mcast: don't truncate the port group walk on teardown [+ + +]
Author: Jun Yang <[email protected]>
Date:   Mon Aug 31 19:13:04 2026 +0800

    net: bridge: mcast: don't truncate the port group walk on teardown
    
    commit 5a3f7a683aee56e1f15c9d53041f3236767eaae7 upstream.
    
    __br_multicast_disable_port_ctx() and br_multicast_del_port() walk
    port->mglist with hlist_for_each_entry_safe(). However,
    br_multicast_find_del_pg() can also delete other entries from the same
    list through br_multicast_fwd_src_remove() or __fwd_del_star_excl().
    
    If such an entry is the iterator's saved next node, hlist_del_init()
    clears its ->next and terminates the walk early. The reproducer triggers
    this in both teardown walks, leaving port groups in the bridge mdb with
    a dangling ->key.port after del_nbp() frees the port:
    
      BUG: KASAN: slab-use-after-free in __mdb_fill_info+0x1191/0x1320
       __mdb_fill_info+0x1191/0x1320
       br_mdb_dump+0x594/0xe40
       rtnl_mdb_dump+0x1cf/0x5d0
    
    Use hlist_del_init_rcu() to unlink the group while preserving ->next.
    br_multicast_del_pg() and the teardown walks run under
    br->multicast_lock. The GC worker must acquire the same lock before
    detaching the group for destruction, so the node remains alive while
    the walk uses the preserved pointer.
    
    Preserving ->next means a walk can now reach a group that an earlier
    iteration already deleted as a side effect. That group is off mp->ports,
    so br_multicast_find_del_pg() would fall through its port scan and hit
    the trailing WARN_ON(1). Skip such groups at the top of that helper: a
    port group is put on port->mglist when it is created and only unlinked
    when it is deleted, so hlist_unhashed() identifies exactly this case.
    
    Fixes: b08123684bd5 ("net: bridge: mcast: install S,G entries automatically based on reports")
    Cc: [email protected]
    Suggested-by: Nikolay Aleksandrov <[email protected]>
    Reported-by: TencentOS Corvus AI <[email protected]>
    Signed-off-by: Jun Yang <[email protected]>
    Reviewed-by: Nikolay Aleksandrov <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net: bridge: use option bits for CFM/MRP frame handlers [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Wed Sep 16 21:13:33 2026 -0400

    net: bridge: use option bits for CFM/MRP frame handlers
    
    [ Upstream commit 7a49e6b16f36b8e085521699adbca3e321b6dd0c ]
    
    CFM and MRP register a global br_frame_type whose hlist_node is linked
    into the per-bridge frame_type_list when the first MEP/MRP instance is
    created. Enabling the protocol on multiple bridges therefore inserts the
    same node into multiple lists. Unregistering it on one bridge then
    corrupts list state belonging to another.
    
    These handlers can only be installed once per bridge, and they are
    uncommon. Track their per-bridge enable state with net_bridge option
    bits, which already live on the Rx hot cache line, and dispatch the
    matching handler directly from the receive path. Check both bits
    together first as an unlikely case.
    
    Remove the generic frame_type_list and br_frame_type helpers, which
    have had no other users since CFM and MRP were added. That shrinks
    struct net_bridge by 8 bytes and drops the list walk from the fast
    path. When neither protocol is compiled in, BR_CFM_MRP_OPTS is 0 and
    the compiler prunes the branch.
    
    Fixes: 90c628dd47ff ("net: bridge: extend the process of special frames")
    Fixes: dc32cbb3dbd7 ("bridge: cfm: Kernel space implementation of CFM. CCM frame RX added.")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Suggested-by: Nikolay Aleksandrov <[email protected]>
    Co-developed-by: Yilin Zhu <[email protected]>
    Signed-off-by: Yilin Zhu <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Acked-by: Nikolay Aleksandrov <[email protected]>
    Link: https://patch.msgid.link/0345b9d5aa60ba416f6738ff1b87140f0a749cb8.1788417901.git.zhilinz@nebusec.ai
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adjusted enum insertion context in br_private.h because three preceding bridge options are absent. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: ena: fix MMIO read buffer leak on probe failure [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 30 07:23:14 2026 -0400

    net: ena: fix MMIO read buffer leak on probe failure
    
    [ Upstream commit 9476b4468862927297c94c440863cd8ed1e7cc83 ]
    
    ena_device_init() initializes the MMIO read mechanism with
    ena_com_mmio_reg_read_request_init(), which allocates a coherent DMA
    buffer for MMIO read responses.
    
    The normal removal path releases this buffer through
    ena_com_mmio_reg_read_request_destroy(). However, if ena_probe() fails
    after ena_device_init() succeeds, the error path destroys the admin
    resources and eventually frees ena_dev without destroying the MMIO read
    request, leaving the coherent DMA buffer allocated.
    
    Call ena_com_mmio_reg_read_request_destroy() in the probe error path
    before releasing the remaining device resources.
    
    This issue was found by manual code inspection.
    
    Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Adjusted cleanup context due to missing PHC, devlink, and customer-metrics code. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: ena: Remove autopolling mode [+ + +]
Author: Dr. David Alan Gilbert <[email protected]>
Date:   Wed Sep 30 07:23:13 2026 -0400

    net: ena: Remove autopolling mode
    
    [ Upstream commit b356b9170815f822394667010d478d53901ff581 ]
    
    This manually reverts
    commit a4e262cde3cd ("net: ena: allow automatic fallback to polling mode")
    
    which is unused.
    
    (I did it manually because there are other minor comment
    and function changes surrounding it).
    Build tested only.
    
    Suggested-by: David Arinzon <[email protected]>
    Signed-off-by: Dr. David Alan Gilbert <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: 9476b4468862 ("net: ena: fix MMIO read buffer leak on probe failure")
    Signed-off-by: Sasha Levin <[email protected]>

net: ipconfig: bound DHCP option construction [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Tue Sep 29 22:33:58 2026 -0400

    net: ipconfig: bound DHCP option construction
    
    [ Upstream commit e47a1958e12abc3a17b5231a4f21c8f1bf662e08 ]
    
    ic_dhcp_init_options() appends the hostname (option 12), vendor-class
    (option 60) and client-ID (option 61) options into the fixed 312-byte
    bootp_pkt.exten[] buffer.  Only the client-ID branch checked the
    remaining space; the hostname and vendor-class writes were unbounded.
    
    A 64-byte hostname together with the maximum 252-byte dhcpclass=
    identifier needs 18 + (2 + 64) + (2 + 252) = 338 of the 312 available
    bytes even before the terminating END marker, so the vendor-class memcpy
    runs past the end of exten[].  With CONFIG_FORTIFY_SOURCE this is
    reported as a field-spanning write and, when the kernel is booted with
    panic_on_warn=1, aborts boot with a panic.
    
    Route the optional options through a common helper that makes sure the
    option, its 2-byte header and the END marker all fit and drops an option
    that would not.  Configurations with short options keep sending exactly
    the same bytes as before.
    
    Fixes: 130c0f47fdf9 ("ipconfig: send host-name in DHCP requests")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/7808dfbfa2162dfd0b19f59aff5742d6e0db2abb.1789798023.git.xuyuqiabc@gmail.com
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: ipconfig: Remove outdated comment and indent code block [+ + +]
Author: Thorsten Blum <[email protected]>
Date:   Tue Sep 29 22:33:57 2026 -0400

    net: ipconfig: Remove outdated comment and indent code block
    
    [ Upstream commit e405b3c9d4aaa10972525fe2ea5cf94224020561 ]
    
    The comment has been around ever since commit 1da177e4c3f4
    ("Linux-2.6.12-rc2") and can be removed. Remove it and indent the code
    block accordingly.
    
    Signed-off-by: Thorsten Blum <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: e47a1958e12a ("net: ipconfig: bound DHCP option construction")
    Signed-off-by: Sasha Levin <[email protected]>

net: openvswitch: conntrack: fix helper UAF due to extensions realloc [+ + +]
Author: Ilya Maximets <[email protected]>
Date:   Wed Sep 30 09:07:09 2026 -0400

    net: openvswitch: conntrack: fix helper UAF due to extensions realloc
    
    [ Upstream commit 1a4151e6be57b098b7a5ebfbde58585e83200cdc ]
    
    While calling the helpers, a raw pointer to the extensions area is
    wired into expectations list:
    
      -> nf_ct_helper()
       -> helper->help()
        -> nf_ct_expect_related_report()
         -> nf_ct_expect_insert()
          -> hlist_add_head_rcu(&exp->lnode, &master_help->expectations)
    
    In case the connection is not confirmed yet, more extensions can be
    added afterwards with *_ext_add() calls reallocating the extension
    space and leaving the now invalid pointer in the expectations list
    that is later accessed while removing the expectation.
    
    Make sure that helpers are called at the end after all the other
    extensions are already added.
    
    Note that the helper rejection now leaves the mark and labels set,
    but that's not different from how the NAT was handled before or how
    the mark and the labels were handled on confirmation failure.  And
    there are no atomicity guarantees provided by the API anyway.
    
    Fixes: cae3a2627520 ("openvswitch: Allow attaching helpers to ct action")
    Cc: [email protected]
    Reported-by: Axel Mierczuk <[email protected]>
    Signed-off-by: Ilya Maximets <[email protected]>
    Reviewed-by: Aaron Conole <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted nf_ct_helper() calls to the existing ovs_ct_helper() API. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: openvswitch: validate transport header presence in set_ipv6_addr [+ + +]
Author: Fernando Fernandez Mancera <[email protected]>
Date:   Thu Oct 8 12:41:35 2026 +0200

    net: openvswitch: validate transport header presence in set_ipv6_addr
    
    [ Upstream commit 3c6a4b11330fe424557538a98fca9f0a4c5bf313 ]
    
    When executing IPv6 address rewrite actions on IPv6 fragments,
    set_ipv6_addr() calls update_ipv6_checksum(). If parse_ipv6hdr()
    processes a non-first IPv6 fragment, it sets key->ip.proto to
    NEXTHDR_FRAGMENT and returns early without calling
    skb_set_transport_header().
    
    update_ipv6_checksum() unconditionally evaluates skb_transport_offset()
    on entry before checking l4_proto.  Because skb->transport_header is
    uninitialized, this triggers a warning under CONFIG_DEBUG_NET=y although
    it is completely harmless.
    
    Fix this by returning early in update_ipv6_checksum() if l4_proto is
    NEXTHDR_FRAGMENT. This avoids reading the uninitialized transport offset
    for fragments while preserving the debug warning for any other protocol
    where the transport header is unexpectedly missing.
    
    See the syzbot trace:
    
    !skb_transport_header_was_set(skb)
    WARNING: ./include/linux/skbuff.h:3075 at skb_transport_header include/linux/skbuff.h:3075 [inline], CPU#1: syz-executor463/5635
    WARNING: ./include/linux/skbuff.h:3075 at skb_transport_offset include/linux/skbuff.h:3250 [inline], CPU#1: syz-executor463/5635
    WARNING: ./include/linux/skbuff.h:3075 at update_ipv6_checksum net/openvswitch/actions.c:361 [inline], CPU#1: syz-executor463/5635
    WARNING: ./include/linux/skbuff.h:3075 at set_ipv6_addr+0x462/0x660 net/openvswitch/actions.c:399, CPU#1: syz-executor463/5635
    [...]
    RIP: 0010:skb_transport_header include/linux/skbuff.h:3075 [inline]
    RIP: 0010:skb_transport_offset include/linux/skbuff.h:3250 [inline]
    RIP: 0010:update_ipv6_checksum net/openvswitch/actions.c:361 [inline]
    RIP: 0010:set_ipv6_addr+0x462/0x660 net/openvswitch/actions.c:399
    [...]
    Call Trace:
     <TASK>
     set_ipv6 net/openvswitch/actions.c:531 [inline]
     do_execute_actions+0x557e/0x8600 net/openvswitch/actions.c:1366
     ovs_execute_actions+0xde/0x520 net/openvswitch/actions.c:1592
     ovs_packet_cmd_execute+0xb4f/0xf10 net/openvswitch/datapath.c:705
     genl_family_rcv_msg_doit+0x233/0x340 net/netlink/genetlink.c:1114
     genl_rcv_msg+0x614/0x7a0 net/netlink/genetlink.c:1209
     netlink_rcv_skb+0x226/0x4a0 net/netlink/af_netlink.c:2572
     genl_rcv+0x28/0x40 net/netlink/genetlink.c:1218
     netlink_unicast+0x7bd/0x940 net/netlink/af_netlink.c:1361
     netlink_sendmsg+0x813/0xb40 net/netlink/af_netlink.c:1916
     sock_sendmsg_nosec+0x14e/0x190 net/socket.c:800
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=4cc63fcfb3845e149969
    Fixes: 3fdbd1ce11e5 ("openvswitch: add ipv6 'set' action")
    Signed-off-by: Fernando Fernandez Mancera <[email protected]>
    Reviewed-by: Ilya Maximets <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: rds: fix uninitialized trans dereference in CM event handler [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Sat Oct 3 09:34:07 2026 -0700

    net: rds: fix uninitialized trans dereference in CM event handler
    
    commit 492ba6ac1b1ffb8a06ff52db0825c1af2cdb28c8 upstream.
    
    rds_rdma_cm_event_handler_cmn() assigns trans only when the RDMA
    device is an InfiniBand CA (RDMA_NODE_IB_CA).  On any other device
    type, e.g. an iWARP RNIC such as siw, trans stays uninitialized, but
    the event switch dereferences it: unconditionally in the
    RDMA_CM_EVENT_CONNECT_REQUEST case via trans->cm_handle_connect(),
    and (with a connection context) in the ROUTE_RESOLVED and
    ESTABLISHED cases.
    
    An RDS listener on an iWARP device therefore crashes the kernel as
    soon as a connect request arrives: with CONFIG_INIT_STACK_ALL_ZERO
    the wild load becomes a NULL dereference at offset 0xa0
    (&trans->cm_handle_connect) in the iw_cm_wq workqueue.
    
    GCC masks the bug in default builds by folding the uninitialized
    load into &rds_ib_transport; Clang-built kernels take the real
    uninitialized path and oops.
    
    The active side can land on a non-IB device too: the id that
    rds_ib_conn_path_connect() creates is not restricted to a node type,
    so rdma_resolve_addr() binds it to whichever device serves the local
    address, and an iWARP RNIC on the same netdev qualifies.  The crash
    there is different: resolving a route on an iWARP id never fills in
    cm_id->route.path_rec, and the ROUTE_RESOLVED case writes
    path_rec[0].sl before it calls into the transport.
    
    The iWARP transport was dropped long ago and IB is the only
    transport left, so make that explicit: initialize trans to
    &rds_ib_transport at declaration, drop the conditional assignment,
    reject a connect request that arrives on a non-IB device, and drop a
    connection whose address resolved to one instead of resolving a
    route on it.  The rejection is limited to RDMA_CM_EVENT_CONNECT_REQUEST
    on purpose: a non-zero return from the handler makes rdma_cm destroy
    the id the event was delivered on, which is right for the request's
    freshly created id but would free a connection id that RDS still owns
    for any other event.  On the active side the id stays ic->i_cm_id and
    the connection's shutdown destroys it, so that case returns 0.
    
    Fixes: dcdede0406d3 ("RDS: Drop stale iWARP RDMA transport")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Link: https://lore.kernel.org/netdev/[email protected]/
    Link: https://lore.kernel.org/netdev/[email protected]/
    Cc: [email protected]
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    [achender: reject only on RDMA_CM_EVENT_CONNECT_REQUEST instead of
     bailing out for every event on a non-IB device, so that rdma_cm does
     not destroy connection ids RDS still tracks; drop a connection whose
     address resolved to a non-IB device before a route is resolved on it;
     changelog adjusted]
    Assisted-by: LLM
    Signed-off-by: Allison Henderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net: sched: cls_u32: Undo tcf_bind_filter if u32_replace_hw_knode [+ + +]
Author: Victor Nogueira <[email protected]>
Date:   Mon Oct 5 12:48:00 2026 +0200

    net: sched: cls_u32: Undo tcf_bind_filter if u32_replace_hw_knode
    
    [ Upstream commit 9cb36faedeafb9720ac236aeae2ea57091d90a09 ]
    
    When u32_replace_hw_knode fails, we need to undo the tcf_bind_filter
    operation done at u32_set_parms.
    
    Fixes: d34e3e181395 ("net: cls_u32: Add support for skip-sw flag to tc u32 classifier.")
    Signed-off-by: Victor Nogueira <[email protected]>
    Acked-by: Jamal Hadi Salim <[email protected]>
    Reviewed-by: Pedro Tammela <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: systemport: Fix RUNT MIB counter register offset calculation [+ + +]
Author: Florian Fainelli <[email protected]>
Date:   Tue Sep 22 16:24:35 2026 -0700

    net: systemport: Fix RUNT MIB counter register offset calculation
    
    [ Upstream commit 242935adfeb096f09b29fb2cfcf12f9eb2911fc6 ]
    
    In UniMAC hardware, there is a 0xC byte gap between the RX MIB counters
    and the TX MIB counters, and a second 0xC byte gap between the TX MIB
    counters and the RX RUNT MIB counters.
    
    In bcm_sysport_update_mib_counters(), 'offset' was only set to
    UMAC_MIB_STAT_OFFSET (0xC) for all non-RX counters, omitting the second
    0xC gap for BCM_SYSPORT_STAT_RUNT counters. As a result, all 4 RUNT MIB
    counters were read from unmapped gap register space.
    
    Fix this by setting offset to 2 * UMAC_MIB_STAT_OFFSET (0x18) when
    reading BCM_SYSPORT_STAT_RUNT counters.
    
    Fixes: 80105befdb4b ("net: systemport: add Broadcom SYSTEMPORT Ethernet MAC driver")
    Reviewed-by: Nicolai Buchwitz <[email protected]>
    Signed-off-by: Florian Fainelli <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: team: fix NULL pointer dereference in team_xmit during mode change [+ + +]
Author: Weiming Shi <[email protected]>
Date:   Tue Oct 13 11:49:10 2026 -0400

    net: team: fix NULL pointer dereference in team_xmit during mode change
    
    [ Upstream commit 25fe708bbc59289d3d1ea4b126fbc1b460a072a5 ]
    
    __team_change_mode() clears team->ops with memset() before restoring
    safe dummy handlers via team_adjust_ops(). A concurrent team_xmit()
    running under RCU on another CPU can read team->ops.transmit during
    this window and call a NULL function pointer, crashing the kernel.
    
    The race requires a mode change (CAP_NET_ADMIN) concurrent with
    transmit on the team device.
    
     BUG: kernel NULL pointer dereference, address: 0000000000000000
     Oops: 0010 [#1] SMP KASAN NOPTI
     RIP: 0010:0x0
     Call Trace:
      team_xmit (drivers/net/team/team_core.c:1853)
      dev_hard_start_xmit (net/core/dev.c:3904)
      __dev_queue_xmit (net/core/dev.c:4871)
      packet_sendmsg (net/packet/af_packet.c:3109)
      __sys_sendto (net/socket.c:2265)
    
    The original code assumed that no ports means no traffic, so mode
    changes could freely memset()/memcpy() the ops.  AF_PACKET with
    forced carrier breaks that assumption.
    
    Prevent the race instead of making it safe: replace memset()/memcpy()
    with per-field updates that never touch transmit or receive.  Those
    two handlers are managed solely by team_adjust_ops(), which already
    installs dummies when tx_en_port_count == 0 (always true during mode
    change since no ports are present).  WRITE_ONCE/READ_ONCE prevent
    store/load tearing on the handler pointers.
    
    synchronize_net() before exit_op() drains in-flight readers that may
    still reference old mode state from before port removal switched the
    handlers to dummies.
    
    Fixes: 3d249d4ca7d0 ("net: introduce ethernet teaming device")
    Reported-by: Xiang Mei <[email protected]>
    Signed-off-by: Weiming Shi <[email protected]>
    Reviewed-by: Jiayuan Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: b7454f1940c5 ("net: team: stop reusing skb after queue override")
    Signed-off-by: Sasha Levin <[email protected]>

net: team: Remove unused team_mode_op, port_enabled [+ + +]
Author: Marc Harvey <[email protected]>
Date:   Tue Oct 13 11:49:08 2026 -0400

    net: team: Remove unused team_mode_op, port_enabled
    
    [ Upstream commit 014f249121d73909528df320818fba7693d0ec92 ]
    
    This team_mode_op wasn't used by any of the team modes, so remove it.
    
    Reviewed-by: Jiri Pirko <[email protected]>
    Signed-off-by: Marc Harvey <[email protected]>
    Reviewed-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: b7454f1940c5 ("net: team: stop reusing skb after queue override")
    Signed-off-by: Sasha Levin <[email protected]>

net: team: Rename port_disabled team mode op to port_tx_disabled [+ + +]
Author: Marc Harvey <[email protected]>
Date:   Tue Oct 13 11:49:09 2026 -0400

    net: team: Rename port_disabled team mode op to port_tx_disabled
    
    [ Upstream commit cfa477df2cc62ba53cb936669886361152b594a7 ]
    
    This team mode op is only used by the load balance mode, and it only
    uses it in the tx path.
    
    Reviewed-by: Jiri Pirko <[email protected]>
    Signed-off-by: Marc Harvey <[email protected]>
    Reviewed-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: b7454f1940c5 ("net: team: stop reusing skb after queue override")
    Signed-off-by: Sasha Levin <[email protected]>

net: team: stop reusing skb after queue override [+ + +]
Author: Weiming Shi <[email protected]>
Date:   Tue Oct 13 11:49:11 2026 -0400

    net: team: stop reusing skb after queue override
    
    [ Upstream commit b7454f1940c5e6d92e753853c476a769e452f30a ]
    
    A nonzero dev_queue_xmit() result does not return ownership of the skb.
    When an override port's qdisc drops it, the queue override helper used to
    try another port or the mode transmit op with the freed skb.
    
    Return the handoff decision separately from transmit success. Select only
    the first override port under RCU and stop after handing it the skb,
    regardless of the lower transmit result. Keep the existing success and
    drop accounting.
    
      BUG: KASAN: slab-use-after-free in sk_skb_reason_drop
      Write of size 4 by task poc/5040
      sk_skb_reason_drop (net/core/skbuff.c:1240)
      dev_kfree_skb_any_reason (net/core/dev.c:3470)
      ab_transmit (drivers/net/team/team_mode_activebackup.c:49)
      team_xmit (drivers/net/team/team_core.c:1849)
      __dev_direct_xmit (net/core/dev.c:4934)
      Freed by task 5040:
      __tcf_kfree_skb_list (net/sched/sch_generic.c:43)
      __dev_queue_xmit (net/core/dev.c:4831)
      team_xmit (drivers/net/team/team_core.c:1846)
      Kernel panic - not syncing: KASAN: panic_on_warn set ...
    
    Cc: [email protected]
    Fixes: 8ff5105a2b9d ("team: add support for queue override by setting queue_id for port")
    Reported-by: <[email protected]>
    Signed-off-by: Weiming Shi <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: usb: ax88179_178a: fix rx frame length for non-last packets [+ + +]
Author: Fredrik Nyberg <[email protected]>
Date:   Fri Oct 2 14:28:57 2026 +0200

    net: usb: ax88179_178a: fix rx frame length for non-last packets
    
    commit 9b6c20f788472d2042717a3c2f1bc60b2b77083e upstream.
    
    Commit 4ce62d5b2f7a ("net: usb: ax88179_178a: stop lying about
    skb->truesize") replaced skb_clone() with a copy into a new skb for
    every packet of a bulk-in transfer except the last one. The copy skips
    the 2-byte IP alignment pseudo header but still copies pkt_len bytes,
    and pkt_len includes that header. Each of these frames is therefore
    delivered with two extra trailing bytes: the 0xeeee pseudo header of
    the next slot when the frame ends on an 8-byte boundary, or slot
    padding otherwise. The last packet is still trimmed to pkt_len - 2.
    
    IPv4 and IPv6 trim the extra bytes, so most traffic is unaffected.
    Anything that relies on the frame length is not. MACsec takes the ICV
    from the last 16 bytes and drops every such frame as InPktsNotValid. In
    our setup that was 0.2-1.2% of received MACsec frames, depending on how
    many frames shared a transfer, including service discovery multicast.
    
    Allocate and copy pkt_len - 2 bytes, like the last-packet path.
    
    Fixes: 4ce62d5b2f7a ("net: usb: ax88179_178a: stop lying about skb->truesize")
    Cc: [email protected]
    Signed-off-by: Fredrik Nyberg <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net: usb: qmi_wwan: add Quectel EG120K-EA [+ + +]
Author: Gilberto Conde <[email protected]>
Date:   Mon Sep 21 10:34:26 2026 +0100

    net: usb: qmi_wwan: add Quectel EG120K-EA
    
    commit 0f2fd31f63c65c409bd336af3a42d478a9207c1f upstream.
    
    Add support for the Quectel EG120K-EA LTE Cat.12 module (USB ID
    2c7c:030b). Its QMI interface (interface 4) uses class/subclass/protocol
    ff/ff/ff like the other recent Quectel modules, so match it the same way.
    
    The product ID is shared with the EM060K, which the option driver
    already knows and uses to claim the serial interfaces. Without a
    qmi_wwan entry the data interface is left unbound.
    
    Tested on a GL.iNet GL-X2000, where the module is soldered down and
    enumerates at SuperSpeed: cdc-wdm0 and wwan0 appear and ModemManager
    brings up a data session.
    
    T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
    D:  Ver= 3.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    P:  Vendor=2c7c ProdID=030b Rev= 5.04
    S:  Manufacturer=Quectel
    S:  Product=EG120K-EA
    S:  SerialNumber=45546267
    C:* #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA
    I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=option
    E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
    E:  Ad=88(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#=12 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=70 Driver=(none)
    E:  Ad=89(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    
    Signed-off-by: Gilberto Conde <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net_sched: codel: fix stale state for empty flows in fq_codel [+ + +]
Author: Jonas Köppeler <[email protected]>
Date:   Mon Mar 23 18:49:20 2026 +0100

    net_sched: codel: fix stale state for empty flows in fq_codel
    
    [ Upstream commit 815980fe6dbb01ad4007e8b260a45617f598b76d ]
    
    When codel_dequeue() finds an empty queue, it resets vars->dropping
    but does not reset vars->first_above_time.  The reference CoDel
    algorithm (Nichols & Jacobson, ACM Queue 2012) resets both:
    
      dodeque_result codel_queue_t::dodeque(time_t now) {
          ...
          if (r.p == NULL) {
              first_above_time = 0;   // <-- Linux omits this
          }
          ...
      }
    
    Note that codel_should_drop() does reset first_above_time when called
    with a NULL skb, but codel_dequeue() returns early before ever calling
    codel_should_drop() in the empty-queue case.  The post-drop code paths
    do reach codel_should_drop(NULL) and correctly reset the timer, so a
    dropped packet breaks the cycle -- but the next delivered packet
    re-arms first_above_time and the cycle repeats.
    
    For sparse flows such as ICMP ping (one packet every 200ms-1s), the
    first packet arms first_above_time, the flow goes empty, and the
    second packet arrives after the interval has elapsed and gets dropped.
    The pattern repeats, producing sustained loss on flows that are not
    actually congested.
    
    Test: veth pair, fq_codel, BQL disabled, 30000 iptables rules in the
    consumer namespace (NAPI-64 cycle ~14ms, well above fq_codel's 5ms
    target), ping at 5 pps under UDP flood:
    
      Before fix:  26% ping packet loss
      After fix:    0% ping packet loss
    
    Fix by resetting first_above_time to zero in the empty-queue path
    of codel_dequeue(), matching the reference algorithm.
    
    Fixes: 76e3cc126bb2 ("codel: Controlled Delay AQM")
    Fixes: d068ca2ae2e6 ("codel: split into multiple files")
    Co-developed-by: Jesper Dangaard Brouer <[email protected]>
    Signed-off-by: Jesper Dangaard Brouer <[email protected]>
    Signed-off-by: Jonas Köppeler <[email protected]>
    Reported-by: Chris Arges <[email protected]>
    Tested-by: Jonas Köppeler <[email protected]>
    Reviewed-by: Toke Høiland-Jørgensen <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
netfilter: ipset: do not update comments from kernel-side adds [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Fri Sep 4 20:03:07 2026 +0200

    netfilter: ipset: do not update comments from kernel-side adds
    
    [ Upstream commit a442c8a89fb9c531f9d6ab86120c31decd778d51 ]
    
    'Fixes' commit stopped calling ip_set_init_comment() for hash types
    from kernel-side-adds (xtables .. -j SET).  ip_set_init_comment() says:
    
       "The kadt functions don't use the comment extensions in any way."
    
    But bitmap set type calls the function from kadt cb too.
    
    While this appears to be safe (serialized via the set spinlock), it seems
    better to not call the init function either, least of all to keep
    behaviour consistent.
    
    ip_set_list calls ip_set_init_comment() only from uadt cb, it can be
    kept as-is.
    
    This was triggered by yet another LLM review, hinting that the existing
    rcu_dereference_protected() cannot be downgraded to only check if the
    nfnl mutex is held.
    
    Fixes: f30415929be8 ("netfilter: ipset: do not update comments from kernel-side hash adds")
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: always increment set element count [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Sun Oct 25 08:15:08 2026 +0100

    netfilter: nf_tables: always increment set element count
    
    [ Upstream commit d4b7f29eb85c93893bc27388b37709efbc3c9a0e ]
    
    At this time, set->nelems counter only increments when the set has
    a maximum size.
    
    All set elements decrement the counter unconditionally, this is
    confusing.
    
    Increment the counter unconditionally to make this symmetrical.
    This would also allow changing the set maximum size after set creation
    in a later patch.
    
    Signed-off-by: Florian Westphal <[email protected]>
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: always walk all pending catchall elements [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Sat Oct 24 14:49:27 2026 +0200

    netfilter: nf_tables: always walk all pending catchall elements
    
    [ Upstream commit 7cb9a23d7ae40a702577d3d8bacb7026f04ac2a9 ]
    
    During transaction processing we might have more than one catchall element:
    1 live catchall element and 1 pending element that is coming as part of the
    new batch.
    
    If the map holding the catchall elements is also going away, its
    required to toggle all catchall elements and not just the first viable
    candidate.
    
    Otherwise, we get:
     WARNING: ./include/net/netfilter/nf_tables.h:1281 at nft_data_release+0xb7/0xe0 [nf_tables], CPU#2: nft/1404
     RIP: 0010:nft_data_release+0xb7/0xe0 [nf_tables]
     [..]
     __nft_set_elem_destroy+0x106/0x380 [nf_tables]
     nf_tables_abort_release+0x348/0x8d0 [nf_tables]
     nf_tables_abort+0xcf2/0x3ac0 [nf_tables]
     nfnetlink_rcv_batch+0x9c9/0x20e0 [..]
    
    Fixes: 628bd3e49cba ("netfilter: nf_tables: drop map element references from preparation phase")
    Reported-by: Yiming Qian <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    [ Backport to 5.15.y: 5.15 still passes a struct nft_set_elem to
      nft_setelem_data_{de,}activate(); only the break statements are
      removed. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: avoid skb access on nf_stolen [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Wed Jun 22 16:43:57 2022 +0200

    netfilter: nf_tables: avoid skb access on nf_stolen
    
    [ Upstream commit e34b9ed96ce3b06c79bf884009b16961ca478f87 ]
    
    When verdict is NF_STOLEN, the skb might have been freed.
    
    When tracing is enabled, this can result in a use-after-free:
    1. access to skb->nf_trace
    2. access to skb->mark
    3. computation of trace id
    4. dump of packet payload
    
    To avoid 1, keep a cached copy of skb->nf_trace in the
    trace state struct.
    Refresh this copy whenever verdict is != STOLEN.
    
    Avoid 2 by skipping skb->mark access if verdict is STOLEN.
    
    3 is avoided by precomputing the trace id.
    
    Only dump the packet when verdict is not "STOLEN".
    
    Reported-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Stable-dep-of: 8ec454dcd00c ("ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel()")
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: fix bidirectional offload regression [+ + +]
Author: Felix Fietkau <[email protected]>
Date:   Wed Feb 14 15:42:35 2024 +0100

    netfilter: nf_tables: fix bidirectional offload regression
    
    [ Upstream commit 84443741faab9045d53f022a9ac6a6633067a481 ]
    
    Commit 8f84780b84d6 ("netfilter: flowtable: allow unidirectional rules")
    made unidirectional flow offload possible, while completely ignoring (and
    breaking) bidirectional flow offload for nftables.
    Add the missing flag that was left out as an exercise for the reader :)
    
    Cc: Vlad Buslov <[email protected]>
    Fixes: 8f84780b84d6 ("netfilter: flowtable: allow unidirectional rules")
    Reported-by: Daniel Golle <[email protected]>
    Signed-off-by: Felix Fietkau <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: fix crash when nf_trace is enabled [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Thu Aug 4 19:26:27 2022 +0200

    netfilter: nf_tables: fix crash when nf_trace is enabled
    
    [ Upstream commit 399a14ec7993d605740de7b2cd5c0ce8407d12ed ]
    
    do not access info->pkt when info->trace is not 1.
    nft_traceinfo is not initialized, except when tracing is enabled.
    
    The 'nft_trace_enabled' static key cannot be used for this, we must
    always check info->trace first.
    
    Pass nft_pktinfo directly to avoid this.
    
    Fixes: e34b9ed96ce3 ("netfilter: nf_tables: avoid skb access on nf_stolen")
    Reported-by: Hangbin Liu <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: release flowtable after rcu grace period on error [+ + +]
Author: Pablo Neira Ayuso <[email protected]>
Date:   Mon Oct 12 09:40:53 2026 -0700

    netfilter: nf_tables: release flowtable after rcu grace period on error
    
    [ Upstream commit d73f4b53aaaea4c95f245e491aa5eeb8a21874ce ]
    
    Call synchronize_rcu() after unregistering the hooks from error path,
    since a hook that already refers to this flowtable can be already
    registered, exposing this flowtable to packet path and nfnetlink_hook
    control plane.
    
    This error path is rare, it should only happen by reaching the maximum
    number hooks or by failing to set up to hardware offload, just call
    synchronize_rcu().
    
    There is a check for already used device hooks by different flowtable
    that could result in EEXIST at this late stage. The hook parser can be
    updated to perform this check earlier to this error path really becomes
    rarely exercised.
    
    Uncovered by KASAN reported as use-after-free from nfnetlink_hook path
    when dumping hooks.
    
    Fixes: 3b49e2e94e6e ("netfilter: nf_tables: add flow table netlink frontend")
    Reported-by: Yiming Qian <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    
    (cherry picked from commit d73f4b53aaaea4c95f245e491aa5eeb8a21874ce)
    The cherry-pick did not apply cleanly and required manual conflict
    resolution because the nftables code differs between the 5.15.y and
    Linux 6.12.y branches.
    
    Signed-off-by: Dai Ngo <[email protected]>
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: set->ops->insert returns opaque set element in case of EEXIST [+ + +]
Author: Pablo Neira Ayuso <[email protected]>
Date:   Wed Sep 30 11:44:33 2026 -0400

    netfilter: nf_tables: set->ops->insert returns opaque set element in case of EEXIST
    
    [ Upstream commit 078996fcd657e6e0c3a72b7d5806d04c32e74250 ]
    
    Return struct nft_elem_priv instead of struct nft_set_ext for
    consistency with ("netfilter: nf_tables: expose opaque set element as
    struct nft_elem_priv") and to prepare the introduction of element
    timeout updates from control path.
    
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    
    Backport adaptation for Linux 5.15:
    This tree represents opaque set elements as void pointers and does not
    have struct nft_elem_priv, the backend priv members, or nft_elem_priv_cast().
    Use void ** for the insert output parameter and return the existing backend
    element pointer directly. Keep the frontend conversion through
    nft_set_elem_ext() when insertion returns -EEXIST.
    
    Resolve the pipapo conflict by retaining its existing initialization of e
    at declaration and returning e directly. Update the output parameter's
    documentation and omit the unrelated timeout declaration reordering.
    No functions or element layout changes are introduced.
    
    This preserves the catchall insertion context needed for target commit
    70194dc37670bd08e44b471389861cc01bd3a3c9, whose two hunks apply unchanged.
    
    Stable-dep-of: 70194dc37670 ("netfilter: nf_tables: skip expired catchall elements on insert and delete")
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: skip expired catchall elements on insert and delete [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Wed Sep 30 11:44:34 2026 -0400

    netfilter: nf_tables: skip expired catchall elements on insert and delete
    
    [ Upstream commit 70194dc37670bd08e44b471389861cc01bd3a3c9 ]
    
    nft_setelem_catchall_insert() looks up duplicates with
    nft_set_elem_active() only, while nft_set_catchall_lookup() and the
    dump path additionally skip expired elements.
    
    Once a catchall element with a timeout expires, this predicate drift
    makes it invisible to userspace dumps, yet it still blocks
    re-insertion: with NLM_F_EXCL the request fails with -EEXIST, and
    without it the request reports success but silently inserts nothing.
    The stale entry only goes away when the (user-tunable) gc interval
    elapses, so the catchall rule may silently stop matching for an
    arbitrarily long time after its first expiration.
    
    The delete path shows the same drift: nft_setelem_catchall_deactivate()
    picks the first active-next entry in the catchall list, so with an
    expired entry still pending GC it retires the stale entry instead of
    the fresh one, and it deactivates an element that userspace no longer
    sees instead of failing with -ENOENT.
    
    Align both walks with the lookup and dump predicates: only an element
    that is active and not expired counts as a duplicate or delete
    candidate, using the per-netns timestamp taken at transaction start,
    in line with the set backend .insert/.deactivate and catchall GC sync
    paths.
    
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Fixes: aaa31047a6d2 ("netfilter: nftables: add catch-all set element support")
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: unconditionally bump set->nelems before insertion [+ + +]
Author: Pablo Neira Ayuso <[email protected]>
Date:   Sun Oct 25 08:15:09 2026 +0100

    netfilter: nf_tables: unconditionally bump set->nelems before insertion
    
    [ Upstream commit def602e498a4f951da95c95b1b8ce8ae68aa733a ]
    
    In case that the set is full, a new element gets published then removed
    without waiting for the RCU grace period, while RCU reader can be
    walking over it already.
    
    To address this issue, add the element transaction even if set is full,
    but toggle the set_full flag to report -ENFILE so the abort path safely
    unwinds the set to its previous state.
    
    As for element updates, decrement set->nelems to restore it.
    
    A simpler fix is to call synchronize_rcu() in the error path.
    However, with a large batch adding elements to already maxed-out set,
    this could cause noticeable slowdown of such batches.
    
    Fixes: 35d0ac9070ef ("netfilter: nf_tables: fix set->nelems counting with no NLM_F_EXCL")
    Reported-by: Inseo An <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    [ Backport to 5.15.y: applies on top of d4b7f29eb85c ("netfilter:
      nf_tables: always increment set element count"), as in 6.1.y. 5.15
      has no nft_set_maxsize() helper (introduced by 8d738c1869f6
      "netfilter: nf_tables: fix set size with rbtree backend", not in
      5.15), so the ceiling is the same expression the prerequisite inlines:
      set->size ? set->size + set->ndeact : UINT_MAX. The update-path hunk
      from the upstream commit does not apply: 5.15 has no in-place
      element-update path here. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nft_flow_offload: drop flowtable reference on init error path [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Thu Sep 10 16:33:26 2026 +0800

    netfilter: nft_flow_offload: drop flowtable reference on init error path
    
    commit 747928b5d4ff8c8de55138a54c13980e4bb88578 upstream.
    
    nft_flow_offload_init() bumps the flowtable use count with
    nft_use_inc() before calling nf_ct_netns_get().  When the latter
    fails, the error is returned as-is and the reference is leaked.
    
    The upper layers do not balance it either: nf_tables_newexpr()
    clears expr->ops when the expression init callback fails, so the
    nft_expr_more() iteration in nft_rule_expr_deactivate() and
    nf_tables_rule_destroy() stops right before the failed expression
    and its ->destroy callback, which would drop the reference, never
    runs.
    
    Each failed rule addition therefore leaks one flowtable reference
    and the flowtable can no longer be removed: NFT_MSG_DELFLOWTABLE
    keeps reporting -EBUSY even though no rule references it.
    
    Save the nf_ct_netns_get() return value and undo the nft_use_inc()
    when it fails, restoring the inc/dec pairing within
    nft_flow_offload_init() itself.
    
    Fixes: a3c90f7a2323 ("netfilter: nf_tables: flow offload expression")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
netlink: avoid hashing the network namespace pointer [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Wed Oct 7 18:14:00 2026 -0700

    netlink: avoid hashing the network namespace pointer
    
    [ Upstream commit f88bb3606e4bd11ee035b682cddc2999e604609a ]
    
    The netlink rhashtable key includes a raw struct net pointer and a
    user-controlled port ID. Both /proc/net/netlink and socket diagnostics
    expose the table's bucket order. By binding and rebinding chosen
    NETLINK_USERSOCK port IDs, an unprivileged reader can distinguish equal
    buckets and recover the low bits of the Jenkins hash. Its 32-bit seed
    and the limited set of kernel-image slides can then be searched offline
    to recover the address of init_net.
    
    Use the namespace's unique, non-address net_cookie in the comparison
    key instead. It is assigned before the per-net initializers run and
    remains unchanged for the namespace's lifetime. The lookup key and
    object hash are still built by netlink_compare_arg_init(), keeping
    lookup, insertion, removal and rehashing consistent while preserving
    namespace separation. Neither public table walker needs to change.
    
    Reading the socket's namespace cookie in netlink_compare() is safe
    under RCU, including during namespace teardown. netlink_release()
    removes the socket from the hash table and defers its final put with
    call_rcu(). cleanup_net() runs the per-net exit methods and waits for
    outstanding RCU callbacks with rcu_barrier() before freeing namespace
    storage.
    
    Unlike ns.ns_id, net_cookie is also available and initialized during
    setup_net() in older stable kernels, making the change straightforward
    to backport to v5.15 and later.
    
    Fixes: c428ecd1a21f ("netlink: Move namespace into hash key")
    Assisted-by: LLM
    Signed-off-by: Kyle Zeng <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netlink: remove netlink_broadcast_filtered [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Tue Oct 5 13:52:42 2021 +0200

    netlink: remove netlink_broadcast_filtered
    
    [ Upstream commit 549017aa1bb7ec19a1e24e7f65480a1c2e76b90e ]
    
    No users in tree since commit a3498436b3a0 ("netns: restrict uevents"),
    so remove this functionality.
    
    Cc: Christian Brauner <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Stable-dep-of: 8bf659bd54e1 ("netlink: reset skb headers before unicast and multicast filtering")
    Signed-off-by: Sasha Levin <[email protected]>

netlink: reset skb headers before unicast and multicast filtering [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Tue Oct 6 15:42:32 2026 -0700

    netlink: reset skb headers before unicast and multicast filtering
    
    [ Upstream commit 8bf659bd54e1f00e34cf5244b1d289c506fa47c0 ]
    
    Socket filters can use SKF_NET_OFF and SKF_LL_OFF to read relative to
    an skb's network and MAC headers. Netlink producers may reserve
    headroom without resetting those headers, allowing a receiving socket's
    filter to read data before the initialized message.
    
    For example, IWPM HELLO replies are allocated with dev_alloc_skb(),
    which reserves NET_SKB_PAD bytes. An unprivileged NETLINK_RDMA user can
    attach a classic socket filter and disclose this headroom through the
    length of the delivered reply. The resets in netlink_dump() do not help
    because IWPM sends a separately allocated skb through netlink_unicast().
    
    Reset both headers before running the receiver's filter in unicast and
    broadcast delivery, as is already done for dump skbs. This also covers
    other netlink producers that reserve headroom without changing their
    allocation or message-building code.
    
    Fixes: b1153f29ee07 ("netlink: make socket filters work on netlink")
    Assisted-by: LLM
    Signed-off-by: Kyle Zeng <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netlink: Reverse the patch which removed filtering [+ + +]
Author: Anjali Kulkarni <[email protected]>
Date:   Wed Jul 19 13:18:16 2023 -0700

    netlink: Reverse the patch which removed filtering
    
    [ Upstream commit a3377386b56420d78a4c0a931a40f9a25c3ca2bd ]
    
    To use filtering at the connector & cn_proc layers, we need to enable
    filtering in the netlink layer. This reverses the patch which removed
    netlink filtering - commit ID for that patch:
    549017aa1bb7 (netlink: remove netlink_broadcast_filtered).
    
    Signed-off-by: Anjali Kulkarni <[email protected]>
    Reviewed-by: Liam R. Howlett <[email protected]>
    Acked-by: Jakub Kicinski <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Stable-dep-of: 8bf659bd54e1 ("netlink: reset skb headers before unicast and multicast filtering")
    Signed-off-by: Sasha Levin <[email protected]>

 
nfsd: check nfsd4_acl_to_attr() return value in nfsd4_create() [+ + +]
Author: Jeff Layton <[email protected]>
Date:   Sat Sep 5 09:39:28 2026 -0400

    nfsd: check nfsd4_acl_to_attr() return value in nfsd4_create()
    
    [ Upstream commit 2c7912732184773dbd371a411da87af1cc080b86 ]
    
    nfsd4_create() stores the return value of nfsd4_acl_to_attr() in
    status, but the switch(create->cr_type) block unconditionally
    overwrites it in every branch. ACL translation errors are silently
    discarded, and the CREATE proceeds without the requested ACL.
    
    Add an early exit check after nfsd4_acl_to_attr(), matching the
    pattern already used in nfsd4_setattr().
    
    Fixes: c0cbe70742f4 ("NFSD: add posix ACLs to struct nfsd_attrs")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Jeff Layton <[email protected]>
    [ cel: prefer NFS4ERR_BADTYPE over NFS4ERR_ATTRNOTSUPP ]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ retained unconditional ACL conversion because the older helper already handles null ACLs ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: fix clock domain mismatch in clients_still_reclaiming() [+ + +]
Author: Jeff Layton <[email protected]>
Date:   Sat Sep 5 10:16:49 2026 -0400

    nfsd: fix clock domain mismatch in clients_still_reclaiming()
    
    [ Upstream commit 09ea3eb9a518565f5bca386e81b993ed8825f5e8 ]
    
    clients_still_reclaiming() computes a deadline from nn->boot_time
    (CLOCK_REALTIME, ~1.7 billion) but compares it against
    ktime_get_boottime_seconds() (CLOCK_BOOTTIME, seconds since boot).
    The comparison is always false — it would take ~54 years of uptime
    for BOOTTIME to exceed the REALTIME-derived deadline.
    
    This means any client can hold the server in grace indefinitely by
    sending CLAIM_PREVIOUS OPEN requests, blocking all non-reclaim
    operations for all other clients.
    
    Add boot_time_bt (CLOCK_BOOTTIME) alongside the existing boot_time
    and use it for the deadline computation. boot_time (CLOCK_REALTIME)
    is preserved for its cl_boot clientid-nonce role.
    
    Fixes: 20b7d86f29d3 ("nfsd: use boottime for lease expiry calculation")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ preserved the branch’s boolean fields instead of the upstream flags bitmap ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: fix nfsd_file leak on inter-server COPY setup failure [+ + +]
Author: Jeff Layton <[email protected]>
Date:   Sat Sep 5 12:40:42 2026 -0400

    nfsd: fix nfsd_file leak on inter-server COPY setup failure
    
    [ Upstream commit 88a76145451d703eedd867b5989bf73d17340399 ]
    
    When nfsd4_setup_inter_ssc() fails, nfsd4_copy() returns
    nfserr_offload_denied directly, bypassing the out: label where
    release_copy_files() would drop the nf_dst reference taken by
    nfs4_preprocess_stateid_op(). Each failed inter-server COPY
    leaks one nfsd_file, pinning file/inode/dentry/vfsmount.
    
    Fix by setting status and jumping to out: instead of returning
    directly.
    
    Fixes: ce0887ac96d3 ("NFSD add nfs4 inter ssc to nfsd4_copy")
    Cc: [email protected]
    Assisted-by: kres:claude-opus-4-7
    Signed-off-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ adjusted cleanup paths to omit unavailable trace_nfsd_copy_*() calls ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: gate nfs2 setacl by argp->mask [+ + +]
Author: Chuck Lever <[email protected]>
Date:   Sat Sep 5 17:43:53 2026 -0400

    nfsd: gate nfs2 setacl by argp->mask
    
    [ Upstream commit a3a7e20ed66d3f04d37883c398da8a113b430769 ]
    
    The NFSACL v2 SETACL path shares the decoder convention used by its
    v3 sibling: nfsaclsvc_decode_setaclargs() fills in argp->acl_access
    only when NFS_ACL is set in the request mask and argp->acl_default
    only when NFS_DFACL is set, leaving the other pointer NULL because
    the argument buffer is zeroed up to pc_argzero before decode.
    
    nfsacld_proc_setacl() then hands both pointers to set_posix_acl()
    unconditionally. set_posix_acl(idmap, dentry, type, NULL) is the VFS
    "remove this ACL type" operation, so an omitted arm is
    indistinguishable from an explicit request to delete that ACL. A
    SETACL carrying only NFS_ACL silently strips the directory's default
    ACL; mask=0 strips both.
    
    This is the same defect just fixed in nfsd3_proc_setacl(); apply the
    same remedy. Gate each set_posix_acl() call on its mask bit and
    initialize error to 0 so that a request with neither bit set leaves
    the on-disk ACLs untouched and returns success. The out_drop_lock
    path and the unconditional posix_acl_release() in
    nfsaclsvc_release_setacl() already tolerate the skipped arms.
    
    Fixes: a257cdd0e217 ("[PATCH] NFSD: Add server support for NFSv3 ACLs.")
    Cc: [email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ retained the older user-namespace and inode set_posix_acl() API in place of the newer mount-idmap and dentry API. ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: release path refs on follow_down() error [+ + +]
Author: Chris Mason <[email protected]>
Date:   Fri Sep 4 21:06:20 2026 -0400

    nfsd: release path refs on follow_down() error
    
    [ Upstream commit 6cba08dc1922140d260cfeb30bbda4ee1bf869d8 ]
    
    nfsd_cross_mnt() initializes a local struct path with mntget() and
    dget() before calling follow_down(). On a negative return the error
    arm jumps to out without releasing those references:
    
        err = follow_down(&path, follow_flags);
        if (err < 0)
                goto out;
    
    follow_down() never drops the caller's entry-time refs on any error
    sub-case; for example a pre-cross d_manage() failure leaves path
    untouched, so the mntget()/dget() taken on entry survive the call.
    
    Every other early-exit arm in nfsd_cross_mnt() (other-namespace
    return, IS_ERR(exp2), and the success tail after the swap) already
    calls path_put(&path); the err < 0 arm is the lone omission. The
    leak inflates mnt_count and d_count on each failed cross-mount,
    blocking umount and pinning dentries against the shrinker, and is
    reachable by any authenticated NFS client through nfsd_lookup_dentry
    or the NFSv4 READDIR encode path.
    
    Fix by calling path_put(&path) before the goto out in the err < 0
    arm so the entry-time refs are released on all follow_down() error
    returns.
    
    Fixes: cc53ce53c869 ("Add a dentry op to allow processes to be held during pathwalk transit")
    Cc: [email protected]
    Assisted-by: kres:claude-opus-4-7
    Signed-off-by: Chris Mason <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ retained the older single-argument follow_down(&path) API ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: size fh_verify server sockaddr slot by xpt_locallen [+ + +]
Author: Chris Mason <[email protected]>
Date:   Fri Sep 4 22:13:42 2026 -0400

    nfsd: size fh_verify server sockaddr slot by xpt_locallen
    
    [ Upstream commit 71d068490098b1d23c63b2345e40675d3a1ca763 ]
    
    The nfsd_fh_verify and nfsd_fh_verify_err tracepoints declare the
    server sockaddr slot sized by xpt_remotelen but fill it from
    xpt_local using xpt_locallen:
    
        TP_STRUCT__entry(
                ...
                __sockaddr(server, rqstp->rq_xprt->xpt_remotelen)
                ...
        )
        TP_fast_assign(
                ...
                __assign_sockaddr(server, &rqstp->rq_xprt->xpt_local,
                                  rqstp->rq_xprt->xpt_locallen);
                ...
        )
    
    When xpt_locallen exceeds xpt_remotelen, __assign_sockaddr's memcpy
    writes past the reserved ring-buffer slot. In the reverse direction
    (xpt_locallen < xpt_remotelen) the slot is oversized and the
    unwritten tail leaks prior ring-buffer contents to trace consumers.
    
    The write-past-end case is reachable on NFS/UDP. svc_xprt_set_remote()
    is only called from svc_tcp_accept() (net/sunrpc/svcsock.c) and from
    the RDMA connect path; svc_create_socket() for UDP calls only
    svc_xprt_set_local(), so xpt_remotelen stays 0 for the xprt's
    lifetime. Every fh_verify trace for an NFSv2/v3-over-UDP request
    then copies 16 or 28 bytes from xpt_local into a zero-byte slot.
    
    The other NFSD tracepoints that record the server address
    (NFSD_TRACE_PROC_CALL_FIELDS, NFSD_TRACE_PROC_RES_FIELDS,
    SVC_RQST_ENDPOINT_FIELDS) already size the server slot by
    xpt_locallen; nfsd_fh_verify and nfsd_fh_verify_err were the only
    exceptions.
    
    Fix by sizing the server slot with xpt_locallen so the declared slot
    matches the copy length. The client slot and its assignment already
    agree on xpt_remotelen and are left untouched.
    
    Fixes: 051382885552 ("NFSD: Instrument fh_verify()")
    Fixes: 948755efc951 ("NFSD: Replace dprintk() call site in fh_verify()")
    Cc: [email protected]
    Assisted-by: kres:claude-opus-4-7
    Signed-off-by: Chris Mason <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
nios2: fix __wsum type degradation in csum_fold() [+ + +]
Author: Keith Busch <[email protected]>
Date:   Tue Sep 22 08:34:16 2026 -0700

    nios2: fix __wsum type degradation in csum_fold()
    
    [ Upstream commit b963f2345fa20417401c51a69dedb6a58eea33a9 ]
    
    csum_fold() shifts a bitwise __wsum type, which sparse reports as
    "restricted __wsum degrades to integer". Sparse only checks the body of
    a static inline once something instantiates it, so this went unnoticed
    until a recent block layer change added the first csum_fold() caller to
    a file built on this architecture.
    
    Force cast to a __u32 for the shift, as the other architectures do.
    
    Fixes: eea9507a69d6 ("nios2: Library functions")
    Reported-by: kernel test robot <[email protected]>
    Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Dinh Nguyen <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
nitro_enclaves: fix use-after-free on SLOT_ALLOC failure [+ + +]
Author: Yuxiao Wang <[email protected]>
Date:   Wed Sep 9 12:44:00 2026 +0000

    nitro_enclaves: fix use-after-free on SLOT_ALLOC failure
    
    commit 9bc184a2eda8b773c88ecbff934001ad649b9cc1 upstream.
    
    When ne_create_vm_ioctl() fails the SLOT_ALLOC request after
    anon_inode_getfile() has succeeded, the error path calls
    fput(enclave_file) and then frees ne_enclave.
    
    In normal userspace context, fput() defers the final __fput() via
    task_work. ne_enclave_release() therefore runs after ne_enclave has
    already been freed and dereferences ne_enclave->slot_uid, causing a
    use-after-free: KASAN: slab-use-after-free in ne_enclave_release.
    
    The enclave has no slot allocated and is not yet linked into the
    enclaves list on this error path, so ne_enclave_release() is expected
    to return early when slot_uid is zero. However, reading slot_uid
    already accesses the freed object.
    
    Clear enclave_file->private_data before fput() on the error path.
    ne_enclave_release() then returns immediately when private_data is
    NULL, leaving the ioctl error path as the sole owner of ne_enclave.
    This is safe because the file has not been fd_install()'d yet.
    
    Tested on an AWS EC2 m5.2xlarge with CONFIG_KASAN=y. Without the
    patch, the reproducer triggers a KASAN slab-use-after-free on every
    SLOT_ALLOC failure. With the patch, no KASAN report is produced and
    the SLOT_ALLOC error is still returned. Normal enclave creation and
    teardown are unaffected.
    
    Fixes: 9c8eb50fe9e2 ("nitro_enclaves: Add logic for terminating an enclave")
    Cc: [email protected]
    Co-developed-by: Zhaofeng Chen <[email protected]>
    Signed-off-by: Zhaofeng Chen <[email protected]>
    Signed-off-by: Yuxiao Wang <[email protected]>
    Reviewed-by: Alexander Graf <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nouveau/gem: reserve the bo in the info ioctl around the vma lookup [+ + +]
Author: Dave Airlie <[email protected]>
Date:   Tue Sep 8 14:15:41 2026 -0400

    nouveau/gem: reserve the bo in the info ioctl around the vma lookup
    
    [ Upstream commit 5e17160d41d92823f3379c1982e1369680c5ce4d ]
    
    In the non-uvmm path, there could be a race between the info lookup
    finding the vma, and the gem close path closing the vma leading
    to a use-after-free.
    
    Spotted with the help of Opus 4.6.
    
    Signed-off-by: Dave Airlie <[email protected]>
    Fixes: e758a3111914 ("drm/nouveau: fixup gem_info ioctl to return client-specific bo virtual")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Danilo Krummrich <[email protected]>
    [ adapted VMM and UVMM handling to the legacy direct VMM selection and condition. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
nvme-multipath: fix underflow in ANA log bounds checks [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Tue Sep 15 11:19:56 2026 +0900

    nvme-multipath: fix underflow in ANA log bounds checks
    
    commit 63fa2d9c9c37020bd2703fe2a6a38027b5abeb15 upstream.
    
    The number of ANA groups advertised through Identify Controller sizes the
    ANA log buffer. The ANA log header and group descriptors independently
    supply the number of groups and namespace IDs to parse.
    
    Both bounds checks subtract an untrusted object size from ana_log_size
    before comparing the current offset. If the object is larger than the
    buffer, the size_t subtraction underflows and lets the parser read beyond
    ana_log_buf.
    
    Check the current offset before the first subtraction and compare each
    object size with the remaining buffer instead. This rejects inconsistent
    ANA data before dereferencing a truncated group descriptor or walking an
    oversized namespace ID array.
    
    Fixes: 0d0b660f214d ("nvme: add ANA support")
    Cc: [email protected]
    Assisted-by: LLM
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Daehyeon Ko <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nvme-tcp: fix host memory disclosure on R2T for a read command [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Sep 9 06:34:27 2026 -0400

    nvme-tcp: fix host memory disclosure on R2T for a read command
    
    [ Upstream commit 6efbc52237facda35d2d874fe1765bb4839275d8 ]
    
    nvme_tcp_handle_r2t() does not check the direction of the request the
    R2T refers to. A malicious controller can send an R2T for a READ and
    the host will answer it: nvme_tcp_setup_h2c_data_pdu() builds the
    H2CData header and nvme_tcp_try_send_data() sends the request's data
    buffer. That buffer is the READ destination, so its contents go to the
    controller.
    
    The command then completes normally and nothing is logged.
    
    Against a test controller that answers every READ with an R2T, a 4096
    byte buffered read returned all 4096 bytes, split over two R2Ts. The
    pages contained stale kernel data, including an array of struct page
    pointers.
    
    Reject an R2T for a request that is not a write.
    
    Fixes: 3f2304f8c6d6 ("nvme-tcp: add NVMe over TCP host driver")
    Cc: [email protected]
    Signed-off-by: Yehyeong Lee <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

nvme-tcp: validate R2T PDU in nvme_tcp_handle_r2t() [+ + +]
Author: Varun Prakash <[email protected]>
Date:   Wed Sep 9 06:34:26 2026 -0400

    nvme-tcp: validate R2T PDU in nvme_tcp_handle_r2t()
    
    [ Upstream commit 1d3ef9c3a39e04be31155c27ebf80342350c3abf ]
    
    If maxh2cdata < r2t_length then driver will form multiple
    H2CData PDUs, validate R2T PDU in nvme_tcp_handle_r2t() to
    reuse nvme_tcp_setup_h2c_data_pdu().
    
    Also set req->state to NVME_TCP_SEND_H2C_PDU in
    nvme_tcp_setup_h2c_data_pdu().
    
    Signed-off-by: Varun Prakash <[email protected]>
    Reviewed-by: Sagi Grimberg <[email protected]>
    Signed-off-by: Christoph Hellwig <[email protected]>
    Stable-dep-of: 6efbc52237fa ("nvme-tcp: fix host memory disclosure on R2T for a read command")
    Signed-off-by: Sasha Levin <[email protected]>

 
nvme: add missing SRCU grace period in error path [+ + +]
Author: Tristan Madani <[email protected]>
Date:   Thu Sep 10 20:29:20 2026 -0400

    nvme: add missing SRCU grace period in error path
    
    [ Upstream commit ef248d5de4469fb6bbaf8dbe0c4c47800080d648 ]
    
    nvme_alloc_ns() error path at out_unlink_ns removes ns from the
    namespace head siblings list with list_del_rcu(&ns->siblings) but
    does not wait for SRCU readers before freeing the namespace struct.
    Multipath code iterates the head->list under srcu_read_lock() in
    nvme_find_path() and nvme_mpath_revalidate_paths(), so a concurrent
    reader can still hold a reference to ns when kfree(ns) runs.
    
    The normal removal path in nvme_ns_remove() correctly calls
    synchronize_srcu(&ns->head->srcu) after list_del_rcu() to wait for
    in-progress readers. Add the same grace period in the error path.
    
    Fixes: ed754e5deeb1 ("nvme: track shared namespaces")
    Cc: [email protected]
    Signed-off-by: Tristan Madani <[email protected]>
    Reviewed-by: Sagi Grimberg <[email protected]>
    Reviewed-by: John Garry <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    [ Adjusted patch context to account for missing last_path reference-counting code. ]
    Signed-off-by: Sasha Levin <[email protected]>

nvme: fix swapped ZRASF zone state values for full and read only [+ + +]
Author: Karl Bonde Torp <[email protected]>
Date:   Tue Sep 29 16:25:00 2026 +0200

    nvme: fix swapped ZRASF zone state values for full and read only
    
    commit 564e46d9f6e87912effa03f123d37a511d520f09 upstream.
    
    The Zone Management Receive command Zone Receive Action Specific (ZRASF)
    reporting option values for the Full and Read Only zone states are swapped
    compared to the NVM Express Zoned Namespace Command Set Specification,
    Revision 1.5, Figure 35:
    
    - 5h lists the zones in the ZSF:Full state.
    - 6h lists the zones in the ZSRO:Read Only state.
    
    The nvmet ZNS backend uses these constants to map the ZRASF value received
    from the host to a block layer zone condition when filtering zones in
    Report Zones. Because of the swap, a host asking for full zones was given
    the read only zones, and a host asking for read only zones was given the
    full zones.
    
    Swap the values of NVME_ZRASF_ZONE_STATE_FULL and
    NVME_ZRASF_ZONE_STATE_READONLY to match the specification.
    
    Fixes: aaf2e048af27 ("nvmet: add ZBD over ZNS backend support")
    Cc: [email protected]
    Reviewed-by: Damien Le Moal <[email protected]>
    Signed-off-by: Karl Bonde Torp <[email protected]>
    Signed-off-by: Andreas Hindborg <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nvmet: preserve device path on allocation failure [+ + +]
Author: Julian Sun <[email protected]>
Date:   Tue Sep 8 11:35:18 2026 +0800

    nvmet: preserve device path on allocation failure
    
    [ Upstream commit 2f271b812170d4cad578bae1f91db72f3c2e36e7 ]
    
    nvmet_ns_device_path_store() frees the old path before allocating its
    replacement, losing the existing configuration if allocation fails.
    Allocate the new path before freeing the old one.
    
    Fixes: a07b4970f464 ("nvmet: add a generic NVMe target")
    Signed-off-by: Julian Sun <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

nvmet: use the local P2P device on metadata allocation failure [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Wed Sep 30 16:08:58 2026 +0900

    nvmet: use the local P2P device on metadata allocation failure
    
    [ Upstream commit 4aa9c0f377a4de5e8fddce76b34ee4529639a1ff ]
    
    nvmet_req_alloc_p2pmem_sgls() assigns req->p2p_dev only after the data
    and metadata SGL allocations succeed. If the data allocation succeeds
    but the metadata allocation fails, out_free_sg passes req->p2p_dev to
    pci_p2pmem_free_sgl() before that assignment has taken place.
    
    Pass the local p2p_dev argument instead, so cleanup uses the same PCI
    device as the successful data allocation.
    
    Fixes: bcd9a0797d73 ("nvmet: fix freeing unallocated p2pmem")
    Reported-by: Changyul Lee <[email protected]>
    Reviewed-by: Maurizio Lombardi <[email protected]>
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ocfs2/dlm: Protect the recovery list during debugfs reads [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Sun Oct 11 23:35:06 2026 +0800

    ocfs2/dlm: Protect the recovery list during debugfs reads
    
    [ Upstream commit 4c435828932bf46f29860e4a0375bcae101b778a ]
    
    Recovery participant records must remain alive while debug_state_print()
    walks reco.node_data and formats their fields. The formatter holds
    dlm->spinlock, but the recovery participant list is protected by
    dlm_reco_state_lock. In particular, dlm_destroy_recovery_area() detaches
    the list under dlm_reco_state_lock and frees the detached records after
    releasing it. A concurrent debugfs open can therefore read freed memory.
    
    Protect the participant traversal and field reads in debug_state_print()
    with dlm_reco_state_lock, matching the existing list writers. This also
    serializes the traversal against list_add_tail() during recovery-area
    initialization. Make the existing lock available to the debug code
    through dlmcommon.h; the lock remains internal to the OCFS2 DLM module.
    
    Release dlm->spinlock after formatting the other domain state and before
    acquiring dlm_reco_state_lock, so the debug reader does not nest the two
    locks. Leave recovery list insertion, detachment and freeing unchanged.
    
    KASAN report as below:
    
        BUG: KASAN: slab-use-after-free in debug_state_open+0x1169/0x12d0
        Read of size 4 at addr ffff88810662ef80 by task dlm-state-stres/896
    
        CPU: 1 UID: 0 PID: 896 Comm: dlm-state-stres Not tainted 7.3.0-rc4-next-20260921-pmb-ocfs2-functional-v1+ #1 PREEMPT(lazy)
        Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
        Call Trace:
         <TASK>
         dump_stack_lvl+0x93/0xd0
         print_report+0xce/0x630
         ? debug_state_open+0x1169/0x12d0
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? __virt_addr_valid+0x20e/0x420
         ? debug_state_open+0x1169/0x12d0
         kasan_report+0xe0/0x110
         ? debug_state_open+0x1169/0x12d0
         debug_state_open+0x1169/0x12d0
         ? __pfx_debug_state_open+0x10/0x10
         full_proxy_open_regular+0x193/0x310
         do_dentry_open+0x595/0x12d0
         ? __pfx_full_proxy_open_regular+0x10/0x10
         vfs_open_consume+0xd1/0x400
         ? srso_alias_return_thunk+0x5/0xfbef5
         path_openat+0x18d0/0x2020
         ? __pfx_path_openat+0x10/0x10
         do_file_open+0x21e/0x470
         ? __pfx_do_file_open+0x10/0x10
         ? _raw_spin_unlock+0x23/0x40
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? alloc_fd+0x3a6/0x6b0
         do_sys_openat2+0xf4/0x1b0
         ? __pfx_do_sys_openat2+0x10/0x10
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? __fput+0x5b5/0xa60
         __x64_sys_openat+0x136/0x1e0
         ? __pfx___x64_sys_openat+0x10/0x10
         do_syscall_64+0x114/0x620
         entry_SYSCALL_64_after_hwframe+0x77/0x7f
        [Register dump omitted.]
         </TASK>
    
        Allocated by task 880:
         kasan_save_stack+0x33/0x60
         kasan_save_track+0x14/0x30
         __kasan_kmalloc+0xaa/0xb0
         __kmalloc_cache_noprof+0x28d/0x610
         dlm_remaster_locks+0x147/0x1d90
         dlm_do_recovery+0xde1/0x1580
         dlm_recovery_thread+0x109/0x300
         kthread+0x351/0x460
         ret_from_fork+0x659/0x940
         ret_from_fork_asm+0x1a/0x30
    
        Freed by task 880:
         kasan_save_stack+0x33/0x60
         kasan_save_track+0x14/0x30
         kasan_save_free_info+0x3b/0x60
         __kasan_slab_free+0x5f/0x80
         kfree+0x308/0x580
         dlm_destroy_recovery_area+0x285/0x460
         dlm_remaster_locks+0x17c4/0x1d90
         dlm_do_recovery+0xde1/0x1580
         dlm_recovery_thread+0x109/0x300
         kthread+0x351/0x460
         ret_from_fork+0x659/0x940
         ret_from_fork_asm+0x1a/0x30
    
        The buggy address belongs to the object at ffff88810662ef80
         which belongs to the cache kmalloc-32 of size 32
        The buggy address is located 0 bytes inside of
         freed 32-byte region [ffff88810662ef80, ffff88810662efa0)
    
        [Page and memory-state dumps omitted.]
    
    Fixes: 007dce53a29c ("ocfs2/dlm: Dump the dlm state in a debugfs file")
    Signed-off-by: Cen Zhang <[email protected]>
    Link: https://patch.msgid.link/pm-ocfs2-objects-candidate-0049-v3-184e46c47f5283f06191@gmail.com
    Reviewed-by: Joseph Qi <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ocfs2: validate directory-index entry counts when reading metadata [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Wed Sep 9 06:45:57 2026 -0400

    ocfs2: validate directory-index entry counts when reading metadata
    
    [ Upstream commit bc70726ddad53c7e9a9a85915bf2415b0d4f42f9 ]
    
    ocfs2_validate_dx_leaf() and ocfs2_validate_dx_root() check the ECC and
    signature of an indexed-directory block before it reaches higher-level
    callers, but neither validator bounds the ocfs2_dx_entry_list counts
    against the capacity of the block that holds them.
    
    ocfs2_dx_dir_search() then walks
    
            for (i = 0; i < le16_to_cpu(entry_list->de_num_used); i++)
                    dx_entry = &entry_list->de_entries[i];
    
    over de_num_used entries with no bounds check.  entry_list is either
    dx_leaf->dl_list (from ocfs2_read_dx_leaf) or, for an inline root,
    dx_root->dr_entries.  A crafted on-disk image can set de_num_used (and
    de_count, which is the __counted_by_le() bound of de_entries) to 0xffff
    and make the walk read far past the end of the 4KB metadata block, giving
    a slab out-of-bounds read reachable from any path lookup, stat() or open()
    on an indexed directory once the image is mounted.
    
    Commit 775c17386a6f ("ocfs2: validate dx_root extent list fields during
    block read") already bounds dr_list for the non-inline dx_root, but left
    the inline dr_entries path and the dx_leaf dl_list unchecked.  Add the
    same read-time validation for both entry lists: de_count must equal the
    capacity of the block (ocfs2_dx_entries_per_leaf()/per_root()) and
    de_num_used must not exceed de_count, rejecting corrupted metadata with
    -EFSCORRUPTED before ocfs2_dx_dir_search() can walk an out-of-range entry
    array.
    
    de_count is always written as exactly the block capacity when a leaf or
    inline root is formatted, so the equality check does not reject any valid
    image.
    
    Found by 0sec automated security-research tooling (https://0sec.ai).
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: 9b7895efac90 ("ocfs2: Add a name indexed b-tree to directory inodes")
    Fixes: 4ed8a6bb083b ("ocfs2: Store dir index records inline")
    Assisted-by: 0sec:claude-opus-4-8
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Reviewed-by: Joseph Qi <[email protected]>
    Cc: Joel Becker <[email protected]>
    Cc: Kees Cook <[email protected]>
    Cc: Mark Fasheh <[email protected]>
    Cc: Junxiao Bi <[email protected]>
    Cc: Changwei Ge <[email protected]>
    Cc: Jun Piao <[email protected]>
    Cc: Heming Zhao <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ocfs2: validate dx_root extent list fields during block read [+ + +]
Author: Joseph Qi <[email protected]>
Date:   Wed Sep 9 06:45:56 2026 -0400

    ocfs2: validate dx_root extent list fields during block read
    
    [ Upstream commit 775c17386a6fd695f999d4cda90e3931386570dd ]
    
    Patch series "ocfs2: consolidate extent list validation into block read
    callbacks".
    
    ocfs2 validates extent list fields (l_count, l_next_free_rec) at various
    points during extent tree traversal.  This is fragile because each caller
    must remember to check for corrupted on-disk data before using it.
    
    This series moves those checks into the block read validation callbacks
    (ocfs2_validate_dx_root and ocfs2_validate_extent_block), so corrupted
    fields are caught early at block read time.  Redundant post-read checks
    are then removed.
    
    This patch (of 4):
    
    Move the extent list l_count validation from ocfs2_dx_dir_lookup_rec()
    into ocfs2_validate_dx_root(), so that corrupted on-disk fields are caught
    early at block read time rather than during directory lookups.
    
    Additionally, add a l_next_free_rec <= l_count check to prevent
    out-of-bounds access when iterating over extent records.
    
    Both checks are skipped for inline dx roots (OCFS2_DX_FLAG_INLINE), which
    use dr_entries instead of dr_list.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Joseph Qi <[email protected]>
    Reviewed-by: Heming Zhao <[email protected]>
    Cc: Mark Fasheh <[email protected]>
    Cc: Joel Becker <[email protected]>
    Cc: Junxiao Bi <[email protected]>
    Cc: Changwei Ge <[email protected]>
    Cc: Jun Piao <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Stable-dep-of: bc70726ddad5 ("ocfs2: validate directory-index entry counts when reading metadata")
    Signed-off-by: Sasha Levin <[email protected]>

 
of/irq: add missing of_node_put() for interrupt parent node [+ + +]
Author: Clément Léger <[email protected]>
Date:   Tue Jan 17 15:49:29 2023 +0100

    of/irq: add missing of_node_put() for interrupt parent node
    
    [ Upstream commit eb2b4ecf7299ee39ee9cecc4d3f2633aeb10cefb ]
    
    After calling of_irq_parse_one(), the node provided in the of_phandle_args
    has a refcount increment by one. Add missing of_node_put in of_irq_get()
    to decrement the refcount once used.
    
    Signed-off-by: Clément Léger <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Rob Herring <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

of/irq: Fix remaining refcount leaks in of_irq_init() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Sep 17 12:42:47 2026 +0000

    of/irq: Fix remaining refcount leaks in of_irq_init()
    
    commit 30724547b221e0e670ddfef140fc7d816b2aaec6 upstream.
    
    Successfully initialized controllers are moved to intc_parent_list,
    but the final cleanup only frees the descriptors. The device node
    references taken with of_node_get() and the interrupt parent
    references are therefore leaked on the normal return path. Drop both
    before kfree(), as the intc_desc_list cleanup already does.
    
    Fixes: 8363ccb917c6 ("of/irq: add missing of_node_put")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
of/overlay: don't create "//" paths for fragments targeting the root [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:25 2026 -0700

    of/overlay: don't create "//" paths for fragments targeting the root
    
    [ Upstream commit 21c89ff1fc86ffa517f3a9ca1ba5c48e9e37c1ba ]
    
    dup_and_fixup_symbol_prop() rewrites a symbol value by replacing its
    "/fragment/__overlay__" prefix with the fragment's target path. When
    the fragment targets the root node the target path is "/" and the
    result starts with "//", which __of_find_node_by_full_path() cannot
    resolve: symbols pointing into such fragments silently stop
    resolving.
    
    Drop the target path when it is the root and the tail is non-empty. A
    value naming the fragment root itself (empty tail) keeps the "/".
    
    Fixes: d1651b03c2df ("of: overlay: add overlay symbols to live device tree")
    Assisted-by: Claude:claude-fable-5 [Claude Code]
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

of/overlay: don't leak fragment references when changeset init fails [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:24 2026 -0700

    of/overlay: don't leak fragment references when changeset init fails
    
    [ Upstream commit 1d62f0f2bc7edb12ed09f71203df0e47fa4efca4 ]
    
    init_overlay_changeset() stores the number of initialized fragments
    in ovcs->count only on full success. When find_target() or the
    __symbols__ lookup fails partway through, the target and overlay
    references taken for the fragments initialized so far are never
    dropped: free_overlay_changeset() bounds its cleanup loop by
    ovcs->count, which is still 0.
    
    Store the running count on the error path so free_overlay_changeset()
    puts whatever was set up. The store is guarded by ovcs->fragments
    because on the allocation-failure path cnt still holds the counting
    pass total while there is no fragments array; everywhere else cnt
    only counts fully-initialized fragments.
    
    Reported-by: Sashiko AI <[email protected]>
    Closes: https://lore.kernel.org/[email protected]
    Fixes: 61b4de4e0b38 ("of: overlay: minor restructuring")
    Assisted-by: Claude:claude-opus-4-8 [Claude Code]
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

of/overlay: only treat a positive changeset id as registered [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:23 2026 -0700

    of/overlay: only treat a positive changeset id as registered
    
    commit 44081d708b5b885487bac792db78324b7b4c267d upstream.
    
    of_overlay_fdt_apply() stores the idr_alloc() return value in
    ovcs->id before checking it. On failure the stored id is negative,
    free_overlay_changeset()'s "if (ovcs->id)" check passes, idr_remove()
    is called with a negative id and list_del() runs on ovcs->ovcs_list,
    which is not initialized until after the id allocation. An allocation
    failure at that point dereferences NULL.
    
    Make free_overlay_changeset() treat only a strict-positive id as
    registered. The rest of the function already copes with a
    partially-initialized ovcs, so the error path stays a plain
    goto err_free_ovcs.
    
    Fixes: 61b4de4e0b38 ("of: overlay: minor restructuring")
    Cc: [email protected]
    Suggested-by: Geert Uytterhoeven <[email protected]>
    Assisted-by: Claude:claude-fable-5 [Claude Code]
    Reviewed-by: Geert Uytterhoeven <[email protected]>
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

of/overlay: put property on deadprops only after changeset add succeeds [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:22 2026 -0700

    of/overlay: put property on deadprops only after changeset add succeeds
    
    commit 814f2da6995772c07a7c9c2cc6028b6e3f3ecc9c upstream.
    
    add_changeset_property() links a new property of a not-yet-live
    target node into the node's deadprops list before handing it to
    of_changeset_add_property(). If that fails, the error path frees the
    property but leaves the freed pointer linked in deadprops, and
    of_node_release() frees it a second time when the aborted overlay's
    node is released.
    
    Record the changeset entry first and link the property into deadprops
    only on success. of_changeset_add_property() never looks at the
    node's property lists, so the order of the two steps is otherwise
    immaterial, and the error path frees a property that nothing
    references.
    
    Fixes: f96278810150 ("of: overlay: set node fields from properties when add new overlay node")
    Cc: [email protected]
    Assisted-by: Claude:claude-fable-5 [Claude Code]
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
openvswitch: add nf_ct_is_confirmed check before assigning the helper [+ + +]
Author: Xin Long <[email protected]>
Date:   Thu Oct 6 15:45:02 2022 -0400

    openvswitch: add nf_ct_is_confirmed check before assigning the helper
    
    [ Upstream commit 3c1860543fccc1d0cfe3fd6b190e414a418fe60e ]
    
    A WARN_ON call trace would be triggered when 'ct(commit, alg=helper)'
    applies on a confirmed connection:
    
      WARNING: CPU: 0 PID: 1251 at net/netfilter/nf_conntrack_extend.c:98
      RIP: 0010:nf_ct_ext_add+0x12d/0x150 [nf_conntrack]
      Call Trace:
       <TASK>
       nf_ct_helper_ext_add+0x12/0x60 [nf_conntrack]
       __nf_ct_try_assign_helper+0xc4/0x160 [nf_conntrack]
       __ovs_ct_lookup+0x72e/0x780 [openvswitch]
       ovs_ct_execute+0x1d8/0x920 [openvswitch]
       do_execute_actions+0x4e6/0xb60 [openvswitch]
       ovs_execute_actions+0x60/0x140 [openvswitch]
       ovs_packet_cmd_execute+0x2ad/0x310 [openvswitch]
       genl_family_rcv_msg_doit.isra.15+0x113/0x150
       genl_rcv_msg+0xef/0x1f0
    
    which can be reproduced with these OVS flows:
    
      table=0, in_port=veth1,tcp,tcp_dst=2121,ct_state=-trk
      actions=ct(commit, table=1)
      table=1, in_port=veth1,tcp,tcp_dst=2121,ct_state=+trk+new
      actions=ct(commit, alg=ftp),normal
    
    The issue was introduced by commit 248d45f1e193 ("openvswitch: Allow
    attaching helper in later commit") where it somehow removed the check
    of nf_ct_is_confirmed before asigning the helper. This patch is to fix
    it by bringing it back.
    
    Fixes: 248d45f1e193 ("openvswitch: Allow attaching helper in later commit")
    Reported-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Xin Long <[email protected]>
    Acked-by: Aaron Conole <[email protected]>
    Tested-by: Aaron Conole <[email protected]>
    Link: https://lore.kernel.org/r/c5c9092a22a2194650222bffaf786902613deb16.1665085502.git.lucien.xin@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

openvswitch: defer tunnel netdev_put to RCU release [+ + +]
Author: Yang Yang <[email protected]>
Date:   Mon Oct 12 09:40:51 2026 -0700

    openvswitch: defer tunnel netdev_put to RCU release
    
    [ Upstream commit 6931d21f87bc6d657f145798fad0bf077b82486c ]
    
    ovs_netdev_tunnel_destroy() may run after NETDEV_UNREGISTER already
    detached the device. Dropping the netdev reference in destroy can race
    with concurrent readers that still observe vport->dev.
    
    Do not release vport->dev in ovs_netdev_tunnel_destroy(). Instead, let
    vport_netdev_free() drop the reference from the RCU callback, matching
    the non-tunnel destroy path and avoiding additional synchronization
    under RTNL.
    
    Fixes: a9020fde67a6 ("openvswitch: Move tunnel destroy function to oppenvswitch module.")
    Reported-by: Yifan Wu <[email protected]>
    Reported-by: Juefei Pu <[email protected]>
    Tested-by: Ao Zhou <[email protected]>
    Co-developed-by: Yuan Tan <[email protected]>
    Signed-off-by: Yuan Tan <[email protected]>
    Suggested-by: Xin Liu <[email protected]>
    Signed-off-by: Yang Yang <[email protected]>
    Reviewed-by: Ilya Maximets <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    (cherry picked from commit 6931d21f87bc6d657f145798fad0bf077b82486c)
    [Harshit: Adapt the lifetime fix to dev_put() and one-argument rtnl_delete_link().]
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

openvswitch: fix soft lockup in the netlink flow dump [+ + +]
Author: Denis V. Lunev <[email protected]>
Date:   Tue Sep 29 09:25:19 2026 +0200

    openvswitch: fix soft lockup in the netlink flow dump
    
    commit aaaaf87ea99b8766c9a8aa0e71aa42e6bc8a5320 upstream.
    
    A production compute node carrying a few thousand datapath flows hit a
    soft lockup inside a single netlink flow dump and panicked.
    
    ovs_flow_cmd_dump() calls ovs_flow_stats_get() for every flow it
    emits, and that releases stats->lock with spin_unlock_bh() once per
    CPU that has touched the flow. Every release is a local_bh_enable(),
    and each one runs the pending softirq backlog in the dumping thread's
    own context.
    
    The skb bounds the flows one callback emits, but not the softirq work
    it absorbs. On a CPU that carries the box's packet load the backlog
    refills as fast as it drains, so the dumping thread becomes that CPU's
    softirq engine. It never sleeps and it has no reschedule point, so
    under voluntary preemption nothing can take the CPU away from it:
    neither the ksoftirqd the kernel woke to take the work over, nor the
    stopper thread the softlockup detector dispatches to refresh its
    timestamp.
    
    Hold BH off across the whole callback instead, the way
    ctnetlink_dump_table() does, so the nested spin_unlock_bh() stop
    draining softirqs. The loop already runs under rcu_read_lock() and
    cannot sleep. What it gives up is preemption under CONFIG_PREEMPT,
    since a BH-off region is not preemptible outside PREEMPT_RT. The
    region stays short: the skb caps the flows one callback emits, and
    empty buckets cost no skb space but are each visited once per dump, as
    the cursor only moves forward. The table grows on insert and shrinks
    only on flush, so the walk is bounded by the largest flow count the
    datapath has held. The softirq backlog the callback used to absorb has
    no bound at all.
    
    Fixes: 63e7959c4b9b ("openvswitch: Per NUMA node flow stats.")
    Cc: [email protected]
    Signed-off-by: Denis V. Lunev <[email protected]>
    Reviewed-by: Ilya Maximets <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

openvswitch: vport: fix self-deadlock on release of tunnel ports [+ + +]
Author: Ilya Maximets <[email protected]>
Date:   Mon Oct 12 09:40:52 2026 -0700

    openvswitch: vport: fix self-deadlock on release of tunnel ports
    
    [ Upstream commit aa69918bd418e700309fdd08509dba324fb24296 ]
    
    vports are used concurrently and protected by RCU, so netdev_put()
    must happen after the RCU grace period.  So, either in an RCU call or
    after the synchronize_net().  The rtnl_delete_link() must happen under
    RTNL and so can't be executed in RCU context.  Calling synchronize_net()
    while holding RTNL is not a good idea for performance and system
    stability under load in general, so calling netdev_put() in RCU call
    is the right solution here.
    
    However,
    when the device is deleted, rtnl_unlock() will call netdev_run_todo()
    and block until all the references are gone.  In the current code this
    means that we never reach the call_rcu() and the vport is never freed
    and the reference is never released, causing a self-deadlock on device
    removal.
    
    Fix that by moving the rcu_call() before the rtnl_unlock(), so the
    scheduled RCU callback will be executed when synchronize_net() is
    called from the rtnl_unlock()->netdev_run_todo() while the RTNL itself
    is already released.
    
    Fixes: 6931d21f87bc ("openvswitch: defer tunnel netdev_put to RCU release")
    Cc: [email protected]
    Acked-by: Eelco Chaudron <[email protected]>
    Signed-off-by: Ilya Maximets <[email protected]>
    Acked-by: Aaron Conole <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    (cherry picked from commit aa69918bd418e700309fdd08509dba324fb24296)
    [Harshit: Resolved minor conflicts because 5.15.y has one-argument
    rtnl_delete_link() call.]
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
OPP: Fix race between OPP addition and lookup [+ + +]
Author: Di Shen <[email protected]>
Date:   Tue Oct 20 23:03:38 2026 +0200

    OPP: Fix race between OPP addition and lookup
    
    [ Upstream commit f5e1cc9a284bff2510981643a5bca4bc4c21b81a ]
    
    A race exists between dev_pm_opp_add_dynamic() and
    dev_pm_opp_find_freq_exact():
    
      CPU0 (add)                          CPU1 (lookup)
      -------------------------------     ------------------------------
      _opp_add()
        mutex_lock()
        list_add(&new_opp->node, head)
        mutex_unlock()                    _opp_table_find_key()
                                            mutex_lock()
                                            dev_pm_opp_get(opp)
                                              kref_get()
                                            mutex_unlock()
        kref_init(&new_opp->kref)
                                          dev_pm_opp_put()
                                            kref_put_mutex()
    
    The newly added OPP is inserted into the list before its kref is
    initialized. A concurrent lookup can find this OPP and increment its
    reference count while it is still uninitialized, leading to refcount
    corruption and a potential premature free.
    
    Fix this by initializing ->kref and ->opp_table before making the OPP
    visible via list_add(). This ensures any concurrent lookup observes a
    fully initialized object.
    
    Fixes: 7034764a1e4a (PM / OPP: Add 'struct kref' to struct dev_pm_opp)
    Co-developed-by: Ling Xu <[email protected]>
    Signed-off-by: Ling Xu <[email protected]>
    Signed-off-by: Di Shen <[email protected]>
    [ Viresh: Updated commit log ]
    Signed-off-by: Viresh Kumar <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
optee: register TEE devices only once fully initialized [+ + +]
Author: Shao-Fu Chen <[email protected]>
Date:   Tue Oct 13 11:48:30 2026 -0400

    optee: register TEE devices only once fully initialized
    
    [ Upstream commit c108feca0a096f8db25d1b69130035025e9e936d ]
    
    optee_probe() called tee_device_register() on both the client and the
    supplicant device before the rest of struct optee had been initialized.
    
    tee_device_register() calls cdev_device_add(), which does two things at
    once: it creates /dev/tee0 and /dev/teepriv0, and it links the device
    into the tee class so that class_find_device() can find it. From that
    moment on the device is reachable both from user space via tee_open()
    and from kernel space via tee_client_open_context(). The only gate in
    teedev_open() is tee_device_get(), which merely checks that
    teedev->desc is non-NULL, which was already set by tee_device_alloc().
    Therefore, there is effectively no gate at all.
    
    A context opened in that window can run against a struct optee where
    
      - optee->call_queue.mutex is not initialized by optee_cq_init()
      - optee->supp mutex and completions is not initialized by
        optee_supp_init()
      - optee->rpmb_dev_mutex is not initialized yet,
      - the message argument cache is not initialized by
        optee_shm_arg_cache_init()
      - optee->ctx is still NULL
    
    Any open session or invoke during this window takes uninitialized
    mutexes and dereferences a NULL pointer.
    
    Fix it by moving both tee_device_register() calls down to the point
    where all of struct optee is set up.
    
    Fixes: 4fb0a5eb364d ("tee: add OP-TEE driver")
    Cc: [email protected]
    Signed-off-by: Shao-Fu Chen <[email protected]>
    [JW: adding fixes and cc]
    Signed-off-by: Jens Wiklander <[email protected]>
    [ sashal: Adapted the fix to the existing optee_probe() implementation using optee_remove() for cleanup. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
page_pool: keep frag_offset aligned for odd-sized requests [+ + +]
Author: Florian Schauer <[email protected]>
Date:   Fri Aug 28 08:08:22 2026 +0200

    page_pool: keep frag_offset aligned for odd-sized requests
    
    commit dc0df5a0c62ccea1d0e08d39a4dc9064de81d411 upstream.
    
    page_pool_alloc_frag_netmem() rounds the requested fragment size with
    
            size = ALIGN(size, dma_get_cache_alignment());
    
    dma_get_cache_alignment() returns 1 unless the architecture defines
    ARCH_DMA_MINALIGN, which DMA-coherent architectures such as x86 do not.
    There the ALIGN() is a no-op and pool->frag_offset advances by the raw,
    unrounded size.
    
    A single caller asking for an odd size then leaves frag_offset misaligned
    for every fragment carved out of that page afterwards.  The pool is shared,
    so the damage is not confined to the caller that caused it.
    
    The per-cpu system_page_pool used by generic XDP hits this.
    skb_pp_cow_data() allocates its fragments with the raw packet length:
    
            size = min_t(u32, len, PAGE_SIZE);
            truesize = size;
            page = page_pool_dev_alloc(pool, &page_off, &truesize);
    
    leaving frag_offset odd for whatever is carved out of that page next.  Its
    own head allocation is already aligned -- SKB_HEAD_ALIGN(size) plus the
    XDP_PACKET_HEADROOM its callers pass -- so it is a later user of the shared
    pool that pays: page_pool_dev_alloc_va() returns a misaligned buffer,
    napi_build_skb() installs it as skb->head, and skb_shinfo(skb) ==
    skb->head + skb->end is misaligned with it.
    
    skb_shinfo()->dataref is a 4-byte atomic_t at offset 0x20, so the
    atomic_inc() in __skb_clone() straddles a cache line.  On x86 with split
    lock detection -- fatal for kernel split locks by default -- this panics
    the machine:
    
      Oops: Split lock detected
      RIP: 0010:skb_clone+0x154/0x1e0
      Call Trace:
       <IRQ>
       raw_local_deliver+0x1ed/0x2c0
       ip_protocol_deliver_rcu+0x54/0x1c0
       ip_local_deliver_finish+0x85/0x100
       ip_local_deliver+0x67/0x100
       __netif_receive_skb_one_core+0x85/0xa0
       process_backlog+0x87/0x130
    
    Reproduced by attaching any generic-mode XDP program to loopback and
    opening a RAW IPPROTO_UDP socket, which makes raw_local_deliver() clone
    every locally delivered UDP packet; ordinary DNS traffic then triggers it,
    roughly once per 2500 clones.  Observed on 6.12.101 and 7.1.8.
    
    Tracing page_pool_alloc_frag_netmem() over one such run shows the
    amplification -- two odd-sized requests, nine misaligned offsets:
    
      requested size & 7:   0: 17035    5: 1    7: 1
      frag_offset & 7:      0: 17028    3: 1    4: 1    5: 1    6: 1    7: 5
    
    and skb_pp_cow_data() returning heads that were aligned on entry:
    
      head 0xffff8f4c86aeac00 -> 0xffff8f4c53a9a9c4 (&7=4)
      head 0xffff8f4d6a8a42c0 -> 0xffff8f4c4f7b7a45 (&7=5)
    
    Round the fragment size up to at least the alignment struct skb_shared_info
    requires, so fragments are always suitably aligned for the objects callers
    build on them.  Architectures needing a larger DMA alignment keep it.
    
    This also makes the remainder computed in page_pool_alloc_netmem(),
    
            *size = max_size - *offset;
    
    aligned, since max_size is a power of two -- which fixes the matching
    misalignment of skb->end.
    
    Verified with a controlled A/B under QEMU/KVM: same tree, same config,
    same compiler, same rootfs and identical traffic, differing only by this
    patch.  A SEC("xdp.frags") XDP_PASS program on lo plus UDP datagrams
    larger than max_head_size drives skb_pp_cow_data()'s fragment loop, which
    passes raw packet lengths to the pool.  Measured at the return of
    skb_pp_cow_data():
    
                              unpatched   patched
      skb_pp_cow_data calls       40800     40800
      misaligned skb->head         1120         0
      dataref at line offset >60     80         0
    
    The last row counts the accesses that actually fault:
    skb_shinfo()->dataref sits at head+end+0x20 and is a 4-byte atomic, so
    `lock incl` splits a 64-byte cache line only when that address lands at
    offset 61..63.  All 80 occurrences were at offset 61; the panic reported
    above was at offset 62.  Eliminating the misalignment removes every one
    of them.
    
    Same class of bug as commit 3bed3cc4156e ("net: Do not allocate page
    fragments that are not skb aligned"), which fixed the older
    netdev_alloc_frag()/napi_alloc_frag() allocators.
    
    Fixes: 53e0961da1c7 ("page_pool: add frag page recycling support in page pool")
    Cc: [email protected]
    Signed-off-by: Florian Schauer <[email protected]>
    Acked-by: Jesper Dangaard Brouer <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
params: Do not go over the limit when getting the string length [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:21:02 2026 -0400

    params: Do not go over the limit when getting the string length
    
    [ Upstream commit fd0cd057a1b7351604daa6ffc91dfe28adf7225d ]
    
    We can use strnlen() even on early stages and it prevents from
    going over the string boundaries in case it's already too long.
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

params: fix charp corruption on allocation failure [+ + +]
Author: Jiacheng Yu <[email protected]>
Date:   Tue Sep 8 14:21:06 2026 -0400

    params: fix charp corruption on allocation failure
    
    [ Upstream commit 3dfaae04243cde460d82dfc2a7dd0bb6664d20ae ]
    
    param_set_charp() stores charp parameters in allocated memory after slab is
    available, and releases the previous value when the parameter is updated.
    
    The previous value is released before the replacement allocation succeeds.
    If kmalloc_parameter() fails, the setter returns -ENOMEM with the parameter
    left as NULL.
    
    Failing zswap's compressor update before zswap is initialized can later
    trigger:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      RIP: 0010:strcmp+0x10/0x30
      Call Trace:
        zswap_setup+0x3b1/0x490
        zswap_enabled_param_set+0x5b/0xa0
        param_attr_store+0x93/0xe0
        module_attr_store+0x1c/0x30
        kernfs_fop_write_iter+0x116/0x1f0
    
    Allocate and copy the replacement first, then replace the parameter value
    only after allocation succeeds.
    
    Fixes: e180a6b7759a ("param: fix charp parameters set via sysfs")
    Cc: [email protected]
    Signed-off-by: Jiacheng Yu <[email protected]>
    Reviewed-by: Petr Pavlu <[email protected]>
    Signed-off-by: Petr Pavlu <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

params: Fix multi-line comment style [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:21:05 2026 -0400

    params: Fix multi-line comment style
    
    [ Upstream commit b5e3f86a47d34f7b8af899f8cc70520f6daf8b53 ]
    
    The multi-line comment style in the file is rather arbitrary.
    Make it follow the standard one.
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

params: Sort headers [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:21:04 2026 -0400

    params: Sort headers
    
    [ Upstream commit a05f096c2c0ca52e8fd34740c7d4b53ab3e7123e ]
    
    Sort the headers in alphabetic order in order to ease
    the maintenance for this part.
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

params: Use size_add() for kmalloc() [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:21:03 2026 -0400

    params: Use size_add() for kmalloc()
    
    [ Upstream commit 0fc79cbc937f2a754a302a710a94b68c61d0a89a ]
    
    Prevent allocations from integer overflow by using size_add().
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

 
PCI: Accept AtomicOps already enabled by the hypervisor [+ + +]
Author: Nikola Prica <[email protected]>
Date:   Mon Sep 21 13:19:03 2026 +0200

    PCI: Accept AtomicOps already enabled by the hypervisor
    
    [ Upstream commit 40cce45b921f7930886bcba43069edc579725457 ]
    
    pci_enable_atomic_ops_to_root() currently fails when no Root Port is
    visible. That is common in passthrough guests (ESXi, Hyper-V): the Endpoint
    is assigned to the VM, but the Root Port above it is not visible in the
    guest topology.
    
    In those setups the hypervisor may already have enabled AtomicOp Requester
    Enable on the device. If PCI_EXP_DEVCTL2_ATOMIC_REQ is set, treat AtomicOps
    as already enabled and return success instead of failing the Root Port
    walk.
    
    After 1ae8c4ce1570 ("PCI: Enable AtomicOps only if Root Port supports
    them"), pci_enable_atomic_ops_to_root() always returns failure if the Root
    Port is not visible, so drivers don't use atomics when they could.  On
    systems where the Root Port is not visible but *does* support AtomicOps,
    this is a regression: prior to 1ae8c4ce1570, it enabled AtomicOps in the
    endpoint and returned success.
    
    Fixes: 1ae8c4ce1570 ("PCI: Enable AtomicOps only if Root Port supports them")
    Signed-off-by: Nikola Prica <[email protected]>
    [bhelgaas: commit log, code comment]
    Signed-off-by: Bjorn Helgaas <[email protected]>
    Tested-by: Gerd Bayer <[email protected]>
    Reviewed-by: Christian König <[email protected]>
    Reviewed-by: Gerd Bayer <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
perf test bpf: Address error about non-null argument for epoll_pwait 2nd arg [+ + +]
Author: Arnaldo Carvalho de Melo <[email protected]>
Date:   Tue Sep 29 12:15:41 2026 -0700

    perf test bpf: Address error about non-null argument for epoll_pwait 2nd arg
    
    commit ed847e30f001b207013b6136c264454d7560557f upstream
    
    First noticed on Fedora Rawhide:
    
      tests/bpf.c: In function ‘epoll_pwait_loop’:
      tests/bpf.c:36:17: error: argument 2 null where non-null expected [-Werror=nonnull]
         36 |                 epoll_pwait(-(i + 1), NULL, 0, 0, NULL);
            |                 ^~~~~~~~~~~
      In file included from tests/bpf.c:5:
      /usr/include/sys/epoll.h:134:12: note: in a call to function ‘epoll_pwait’ declared ‘nonnull’
        134 | extern int epoll_pwait (int __epfd, struct epoll_event *__events,
            |            ^~~~~~~~~~~
    
      [perfbuilder@27cfe44d67ed perf-6.5.0-rc2]$ gcc -v
      Using built-in specs.
      COLLECT_GCC=gcc
      COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/13/lto-wrapper
      OFFLOAD_TARGET_NAMES=nvptx-none
      OFFLOAD_TARGET_DEFAULT=1
      Target: x86_64-redhat-linux
      Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,m2,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-libstdcxx-backtrace --with-libstdcxx-zoneinfo=/usr/share/zoneinfo --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-13.2.1-20230728/obj-x86_64-redhat-linux/isl-install --enable-offload-targets=nvptx-none --without-cuda-driver --enable-offload-defaulted --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux --with-build-config=bootstrap-lto --enable-link-serialization=1
      Thread model: posix
      Supported LTO compression algorithms: zlib zstd
      gcc version 13.2.1 20230728 (Red Hat 13.2.1-1) (GCC)
      [perfbuilder@27cfe44d67ed perf-6.5.0-rc2]$
    
    Just add that argument to address this compiler warning.
    
    Cc: Adrian Hunter <[email protected]>
    Cc: Ian Rogers <[email protected]>
    Cc: Jiri Olsa <[email protected]>
    Cc: Namhyung Kim <[email protected]>
    Link: https://lore.kernel.org/lkml/[email protected]
    Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
    Signed-off-by: Florian Fainelli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
perf tools: Fix a asan issue in parse_events_multi_pmu_add() [+ + +]
Author: Namhyung Kim <[email protected]>
Date:   Tue Sep 29 12:15:40 2026 -0700

    perf tools: Fix a asan issue in parse_events_multi_pmu_add()
    
    commit 66c9598bd8916c6c1319d0100ac916cac89d4b0e upstream
    
    In the parse_events_multi_pmu_add() it passes the 'config' variable
    twice to parse_events_term__num() - one for config and another for
    loc_term.  I'm not sure about the second one as it's converted to
    YYLTYPE variable.  Asan reports it like below:
    
      In function ‘parse_events_term__num’,
          inlined from ‘parse_events_multi_pmu_add’ at util/parse-events.c:1602:6:
      util/parse-events.c:2653:64: error: array subscript ‘YYLTYPE[0]’ is partly outside
                                          array bounds of ‘char[8]’ [-Werror=array-bounds]
       2653 |                 .err_term  = loc_term ? loc_term->first_column : 0,
            |                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
      util/parse-events.c: In function ‘parse_events_multi_pmu_add’:
      util/parse-events.c:1587:15: note: object ‘config’ of size 8
       1587 |         char *config;
            |               ^~~~~~
      cc1: all warnings being treated as errors
    
    Signed-off-by: Namhyung Kim <[email protected]>
    Acked-by: Ian Rogers <[email protected]>
    Cc: Adrian Hunter <[email protected]>
    Cc: Ingo Molnar <[email protected]>
    Cc: Jiri Olsa <[email protected]>
    Cc: Kan Liang <[email protected]>
    Cc: Leo Yan <[email protected]>
    Cc: Peter Zijlstra <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
    [florian: Resolve conflict in parse_events_multi_pmu_add() where term
     initialization is located inside the PMU scan loop in 5.15.y]
    Signed-off-by: Florian Fainelli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
perf/core: Fix WARN in perf_sigtrap() [+ + +]
Author: Tetsuo Handa <[email protected]>
Date:   Wed Jul 9 20:27:52 2025 +0900

    perf/core: Fix WARN in perf_sigtrap()
    
    [ Upstream commit 3da6bb419750f3ad834786d6ba7c9d5d062c770b ]
    
    Since exit_task_work() runs after perf_event_exit_task_context() updated
    ctx->task to TASK_TOMBSTONE, perf_sigtrap() from perf_pending_task() might
    observe event->ctx->task == TASK_TOMBSTONE.
    
    Swap the early exit tests in order not to hit WARN_ON_ONCE().
    
    Closes: https://syzkaller.appspot.com/bug?extid=2fe61cb2a86066be6985
    Reported-by: syzbot <[email protected]>
    Signed-off-by: Tetsuo Handa <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
perf/x86/intel: Remove anythread_deprecated bit from perf_capabilities [+ + +]
Author: Dapeng Mi <[email protected]>
Date:   Thu Sep 10 20:19:38 2026 -0400

    perf/x86/intel: Remove anythread_deprecated bit from perf_capabilities
    
    [ Upstream commit 8767b4d73018bd3143f4c55b672064fad292f11b ]
    
    AnyThread mode deprecation is enumerated by CPUID.0AH:EDX[15] instead of
    PERF_CAPABILITIES MSR. It's not a good practice to define a bit to
    represent "anythread deprecation" in perf_capabilities. It leads to the
    anythread_deprecated bit could be overwritten by the real value of
    PERF_CAPABILITIES MSR, just like the below code in update_pmu_cap() does.
    
    if (!intel_pmu_broken_perf_cap()) {
            /* Perf Metric (Bit 15) and PEBS via PT (Bit 16) are hybrid enumeration */
            rdmsrq(MSR_IA32_PERF_CAPABILITIES, hybrid(pmu, intel_cap).capabilities);
    }
    
    It leads to the anythread_deprecated bit is cleared to 0 and the "any"
    attribute is incorrectly shown in the /sys/devices/cpu/format/ folder on
    these support Perfmon v6 platforms, like Clearwater Forest.
    
    $ grep . /sys/devices/cpu/format/*
    /sys/devices/cpu/format/acr_mask:config2:0-63
    /sys/devices/cpu/format/any:config:21
    /sys/devices/cpu/format/cmask:config:24-31
    
    So remove the anythread_deprecated bit from perf_capabilities structure
    and directly depends on CPUID.0AH:EDX[15] to judge if anythread is
    deprecated.
    
    Fixes: cadbaa039b99 ("perf/x86/intel: Make anythread filter support conditional")
    Reported-by: Namhyung Kim <[email protected]>
    Signed-off-by: Dapeng Mi <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Reviewed-by: Zide Chen <[email protected]>
    Reviewed-by: Thomas Falcon <[email protected]>
    Acked-by: Namhyung Kim <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
perf: Fix race between perf_event_exit_task() and perf_pending_task() [+ + +]
Author: Luo Gengkun <[email protected]>
Date:   Sun Sep 20 07:50:26 2026 +0000

    perf: Fix race between perf_event_exit_task() and perf_pending_task()
    
    [ Upstream commit ffb684f2aa141eeb0caa6308422e7e05d1ded7c4 ]
    
    A race condition exists between perf_event_exit_task() and
    perf_pending_task() during begin_new_exec().
    
    During begin_new_exec(), perf_event_exit_task() may be called, and the
    PF_EXITING flag is not set on task. So perf_sigtrap() continues to execute
    and triggers WARN_ON_ONCE(event->ctx->task != current).
    
    Since both task exit and exec paths can call perf_event_exit_task() which
    sets ctx->task to TASK_TOMBSTONE, fix this by explicitly checking if
    event->ctx->task equals TASK_TOMBSTONE and dropping the redundant
    PF_EXITING check.
    
    Fixes: 97ba62b27867 ("perf: Add support for SIGTRAP on perf events")
    Signed-off-by: Luo Gengkun <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

perf: Require kernel access for text poke events [+ + +]
Author: Zhengchuan Liang <[email protected]>
Date:   Tue Oct 6 04:09:06 2026 -0400

    perf: Require kernel access for text poke events
    
    [ Upstream commit 357e8a77a501d96c9517f01f4a211eed5e9c9184 ]
    
    Perf events with exclude_kernel=1 can be opened without kernel perf
    access. However, exclude_kernel does not suppress text-poke sideband
    records. Every PERF_RECORD_TEXT_POKE is marked PERF_RECORD_MISC_KERNEL
    and contains a raw kernel instruction address.
    
    An unprivileged task can therefore open and mmap a task-local software
    event with text_poke=1. Both opening a count-only tracepoint event and
    configuring UDP GRO for ESP-in-UDP cause updates to inline static calls;
    the observer receives the relocated addresses of the modified instructions.
    For a known kernel image, any such address reveals the runtime kernel
    text base despite KASLR.
    
    Call perf_allow_kernel() whenever attr.text_poke is set, regardless of
    exclude_kernel. Events that neither monitor kernel execution nor request
    text-poke records retain their existing permissions.
    
    Fixes: e17d43b93e54 ("perf: Add perf text poke event")
    Assisted-by: LLM
    Signed-off-by: Zhengchuan Liang <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/99131354c41e23188f778b92f90363775b482395.1790573390.git.zcliangcn@gmail.com
    [ sashal: Adjusted context because the existing exclude_kernel check lacks the callchain condition. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
pinctrl: sunxi: keep a shadow copy of the data register output latches [+ + +]
Author: Ilya Titov <[email protected]>
Date:   Wed Sep 30 07:14:02 2026 -0400

    pinctrl: sunxi: keep a shadow copy of the data register output latches
    
    [ Upstream commit a13f7f5d14af9baf34eb12c25962f8d3542b281d ]
    
    On Allwinner SoCs, reading a bank's data register returns the pin level,
    not the output latch, for pins that are muxed as inputs.  Writing a GPIO
    therefore corrupts the output latches of all input-muxed pins in the
    same bank: the read-modify-write in sunxi_pinctrl_gpio_set() reads back
    their pin levels and writes those into their latches.
    
    This breaks emulated open-drain lines (e.g. a bit-banged I2C bus from
    i2c-gpio).  Such a line is released high by muxing it as input and
    letting the pull-up raise it, so any concurrent GPIO write in the same
    bank stores 1 into its latch.  Driving the line low afterwards is a
    non-atomic data-then-mux sequence in sunxi_pinctrl_gpio_direction_output();
    if the poisoning write lands between the two steps, the pin actively
    drives high (push-pull) instead of low.
    
    Observed in practice as sporadic glitches on a T507 board bit-banging
    I2C on port E while other PE GPIOs are toggled.  On a scope the failure
    is unmistakable: on a clock pulse where SCL should fall to GND, the line
    instead steps *above* its idle high level for the whole low phase — the
    pad drives a strong push-pull 3.3 V high, higher than the level the
    pull-up sustains on the loaded bus — before the next transition recovers
    it.  The same can hit SDA, corrupting data instead of clocks.
    
    Steps to reproduce on any sunxi board with a bit-banged (i2c-gpio) bus:
    
      # background: toggle any other GPIO of the same bank, e.g. line 21
      gpioset -c <chip> --toggle 100us 21=0 &
    
      # foreground: keep the bit-banged bus busy
      while :; do i2cdetect -y <bus> 0x50 0x57; done
    
      # watch SCL/SDA with a scope or logic analyzer: sporadic clock-low
      # phases driven high (above the pull-up level) instead of low
    
    The bank spinlock cannot help: the racing write is a perfectly valid
    whole-register RMW that faithfully writes back what the hardware
    returned.  There are no set/clear registers on this IP to write a single
    bit atomically.
    
    Fix it the same way gpio-mmio handles hardware whose data register read
    does not return the output latch: keep a shadow copy of each bank's
    latches, base the read-modify-write on the shadow, and only write the
    register.  The shadow is seeded from the hardware at probe time so pins
    left in output mode by the bootloader keep their state.  Pins that reach
    output mode through the gpiolib paths write their value (and thereby
    their shadow bit) before the mux switch in
    sunxi_pinctrl_gpio_direction_output(); pins muxed to gpio_out directly
    through a pinmux node bypass that path, so sunxi_pmx_set() refreshes
    their shadow bit from the latch (readable once the pin is in output
    mode) to keep them driving their pre-existing level.
    
    Seeding the shadow reads the PIO registers at probe time, which requires
    the bus clock to be enabled.  The clock was only requested at the very
    end of probe, after devm_pinctrl_register() had already claimed the pin
    hogs described in the device tree - which mux pins, and thus access
    registers, with the clock still gated.  Move the request ahead of both.
    Boards whose bootloader leaves the PIO clock running are unaffected,
    which is why the pre-existing hog problem has gone unnoticed since
    commit 950707c0eb5c ("pinctrl: sunxi: add clock support").
    
    Fixes: df7b34f4c3d2 ("pinctrl: sunxi: Fix gpio_set behaviour")
    Cc: [email protected]
    Signed-off-by: Ilya Titov <[email protected]>
    Signed-off-by: Linus Walleij <[email protected]>
    [ Removed the pctl argument from two sunxi_data_reg() calls to match the older four-argument API. ]
    Signed-off-by: Sasha Levin <[email protected]>

pinctrl: sunxi: Refactor register/offset calculation [+ + +]
Author: Samuel Holland <[email protected]>
Date:   Wed Sep 30 07:14:00 2026 -0400

    pinctrl: sunxi: Refactor register/offset calculation
    
    [ Upstream commit 0bb95ae2672f9e00f471598a515bf4e9c2005046 ]
    
    Starting with the D1/D1s/T113 SoC, Allwinner changed the layout of the
    pinctrl registers. This new layout widens the drive level field, which
    affects the pull register offset and the overall bank size.
    
    As a first step to support this, combine the register and offset
    calculation functions, and refactor the math to depend on one constant
    for field widths instead of three. This minimizes the code size impact
    of making some of the factors dynamic.
    
    While rewriting these functions, move them to the implementation file,
    since that is the only file where they are used. And make the comment
    more generic, without mentioning specific offsets/sizes.
    
    The callers are updated to expect a shifted mask, and to use consistent
    terminology (reg/shift/mask/val).
    
    Reviewed-by: Heiko Stuebner <[email protected]>
    Reviewed-by: Jernej Skrabec <[email protected]>
    Tested-by: Heiko Stuebner <[email protected]>
    Signed-off-by: Samuel Holland <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Linus Walleij <[email protected]>
    Stable-dep-of: a13f7f5d14af ("pinctrl: sunxi: keep a shadow copy of the data register output latches")
    Signed-off-by: Sasha Levin <[email protected]>

pinctrl: sunxi: Use devm_clk_get_enabled() helpers [+ + +]
Author: Wang Jianzheng <[email protected]>
Date:   Wed Sep 30 07:14:01 2026 -0400

    pinctrl: sunxi: Use devm_clk_get_enabled() helpers
    
    [ Upstream commit 7dc92ece32ed87a352e285e3d9f0d392b61443e2 ]
    
    sunxi sunxi_pinctrl_init_with_variant get, enable clk and
    deinit_device disable and unprepare it.
    
    This simplifes the code and avoids the calls to
    clk_disable_unprepare().
    
    Signed-off-by: Wang Jianzheng <[email protected]>
    Link: https://lore.kernel.org/[email protected]
    Signed-off-by: Linus Walleij <[email protected]>
    Stable-dep-of: a13f7f5d14af ("pinctrl: sunxi: keep a shadow copy of the data register output latches")
    Signed-off-by: Sasha Levin <[email protected]>

 
pipe: preserve existing fasync readers on writer setup failure [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Fri Oct 2 06:17:05 2026 +0000

    pipe: preserve existing fasync readers on writer setup failure
    
    [ Upstream commit 40bb03d3ea6f6a915218508819ecc4d7a7fa260d ]
    
    F_SETFL and FIOASYNC decide whether to invoke ->fasync() before
    pipe_fasync() takes pipe->mutex. Two enables of one O_RDWR FIFO can
    therefore both enter the callback.
    
    fasync_helper() allocates before checking for an existing entry. If the
    first enable installs both entries, a second enable can update the
    reader entry and then fail the allocation for the writer entry. The
    error path removes the pre-existing reader entry, clearing FASYNC while
    the writer entry remains registered. __fput() then skips ->fasync(), so a
    later pipe notification can dereference the freed file or its f_owner.
    An unprivileged memory-pressure reproducer triggers a KASAN
    slab-use-after-free in send_sigio() through this path.
    
    Keep the reader helper's result and undo the registration only if this
    call added it. The pipe mutex serializes changes to both lists, so a
    failed new registration still removes its reader, while a failed
    duplicate preserves the existing registrations and FASYNC. Successful
    duplicate enables continue to update fa_fd as before.
    
    Fixes: 76398425bb06 ("Move FASYNC bit handling to f_op->fasync()")
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
pmdomain: rockchip: don't ignore clock lookup errors on attach [+ + +]
Author: Shawn Lin <[email protected]>
Date:   Tue Oct 13 11:12:16 2026 -0400

    pmdomain: rockchip: don't ignore clock lookup errors on attach
    
    [ Upstream commit 4c66c423593e26273ea0d644906ed007630c6f6d ]
    
    rockchip_pd_attach_dev() treated every of_clk_get() error as the end
    of the clock list, so a clock that exists but is not available yet
    (e.g. -EPROBE_DEFER) was silently skipped and the device ended up
    without pm_clk management.  Only -ENOENT means there are no more
    clocks.
    
    Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
    Signed-off-by: Shawn Lin <[email protected]>
    Reviewed-by: Sebastian Reichel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

pmdomain: rockchip: fix clock leak on domain probe failure [+ + +]
Author: Shawn Lin <[email protected]>
Date:   Tue Oct 13 11:12:22 2026 -0400

    pmdomain: rockchip: fix clock leak on domain probe failure
    
    [ Upstream commit d8b3847770661b7109146e6479eeadcdab9cecf0 ]
    
    When of_clk_get() failed in the middle of the loop, the references of
    the clocks acquired so far were leaked instead of being released by
    the error path.
    
    Fixes: d909072d0521 ("soc: rockchip: power-domain: use clk_bulk APIs")
    Signed-off-by: Shawn Lin <[email protected]>
    Reviewed-by: Sebastian Reichel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

pmdomain: rockchip: propagate subdomain add errors [+ + +]
Author: Shawn Lin <[email protected]>
Date:   Tue Oct 13 11:15:53 2026 -0400

    pmdomain: rockchip: propagate subdomain add errors
    
    [ Upstream commit 4c0d69d677cf5b0065ebbb3ceb8ba66fddbec630 ]
    
    rockchip_pm_add_subdomain() ignored the return value of its recursive
    call, so a failure deeper in the hierarchy was silently dropped and
    probe still succeeded with an incomplete domain tree.
    
    Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
    Signed-off-by: Shawn Lin <[email protected]>
    Reviewed-by: Sebastian Reichel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Ulf Hansson <[email protected]>
    [ sashal: goto err_out instead of return, so the np reference taken by for_each_child_of_node() is dropped ]
    Signed-off-by: Sasha Levin <[email protected]>

 
power: supply: ds2780: Fix ds2780_get_capacity() returning raw value [+ + +]
Author: Xueqin Luo <[email protected]>
Date:   Tue Sep 1 15:29:54 2026 +0800

    power: supply: ds2780: Fix ds2780_get_capacity() returning raw value
    
    [ Upstream commit a58cbc8b36ec0cd00d2ba3de7d003de818a27523 ]
    
    ds2780_get_capacity() returns the raw register value instead of 0 on
    success.  The capacity is already stored in *capacity, so the function
    should return 0 to indicate success.
    
    Fixes: 275ac74629c4 ("w1: add Maxim/Dallas DS2780 Stand-Alone Fuel Gauge IC support")
    Signed-off-by: Xueqin Luo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sebastian Reichel <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: max17040: Convert to i2c's .probe_new() [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Wed Sep 9 07:21:27 2026 -0400

    power: supply: max17040: Convert to i2c's .probe_new()
    
    [ Upstream commit a07fca69378c26ea034826feb0011256e25ad237 ]
    
    .probe_new() doesn't get the i2c_device_id * parameter, so determine
    that explicitly in the probe function.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Sebastian Reichel <[email protected]>
    Stable-dep-of: 4e4b9f5ce9df ("power: supply: max17040: drop incorrect I2C functionality check")
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: max17040: drop incorrect I2C functionality check [+ + +]
Author: Jianing Li <[email protected]>
Date:   Wed Sep 9 07:21:28 2026 -0400

    power: supply: max17040: drop incorrect I2C functionality check
    
    [ Upstream commit 4e4b9f5ce9dfb8ed4b8d1262a504b8043ac09d87 ]
    
    max17040_probe() rejects adapters that do not advertise
    I2C_FUNC_SMBUS_BYTE. The driver does not issue SMBus byte transactions,
    however. Its regmap has 8-bit registers and 16-bit big-endian values, for
    which regmap-i2c supports either raw I2C transfers or SMBus word-data
    transactions.
    
    Consequently, an adapter providing raw I2C transfers or SMBus word data
    but not SMBus byte transactions is rejected even though regmap can access
    the device. Conversely, the current check can pass an adapter that regmap
    cannot use.
    
    Drop the stale check and let devm_regmap_init_i2c() validate and select
    the supported transfer method.
    
    Fixes: 6455a8a84bdfd ("power: supply: max17040: Use regmap i2c")
    Cc: [email protected]
    Signed-off-by: Jianing Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [Fixed Fixes tag, so that it points to the regmap introduction instead of the initial driver addition]
    Signed-off-by: Sebastian Reichel <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: rt9455: Convert to i2c's .probe_new() [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Wed Sep 9 07:28:17 2026 -0400

    power: supply: rt9455: Convert to i2c's .probe_new()
    
    [ Upstream commit 2adfc4370ebb745380a44c3e5418486a32a9ba67 ]
    
    The probe function doesn't make use of the i2c_device_id * parameter so it
    can be trivially converted.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Sebastian Reichel <[email protected]>
    Stable-dep-of: 3e7a1ebc32fa ("power: supply: rt9455: quiesce delayed work before teardown")
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: rt9455: quiesce delayed work before teardown [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 07:28:18 2026 -0400

    power: supply: rt9455: quiesce delayed work before teardown
    
    [ Upstream commit 3e7a1ebc32fad5a558254a478efd401c17a24381 ]
    
    The threaded IRQ handler can queue pwr_rdy_work,
    max_charging_time_work and batt_presence_work.  pwr_rdy_work and
    batt_presence_work can also queue max_charging_time_work, while
    batt_presence_work can requeue itself.
    
    rt9455_remove() cancels max_charging_time_work before
    batt_presence_work.  The latter can therefore queue
    max_charging_time_work after it has already been cancelled:
    
      rt9455_remove()                   workqueue
        cancel pwr_rdy_work
        cancel max_charging_time_work
                                          batt_presence_work queues
                                            max_charging_time_work
        cancel batt_presence_work
        return
        devres frees rt9455_info
                                          max_charging_time_work dereferences
                                            rt9455_info
    
    The IRQ also remains registered until devres cleanup and can queue more
    work after any of the cancellation calls.  If rt9455_hw_init() fails
    after the IRQ has been requested, probe returns without cancelling work
    that may already have been queued.  A pending callback can then access
    rt9455_info after it has been freed.
    
    Register rt9455_cancel_all_delayed_works() through
    devm_add_action_or_reset() right after devm_power_supply_register().
    devres invokes the action in reverse registration order, after the
    managed IRQ has been freed and before rt9455_info is released, so the
    delayed works are drained in both rt9455_remove() and the probe error
    path.  Cancel pwr_rdy_work and batt_presence_work before
    max_charging_time_work because both can queue the latter.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: e86d69dd786e ("power_supply: Add support for Richtek RT9455 battery charger")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sebastian Reichel <[email protected]>
    [ retained the int-returning rt9455_remove() callback required by the older I²C interface. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
RDMA/hns: Fix WQ_MEM_RECLAIM warning [+ + +]
Author: Chengchang Tang <[email protected]>
Date:   Sun Jan 4 14:40:54 2026 +0800

    RDMA/hns: Fix WQ_MEM_RECLAIM warning
    
    commit c0a26bbd3f99b7b03f072e3409aff4e6ec8af6f6 upstream.
    
    When sunrpc is used, if a reset triggered, our wq may lead the
    following trace:
    
    workqueue: WQ_MEM_RECLAIM xprtiod:xprt_rdma_connect_worker [rpcrdma]
    is flushing !WQ_MEM_RECLAIM hns_roce_irq_workq:flush_work_handle
    [hns_roce_hw_v2]
    WARNING: CPU: 0 PID: 8250 at kernel/workqueue.c:2644 check_flush_dependency+0xe0/0x144
    Call trace:
      check_flush_dependency+0xe0/0x144
      start_flush_work.constprop.0+0x1d0/0x2f0
      __flush_work.isra.0+0x40/0xb0
      flush_work+0x14/0x30
      hns_roce_v2_destroy_qp+0xac/0x1e0 [hns_roce_hw_v2]
      ib_destroy_qp_user+0x9c/0x2b4
      rdma_destroy_qp+0x34/0xb0
      rpcrdma_ep_destroy+0x28/0xcc [rpcrdma]
      rpcrdma_ep_put+0x74/0xb4 [rpcrdma]
      rpcrdma_xprt_disconnect+0x1d8/0x260 [rpcrdma]
      xprt_rdma_connect_worker+0xc0/0x120 [rpcrdma]
      process_one_work+0x1cc/0x4d0
      worker_thread+0x154/0x414
      kthread+0x104/0x144
      ret_from_fork+0x10/0x18
    
    Since QP destruction frees memory, this wq should have the WQ_MEM_RECLAIM.
    
    Fixes: ffd541d45726 ("RDMA/hns: Add the workqueue framework for flush cqe handler")
    Signed-off-by: Chengchang Tang <[email protected]>
    Signed-off-by: Junxian Huang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Leon Romanovsky <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
rds_tcp: close NULL deref window in rds_tcp_set_callbacks [+ + +]
Author: Maoyi Xie <[email protected]>
Date:   Fri Oct 2 18:50:55 2026 -0700

    rds_tcp: close NULL deref window in rds_tcp_set_callbacks
    
    commit d2bfdbb69cf87676981b1043010b6224d84c6d3a upstream.
    
    rds_tcp_set_callbacks() links a new rds_tcp_connection onto
    rds_tcp_tc_list under rds_tcp_tc_list_lock. It releases the
    lock, then assigns tc->t_sock = sock outside the lock.
    
    rds_tcp_tc_info() and rds6_tcp_tc_info() walk rds_tcp_tc_list
    under the same lock. Both dereference tc->t_sock->sk without
    a NULL check.
    
    A reader can acquire rds_tcp_tc_list_lock between the writer's
    spin_unlock and the t_sock store. It then sees a list entry
    whose t_sock is NULL. The dereference of tc->t_sock->sk is a
    NULL access.
    
    Move tc->t_sock = sock inside rds_tcp_tc_list_lock, before
    list_add_tail. A reader holding the lock then observes the
    linkage and the t_sock store together.
    
    The restore path is safe. rds_tcp_restore_callbacks() does
    list_del_init inside the lock. The matching tc->t_sock = NULL
    after unlink is harmless to readers holding the lock.
    
    Fixes: 70041088e3b9 ("RDS: Add TCP transport to RDS")
    Suggested-by: Simon Horman <[email protected]>
    Signed-off-by: Maoyi Xie <[email protected]>
    Reviewed-by: Allison Henderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    
    [ achender: resolved context conflict; tc->t_rtn initialization is not
      present in this tree ]
    Signed-off-by: Allison Henderson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
regulator: ltc3676: don't read the write-only HRST and CLIRQ registers [+ + +]
Author: Abhishek Ojha <[email protected]>
Date:   Tue Sep 1 21:07:01 2026 -0400

    regulator: ltc3676: don't read the write-only HRST and CLIRQ registers
    
    commit 28c2388ee24cdbefbcc458fa41ef7bffaaa1cc83 upstream.
    
    HRST (0x1e) and CLIRQ (0x1f) are write-only command strobes. Writing HRST
    triggers a hard reset of the chip and writing CLIRQ clears the interrupt;
    reading them returns nothing useful, and the read itself fires the command.
    
    The result is that a plain register dump resets the board:
    
      cat /sys/kernel/debug/regmap/2-003c/registers
    
    walks every readable register, hits HRST, and the board reboots.
    
    Split the callback back in two so HRST and CLIRQ stay writable but are no
    longer readable. The readable range is left unchanged
    (LTC3676_BUCK1 ... LTC3676_IRQSTAT).
    
    Fixes: 37b918a034fe ("regulator: Add LTC3676 support")
    Cc: [email protected]
    Signed-off-by: Abhishek Ojha <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Revert "scsi: sd: sd_zbc: Use logical blocks as unit when querying zones" [+ + +]
Author: Simon Liebold <[email protected]>
Date:   Mon Oct 5 15:07:13 2026 +0000

    Revert "scsi: sd: sd_zbc: Use logical blocks as unit when querying zones"
    
    This reverts commit 9c78f3cf77855600c0d27f5b5acdf918bc61328e, the 5.15.y
    backport of upstream 43af5da09efb.
    
    43af5da09efb is a cleanup ("slightly simplifies sd_zbc_report_zones()"),
    not a fix. It entered 5.15.y only as a Stable-dep-of: 93dde0bf2f39
    ("scsi: scsi_debug: Fix REPORT ZONES alloc_len underflow OOB write"),
    which touches only scsi_debug.c and does not actually depend on it.
    
    On its own it zeroes the capacity of host-managed SMR drives at boot. It
    changed the REPORT ZONES loop advance from
    
            sector += sd_zbc_zone_sectors(sdkp) * i;        /* sector_t, 64-bit */
    to
            lba += sdkp->zone_blocks * i;                   /* u32, wraps */
    
    (zone_info.zone_blocks on 5.15.y after bffcb7d6a287). zone_blocks is
    u32, so the product is computed in 32 bits and wraps before being
    widened into the 64-bit lba. A drive returning >= 8192 zones in one
    REPORT ZONES (~2 TiB+ at 256 MiB zones, i.e. any modern HM-SMR part)
    overflows on the first iteration; the next batch is requested at a
    wrapped LBA, the block layer rejects the backward jump, and sd truncates
    the device to zero:
    
            sdX: Zone gap at sectors 18219532288..1039663104
            sdX: failed to revalidate zones
    
    (524288 * 34751 = 18219532288, mod 2^32 = 1039663104.)
    
    Mainline never shipped this: in the same series, patch 7 c976e588b34e
    ("scsi: sd: sd_zbc: Hide gap zones") rewrote the loop to advance per
    descriptor from 64-bit device values. 5.15.y took patch 4 and the
    intervening 628617be8968 but not c976e588b34e, keeping the broken
    intermediate state.
    
    Reverting is preferred over pulling in c976e588b34e: it is a ZBC-2
    feature (gap zones, constant zone-starting-LBA granularity) adding ~130
    lines across sd_zbc.c, sd.h and include/scsi/scsi_proto.h. It gains
    nothing for the constant-zone-size HM-SMR drives 5.15.y serves, which
    the restored sector_t advance already handles correctly.
    
    The revert conflicted with bffcb7d6a287 (which renamed the field on the
    advance line); resolved by keeping the restored "sector +=
    sd_zbc_zone_sectors(sdkp) * i", which reads zone_info.zone_blocks via
    logical_to_sectors() and is 64-bit. 93dde0bf2f39 stays in place and is
    unaffected.
    
    Signed-off-by: Simon Liebold <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
Revert "wifi: libertas: reject short monitor TX frames" [+ + +]
Author: Johannes Berg <[email protected]>
Date:   Wed Oct 7 22:42:08 2026 +0200

    Revert "wifi: libertas: reject short monitor TX frames"
    
    commit 9727d1c4e1c971fc42b049b645fdda6852758835 upstream.
    
    This reverts commit 13ff543e0b2c713aedeaadadde686686e949dc78.
    
    The 'goto free' just made things worse, causing a spinlock
    to be handled incorrectly. Revert this for now.
    
    Reported-by: Takashi Iwai <[email protected]>
    Cc: [email protected]
    Fixes: 13ff543e0b2c ("wifi: libertas: reject short monitor TX frames")
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ring-buffer: Acquire the lock with irqsave in rb_wake_up_waiters() [+ + +]
Author: Sebastian Andrzej Siewior <[email protected]>
Date:   Wed Sep 16 20:37:24 2026 -0400

    ring-buffer: Acquire the lock with irqsave in rb_wake_up_waiters()
    
    [ Upstream commit 815e07c8fe885a87751c2496a30ae0dcd4118210 ]
    
    rb_wake_up_waiters() is a irq_work callback which is initialized with
    init_irq_work(). As such it will be invoked in thread context on
    PREEMPT_RT. Invoking the callback in IRQ context on PREEMPT_RT is not an
    option due its usage of wake_up_all().  Since this callback may run in
    thread context, it needs to acquire ring_buffer_per_cpu::reader_lock with
    disabling interrupts and may not assume that they are disabled.
    
    Use raw_spinlock_irqsave() to acquire ring_buffer_per_cpu::reader_lock.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 68282dd930ea3 ("ring-buffer: Fix resetting of shortest_full")
    Reviewed-by: Vincent Donnefort <[email protected]>
    Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    [ Replaced scoped_guard() with explicit raw_spin_lock_irqsave()/raw_spin_unlock_irqrestore() calls for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
rtc: spear: initialize IRQ state before requesting alarm IRQ [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Wed Sep 2 16:03:18 2026 +0800

    rtc: spear: initialize IRQ state before requesting alarm IRQ
    
    commit 055ef5ce9f67a6a3a1363fa663007f8196cc0fb8 upstream.
    
    devm_request_irq() enables the interrupt before it returns, so the handler
    may run while probe is still initializing the device. Initialize the MMIO
    address and spinlock before requesting the alarm IRQ.
    
    Fixes: 0942a71e435f ("rtc: add support for spear rtc")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Runyu Xiao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Alexandre Belloni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
s390/ctcm: Prevent XID null dereference [+ + +]
Author: Aswin Karuvally <[email protected]>
Date:   Thu Aug 27 08:34:08 2026 +0200

    s390/ctcm: Prevent XID null dereference
    
    commit b264d8422779d69febce914efc47a92a85cc382c upstream.
    
    The mpc_validate_xid() function sets grp->saved_xid2->xid2_flag2 to 0x40
    to signal XID validation error. If peer XID is NULL or r/w channel
    pairing mismatch happens, grp->saved_xid2 is never initialized. An
    attempt to set the flag in such case leads to NULL dereference.
    
    Fix this by using the always available priv->xid->xid2_flag2 instead of
    grp->saved_xid2->xid2_flag2 for validation errors.
    
    Fixes: 293d984f0e36 ("ctcm: infrastructure for replaced ctc driver")
    Cc: [email protected]
    Signed-off-by: Aswin Karuvally <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
s390/pci: Fix leak of uninitialized kernel data in SCLP report [+ + +]
Author: Niklas Schnelle <[email protected]>
Date:   Thu Aug 6 11:43:39 2026 +0200

    s390/pci: Fix leak of uninitialized kernel data in SCLP report
    
    commit 8ac60ae2a307a50b599bf5d300b448d638f3ba29 upstream.
    
    While report_error_write() checks that the provided buffer is at least
    as large as the header struct, but not that it is large enough to
    contain the report with the length claimed by report->length. If
    user-space provides a short buffer, meaning a larger report->length than
    the actually written payload, up to around 4K of kernel data from past
    the kmalloc(len + 1) sized buffer allocated in kernfs_fop_write_iter()
    will leak into the SCLP report.
    
    However, as the entity processing the SCLP is privileged and able to
    access at least the page including the report, this does not leak data
    that entity could not access but it is still an out of bounds read and
    a malformed error report that should be rejected.
    
    Fixes: 368704a65be8 ("s390/pci: add report_error attribute")
    Cc: [email protected]
    Signed-off-by: Niklas Schnelle <[email protected]>
    Reviewed-by: Benjamin Block <[email protected]>
    Signed-off-by: Vasily Gorbik <[email protected]>
    Signed-off-by: Heiko Carstens <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
samples: pidfd: fix userprogs typo [+ + +]
Author: Sasha Levin <[email protected]>
Date:   Sun Oct 11 18:33:42 2026 -0400

    samples: pidfd: fix userprogs typo
    
    [ Upstream commit f1365f97fb7498d805981102eee22d362ae643f2 ]
    
    The Makefile adds pidfd-metadata to "usertprogs-always-y", which kbuild
    does not know, so the sample has not been built since the conversion to
    userprogs, even with CONFIG_SAMPLE_PIDFD=y.
    
    Fix the variable name. pidfd-metadata.c builds without warnings with
    gcc and clang for x86_64 and arm64.
    
    Fixes: 60fb0b1239719 ("samples: pidfd: build sample program for target architecture")
    Signed-off-by: Sasha Levin <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Christian Brauner <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
scsi: ch: Do not keep references to data transfer element devices [+ + +]
Author: Ahmed Abdelhaleem Ahmed <[email protected]>
Date:   Tue Oct 13 13:58:42 2026 -0400

    scsi: ch: Do not keep references to data transfer element devices
    
    [ Upstream commit 27c0f718d3b3c99e6d315308e95d987d0382a8a8 ]
    
    ch_readconfig() looks up the scsi_device of every data transfer element
    whose SCSI id the changer reports in READ ELEMENT STATUS, and stores it in
    ch->dt[]. scsi_device_lookup() takes a reference, and nothing ever drops
    it: ch_destroy() frees the array with kfree(). ch->dt[] is read nowhere
    else - it only supplies the vendor, model and revision printed in the same
    loop.
    
    Once such a drive is removed, its scsi_device can never be released. It
    stays on the host's device list at its address, so a new device there is
    refused by anything that walks the list - target_core_pscsi reports
    "scsi_device_get() failed for H:C:T:L" - and the low-level driver's module
    can no longer be unloaded. Only a reboot recovers.
    
    It shows with any changer that reports its drives' ids; with the mhvtl
    virtual library (IBM 3573-TL personality), each create and remove of a
    library with four drives leaves four references behind, counted by the
    module's use count in lsmod. With ch not bound the count is unchanged, and
    with this patch applied it is unchanged too.
    
    Drop the reference as soon as the name has been printed, and remove the now
    unused dt[] array. That also removes the array leaked when ch_probe() fails
    after ch_readconfig().
    
    The same leak was reported with an RFC patch in 2022, which was not merged.
    
    Fixes: daa6eda65a53 ("[SCSI] add scsi changer driver")
    Cc: [email protected]
    Link: https://lore.kernel.org/linux-scsi/[email protected]/
    Signed-off-by: Ahmed Abdelhaleem Ahmed <[email protected]>
    Reviewed-by: Laurence Oberman <[email protected]>
    Fixes: daa6eda65a53 ("[SCSI] add scsi changer driver")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ sashal: Adapted the allocation-removal hunk for kcalloc() instead of kzalloc_objs(). ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: libiscsi: Reject a negative task index from parse_pdu_itt [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Oct 7 10:58:40 2026 +0900

    scsi: libiscsi: Reject a negative task index from parse_pdu_itt
    
    commit 8ee2a09a1dbb257c9e828ad2497f8e4832dfb142 upstream.
    
    A transport that implements parse_pdu_itt hands libiscsi an index taken
    from the PDU, and both lookups bound it from above only:
    
          if (i >= session->cmds_max)
    
    i and cmds_max are both int, so a negative index passes and
    session->cmds[i] is read from before the array.
    
    be2iscsi produces one. beiscsi_parse_pdu() assigns the raw tag,
    
          *index = (int)itt;
    
    and beiscsi_complete_pdu() forwards an unsolicited NOP-In from the
    hardware async ring without replacing its ITT, so the value is the
    target's. It also reports the session's own age rather than the one in
    the tag, which leaves the age comparison in iscsi_verify_itt() with
    nothing to reject.
    
    Bound the index from below in both lookups.
    
    Fixes: bfead3b2cb46 ("[SCSI] be2iscsi: Adding msix and mcc_rings V3")
    Cc: [email protected]
    Reviewed-by: Mike Christie <[email protected]>
    Signed-off-by: Yehyeong Lee <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: libiscsi: Validate the ITT reflected in a Reject PDU [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Oct 7 10:58:41 2026 +0900

    scsi: libiscsi: Validate the ITT reflected in a Reject PDU
    
    commit c5958c770b2a0ee492414e26b07da9164a0d1f5d upstream.
    
    A Reject PDU carries a copy of the header it rejects, and
    iscsi_handle_reject() takes the ITT out of that copy to find the task to
    clean up:
    
          memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr));
          ...
          task = iscsi_itt_to_task(conn, rejected_pdu.itt);
    
    That value is whatever the target put there. iscsi_itt_to_task() bounds
    the index against cmds_max and checks nothing else, so any task in the
    pool can be named, and iscsi_nop_out_rsp() then completes it.
    
    An index that has never been used gives a NULL task->conn: the pool is
    zeroed at session setup and conn is assigned only when a task is
    allocated. If the task was used and returned, iscsi_complete_task() hits
    its WARN_ON_ONCE(task->state == ISCSI_TASK_FREE) and the refcount
    underflows. An in-flight SCSI command is completed as successful - a 1
    MiB read returned 1048576 with none of its buffer written and no
    warning.
    
    Validate the reflected ITT the way iscsi_itt_to_ctask() validates a
    command ITT, and require the task to be in flight and not a SCSI
    command.
    
    [    6.248477] Oops: general protection fault, probably for non-canonical address 0xdffffc000000000c: 0000 [#1] SMP KASAN NOPTI
    [    6.249357] KASAN: null-ptr-deref in range [0x0000000000000060-0x0000000000000067]
    [    6.249951] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 7.2.0-rc5-ISCSI1-gf5098b6bae76 #1 PREEMPT(lazy)
    [    6.250718] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    [    6.251616] RIP: 0010:iscsi_nop_out_rsp.constprop.0+0x46/0x160
    [    6.252043] Code: c1 ea 03 48 83 ec 08 80 3c 02 00 0f 85 f5 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 8b 6b 58 48 8d 7d 60 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c0 00 00 00 48 8b 45 60 48 39 c3 74 50 48 b8 00
    [    6.252813] RSP: 0018:ffff88806c907b80 EFLAGS: 00010206
    [    6.253042] RAX: dffffc0000000000 RBX: ffff88800607e000 RCX: ffffffff8d571a25
    [    6.253345] RDX: 000000000000000c RSI: ffff88806c907c38 RDI: 0000000000000060
    [    6.253642] RBP: 0000000000000000 R08: 0000000000000000 R09: fffffbfff235a504
    [    6.253947] R10: 0000000000000003 R11: 7463656e6e6f6320 R12: 0000000000000000
    [    6.254251] R13: 0000000000000000 R14: ffff88806c907c38 R15: 0000000000000000
    [    6.254549] FS:  0000000000000000(0000) GS:ffff8880d95bc000(0000) knlGS:0000000000000000
    [    6.254887] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    6.255140] CR2: 00007fc393e8ffc0 CR3: 0000000005252006 CR4: 0000000000770ef0
    [    6.255439] PKRU: 55555554
    [    6.255564] Call Trace:
    [    6.255674]  <IRQ>
    [    6.255768]  __iscsi_complete_pdu+0x18bf/0x22a0
    [    6.256733]  iscsi_complete_pdu+0x54/0xa0
    [    6.256905]  iscsi_tcp_data_recv_done+0xf4/0x250
    [    6.257103]  iscsi_tcp_recv_skb+0x31e/0xec0
    [    6.257680]  iscsi_sw_tcp_recv+0x12f/0x390
    [    6.258061]  __tcp_read_sock+0x1ab/0x810
    [    6.258853]  iscsi_sw_tcp_data_ready+0x18b/0x510
    [    6.259808]  tcp_data_queue+0x1f13/0x4cd0
    [    6.260567]  tcp_rcv_established+0x8a5/0x3a00
    [    6.261931]  tcp_v4_do_rcv+0x449/0x960
    [    6.262269]  tcp_v4_rcv+0x2245/0x3bc0
    
    Fixes: 8afa1439fcff ("[SCSI] libiscsi: handle immediate command rejections")
    Cc: [email protected]
    Reviewed-by: Mike Christie <[email protected]>
    Signed-off-by: Yehyeong Lee <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: libiscsi: Validate the task named by a management response [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Oct 7 10:58:42 2026 +0900

    scsi: libiscsi: Validate the task named by a management response
    
    commit 11bffcd9cb346732eab2914ef44fe777a3f0b585 upstream.
    
    __iscsi_complete_pdu() fetches the task for five response types from one
    place and checks only that the index resolved:
    
          case ISCSI_OP_LOGOUT_RSP:
          case ISCSI_OP_LOGIN_RSP:
          case ISCSI_OP_TEXT_RSP:
          case ISCSI_OP_SCSI_TMFUNC_RSP:
          case ISCSI_OP_NOOP_IN:
                  task = iscsi_itt_to_task(conn, hdr->itt);
                  if (!task)
                          return ISCSI_ERR_BAD_ITT;
    
    iscsi_itt_to_task() bounds the index against cmds_max and looks at
    nothing else, so a target can name any slot in the pool, including one
    that has never been used. task->conn is then NULL, and both
    iscsi_nop_out_rsp() and iscsi_complete_task() dereference it. One
    unsolicited NOP-In is enough; a Text Response carrying the same ITT
    crashes in iscsi_complete_task() instead.
    
    Require the task to be in flight and not a SCSI command, the way
    iscsi_itt_to_ctask() does for the command opcodes.
    
    [    6.298634] Oops: general protection fault, probably for non-canonical address 0xdffffc000000000c: 0000 [#1] SMP KASAN NOPTI
    [    6.298642] KASAN: null-ptr-deref in range [0x0000000000000060-0x0000000000000067]
    [    6.298652] CPU: 1 UID: 0 PID: 111 Comm: iscsistart Not tainted 7.2.0-rc5-ISCSI1-gf5098b6bae76 #1 PREEMPT(lazy)
    [    6.298654] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    [    6.298656] RIP: 0010:iscsi_nop_out_rsp.constprop.0+0x46/0x160
    [    6.298691] Code: c1 ea 03 48 83 ec 08 80 3c 02 00 0f 85 f5 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 8b 6b 58 48 8d 7d 60 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c0 00 00 00 48 8b 45 60 48 39 c3 74 50 48 b8 00
    [    6.298698] RSP: 0018:ffff88806c907be8 EFLAGS: 00010206
    [    6.298701] RAX: dffffc0000000000 RBX: ffff888006116800 RCX: 0000000000000020
    [    6.298702] RDX: 000000000000000c RSI: ffff88800525d578 RDI: 0000000000000060
    [    6.298703] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
    [    6.298706] R10: 0000000000000020 R11: 0000000000000000 R12: 0000000000000000
    [    6.298706] R13: 000000000000002e R14: ffff8880056eb440 R15: ffff888006116800
    [    6.298707] FS:  00007fc02d1c2740(0000) GS:ffff8880b29bc000(0000) knlGS:0000000000000000
    [    6.298710] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    6.298711] CR2: 000055fe3b56ddf8 CR3: 00000000053b9004 CR4: 0000000000770ef0
    [    6.298712] PKRU: 55555554
    [    6.298713] Call Trace:
    [    6.298714]  <IRQ>
    [    6.298714]  __iscsi_complete_pdu+0x13a8/0x22a0
    [    6.298758]  iscsi_complete_pdu+0x54/0xa0
    [    6.298759]  iscsi_tcp_hdr_recv_done+0x870/0x2c80
    [    6.298778]  iscsi_tcp_recv_skb+0x31e/0xec0
    [    6.298800]  iscsi_sw_tcp_recv+0x12f/0x390
    [    6.298804]  __tcp_read_sock+0x1ab/0x810
    [    6.298812]  iscsi_sw_tcp_data_ready+0x18b/0x510
    [    6.298814]  tcp_rcv_established+0x1f56/0x3a00
    [    6.298842]  tcp_v4_do_rcv+0x449/0x960
    [    6.298847]  tcp_v4_rcv+0x2245/0x3bc0
    
    Fixes: 7996a778ff8c ("[SCSI] iscsi: add libiscsi")
    Cc: [email protected]
    Reviewed-by: Mike Christie <[email protected]>
    Signed-off-by: Yehyeong Lee <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: qedi: Initialize callback state before registration [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Thu Sep 10 17:24:05 2026 +0800

    scsi: qedi: Initialize callback state before registration
    
    commit 85de8b3a5eaa23d153aff4c7c83dddbc949064c9 upstream.
    
    qedi_get_protocol_tlv_data() can be called asynchronously by QED after
    qedi_ops->register_ops(). It takes stats_lock and reads ll2_mtu, but
    __qedi_probe() currently registers the callback before initializing the
    mutex and assigning the default MTU on the normal probe path.
    
    Initialize the callback-visible state before registering qedi_cb_ops. Keep
    the recovery path from reinitializing state because it reuses the existing
    qedi context.
    
    Fixes: 3cc5746e5ad7 ("scsi: qedi: Initialize the stats mutex lock")
    Cc: [email protected]
    Assisted-by: LLM Codex
    Signed-off-by: Runyu Xiao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: qla2xxx: Fix 64G link speed reporting in get_data_rate [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 13:58:17 2026 -0400

    scsi: qla2xxx: Fix 64G link speed reporting in get_data_rate
    
    [ Upstream commit 52fba32317ee631faa878725b2f7cd5c08acacd3 ]
    
    qla2x00_get_data_rate() skips updating ha->link_data_rate when the
    firmware returns mcp->mb[1] == 0x7.  That value was a legacy sentinel
    from before 64G hardware existed, but PORT_SPEED_64GB is now defined as
    0x07 and ha->link_data_rate is decoded with the PORT_SPEED_* encoding.
    On a 64G-capable adapter a genuine 64G link is therefore dropped, and
    the port speed is misreported (port_speed sysfs, fc_host speed, FDMI).
    
    Only 28xx and 29xx support 64G, so accept 0x07 on those adapters while
    keeping the legacy filter for older ones.  Also drop the duplicate copy
    of the check at the end of the success branch; it repeated the first
    assignment with no intervening change.
    
    Fixes: ecc89f25e225 ("scsi: qla2xxx: Add Device ID for ISP28XX")
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ Omitted IS_QLA29XX() checks because this branch lacks 29xx adapter support. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix NVMe abort reference leak on repeated abort [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Thu Jul 30 21:28:29 2026 +0530

    scsi: qla2xxx: Fix NVMe abort reference leak on repeated abort
    
    [ Upstream commit 06b5b2a5d499323f1c3256ead35798e8e3d15e60 ]
    
    qla_nvme_ls_abort() and qla_nvme_fcp_abort() take a command reference with
    kref_get_unless_zero() and then call schedule_work() on priv->abort_work,
    ignoring its return value. qla_nvme_abort_work() runs once and drops
    exactly one reference via kref_put(&sp->cmd_kref, sp->put_fn).
    
    Since the per-abort INIT_WORK() was moved to submission time,
    schedule_work() now returns false when the work is already pending, for
    example on a concurrent transport teardown and timeout-driven abort of
    the same command. In that case the reference taken for the second abort
    is never released because the work still executes only once, leaking a
    reference. The command is then never returned to the NVMe-FC transport,
    which can hang the port.
    
    Drop the reference when schedule_work() returns false, so each
    kref_get_unless_zero() is balanced regardless of whether the work was
    newly queued. The held reference keeps priv->sp valid for the put.
    
    Fixes: 7e85f6dbc856 ("scsi: qla2xxx: Initialize NVMe abort_work once at submission")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 11:33:26 2026 -0400

    scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking
    
    [ Upstream commit 34a40e0dff940ac5eba494a69b553ea571e24873 ]
    
    qla25xx_free_req_que() and qla25xx_free_rsp_que() have two pre-existing
    bugs exposed on the error path of qla25xx_create_{req,rsp}_que():
    
     1. When dma_alloc_coherent() fails during queue creation, the error
        path calls the free function with req->ring / rsp->ring still NULL
        (from kzalloc).  The unconditional dma_free_coherent() with a NULL
        cpu_addr is undefined behavior and can panic.
    
     2. The free functions clear req_qid_map / rsp_qid_map under vport_lock,
        but the create functions protect the same bitmaps with mq_lock.
        This provides no mutual exclusion.  Additionally, the create error
        path clears the bit and releases mq_lock before calling the free
        function, creating a window where another thread can allocate the
        same que_id and have its ha->req_q_map entry clobbered by the
        subsequent lockless NULL assignment in the free function.
    
    Fix by:
    
     - Guarding dma_free_coherent() with a NULL check on the ring pointer.
    
     - Using mq_lock (the lock held by all creators) in the free functions
       to atomically NULL the map entry and clear the bitmap bit.
    
     - Removing the now-redundant clear_bit blocks from the create error
       paths since the free functions handle it atomically.
    
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    
    Backport adaptation for the stable tree: the 29xx IOCB size-selection
    helpers are absent, and queue creation still allocates fixed-size entries.
    Initialize the local req_entry_size and rsp_entry_size values with
    sizeof(request_t) and sizeof(response_t), respectively, so DMA freeing
    continues to match allocation without adding helper functions or 29xx
    support. Retain all NULL-ring guards, mq_lock protection, and removal of
    the premature bitmap clears.
    
    Keep the response-ring cleanup layout used by upstream so target commit
    19788a55cab61d78e33e0914a5a31d27843e8a4a applies unchanged.
    
    Stable-dep-of: 19788a55cab6 ("scsi: qla2xxx: Fix use-after-free of qpair work on queue teardown")
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix soft lockup polling continuation IOCB signature [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 17:15:42 2026 -0400

    scsi: qla2xxx: Fix soft lockup polling continuation IOCB signature
    
    [ Upstream commit d7e3fa7d06bf7fcaac186d3c4d635caac166d36c ]
    
    qla27xx_copy_multiple_pkt() and qla27xx_copy_fpin_pkt() poll
    rsp_q->ring_ptr->signature for RESPONSE_PROCESSED (0xDEADDEAD) to decide
    whether the next continuation IOCB has arrived, spinning on cpu_relax()
    without advancing the ring or decrementing the entry count while it has
    not. response_t::signature lives at byte offset 60, but a continuation
    IOCB (sts_cont_entry_t / struct sts_cont_entry_ext) carries raw FC frame
    payload at that offset (data[56..59]). A received frame whose payload
    bytes happen to equal 0xDEADDEAD is therefore misread as "not yet
    arrived", and the loop spins forever in interrupt/DPC context, causing a
    CPU soft lockup.
    
    The poll is also unnecessary: callers of qla27xx_copy_multiple_pkt()
    (PT_LS4_UNSOL and the NVMe purls path) already gate on
    qla_chk_cont_iocb_avail(), which guarantees all entry_count IOCBs are
    present before copying begins. The sibling helper
    __qla_copy_purex_to_buffer() already drops the signature poll and relies
    on the entry_type == STATUS_CONT_TYPE guard instead.
    
    Remove the signature busy-wait from both helpers, keeping the entry_type
    guard, and gate the FPIN path with qla_chk_cont_iocb_avail() so it defers
    and re-processes on the next interrupt once all continuation IOCBs have
    arrived, mirroring the ELS_AUTH_ELS and PT_LS4_UNSOL arms. With this the
    signature field is never read on a continuation IOCB, eliminating the
    payload-aliasing lockup.
    
    Fixes: 9f2475fe7406 ("scsi: qla2xxx: SAN congestion management implementation")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ made __update_rsp_in() unconditional before the availability check to accommodate 5.15’s conditional producer-pointer reads. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix use-after-free of qpair work on queue teardown [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 11:33:27 2026 -0400

    scsi: qla2xxx: Fix use-after-free of qpair work on queue teardown
    
    [ Upstream commit 19788a55cab61d78e33e0914a5a31d27843e8a4a ]
    
    The response queue MSI-X handler qla2xxx_msix_rsp_q() schedules
    qla_do_work() via queue_work(ha->wq, &qpair->q_work). qla_do_work()
    dereferences the qpair (vha, rsp) and takes qpair->qp_lock.
    
    During teardown, qla2xxx_delete_qpair() deletes the response queue, which
    calls free_irq() in qla25xx_free_rsp_que(), and then frees the queue and
    the qpair. free_irq() waits for running hardirq handlers but does not
    cancel work already placed on ha->wq. A still-pending q_work then runs
    qla_do_work() against the freed qpair and response queue, causing a
    use-after-free. This is especially likely during full adapter teardown,
    where destroy_workqueue(ha->wq) forces pending work to run after the queue
    pairs have been freed.
    
    Flush the work item with cancel_work_sync() in qla25xx_free_rsp_que()
    after free_irq() has released the interrupt (so no new work can be
    queued) and before the response queue and qpair memory are freed (so the
    flushed handler still sees valid memory). Guard on rsp->qpair and ha->wq
    to match the INIT_WORK() condition and avoid operating on an
    uninitialized work_struct.
    
    Fixes: 68ca949cdb04 ("[SCSI] qla2xxx: Add CPU affinity support.")
    Reported-by: Sashiko <[email protected]>
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Initialize NVMe abort_work once at submission [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Thu Jul 23 10:34:08 2026 +0530

    scsi: qla2xxx: Initialize NVMe abort_work once at submission
    
    [ Upstream commit 7e85f6dbc85616de2172bce8eaf84b387a723cd1 ]
    
    qla_nvme_fcp_abort() and qla_nvme_ls_abort() ran INIT_WORK() on
    priv->abort_work immediately before schedule_work(). INIT_WORK()
    reinitializes the work_struct, resetting its list head and clearing the
    pending bit. If an abort is issued more than once for the same command
    (for example, concurrent transport teardown and a timeout-driven abort),
    the second INIT_WORK() reinitializes a work item that is already queued,
    which can corrupt the workqueue list and lead to crashes or a looping
    worker.
    
    Initialize priv->abort_work once at command submission, next to the
    existing per-command spin_lock_init(&priv->cmd_lock), and leave only
    schedule_work() in the abort paths. schedule_work() already does nothing
    when the work item is still pending, so a repeated abort no longer
    disturbs an in-flight work item. The command is not returned to the
    transport until the final kref_put()/release callback runs after
    abort_work has completed, so the work item is idle before priv is reused
    and the single submission-time INIT_WORK() is safe.
    
    Fixes: e473b3074104 ("scsi: qla2xxx: Add FC-NVMe abort processing")
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc() error path [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 13:19:24 2026 -0400

    scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc() error path
    
    [ Upstream commit 6d90f0feb929f6c0f3010f9af4747c7230b75993 ]
    
    When qla2x00_mem_alloc() fails, qla2x00_probe_one() jumps to
    probe_hw_failed and calls qla2x00_mem_free(). Several error labels in
    qla2x00_mem_alloc() freed adapter members (elsrej.c, purex_dma_pool,
    flt, sfp_data, loop_id_map, async_pd, sf_init_cb, ex_init_cb, npiv_info)
    but left the pointers dangling. qla2x00_mem_free() then freed them a
    second time. Worse, for the dma_pool members it issued
    dma_pool_free(ha->s_dma_pool, ...) after s_dma_pool had already been
    destroyed and set to NULL at fail_s_dma_pool, dereferencing a NULL pool.
    
    Clear each freed pointer (and its DMA handle) in the error labels so the
    subsequent qla2x00_mem_free() skips them.
    
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ adapted cleanup changes for missing fail_lsrjt and fail_flt_data blocks. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Quiesce response IRQ before freeing request queue [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 13:52:23 2026 -0400

    scsi: qla2xxx: Quiesce response IRQ before freeing request queue
    
    [ Upstream commit 505753ec2594c6af09a601f0dd60be7d840c1d2d ]
    
    qla2xxx_delete_qpair() deletes the request queue before the response
    queue. qla25xx_delete_req_que() frees the request queue memory
    (kfree(req) in qla25xx_free_req_que()), but the response-queue MSI-X is
    only released later, in qla25xx_free_rsp_que(). In that window the
    response interrupt can still fire, qla2xxx_msix_rsp_q() queues
    qpair->q_work, and qla_do_work() -> qla24xx_process_response_queue()
    dereferences the now-freed rsp->req (LOGINOUT/CT/ELS entries and the
    status path), a use-after-free.
    
    The cancel_work_sync() added for the qpair teardown lives in the
    response free path, which runs after the request queue is already freed,
    so it does not protect rsp->req.
    
    Release the response-queue interrupt and flush qpair->q_work before
    deleting the request queue, so no late completion can reach the freed
    request queue. Clearing have_irq makes the subsequent
    qla25xx_free_rsp_que() skip its free_irq(), and the firmware
    queue-delete order (request then response) is preserved; the
    request-delete mailbox completes on the default vector and is unaffected
    by dropping the qpair response interrupt early.
    
    Fixes: d74595278f4a ("scsi: qla2xxx: Add multiple queue pair functionality.")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ adjusted context due to missing qla_free_buf_pool() call ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Use memset_io() to clear QLAFX00 request ring slot [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 14:01:34 2026 -0400

    scsi: qla2xxx: Use memset_io() to clear QLAFX00 request ring slot
    
    [ Upstream commit 626e44f3d8a924a97a3848a9fd45833947e081e9 ]
    
    For QLAFX00 the request ring is ioremapped device I/O memory
    (ha->iobase + req_que_off), not DMA-coherent RAM, which is why the rest
    of the FX00 path accesses it through memcpy_toio() and the wrt_reg_*
    helpers. __qla2x00_alloc_iocbs() however zeroed the producer slot with a
    plain memset(). On architectures such as ARM64 a regular memset() may
    emit unaligned or block-zeroing instructions (e.g. DC ZVA) that are
    invalid on Device memory, leading to a synchronous external abort.
    
    Use memset_io() to clear the slot for QLAFX00, matching the I/O
    accessors used elsewhere on this ring. Other adapters keep the plain
    memset() on their DMA-coherent rings. The zero-fill is retained for FX00
    because its IOCB builders (e.g. qlafx00_fxdisc_iocb()) copy only part of
    the entry and rely on the unused tail being pre-zeroed.
    
    Fixes: 8ae6d9c7eb10 ("[SCSI] qla2xxx: Enhancements to support ISPFx00.")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ replaced qla_req_ring_slot() and qla_req_entry_size() with req->ring_ptr and REQUEST_ENTRY_SIZE. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Validate BSG request_len before reading vendor_cmd[] [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 14:31:49 2026 -0400

    scsi: qla2xxx: Validate BSG request_len before reading vendor_cmd[]
    
    [ Upstream commit 4cf38dd9465736141263ebb63375868311a0ec81 ]
    
    The FC BSG transport allocates job->request via memdup_user() using the
    exact user-supplied request_len. For FC_BSG_HST_VENDOR,
    fc_bsg_host_dispatch() only guarantees request_len covers msgcode and
    vendor_id; it does not account for the vendor_cmd[] flexible array.
    
    qla2xxx then reads the command selector vendor_cmd[0] and, in several
    sub-handlers, vendor_cmd[1]/[2] or structures overlaid on the vendor
    command area without verifying request_len. A caller holding
    CAP_SYS_RAWIO can submit a short request whose vendor_id matches the
    host, triggering out-of-bounds heap reads (KASAN-detectable, and able to
    mis-select a command or panic).
    
    Add a central guard in qla2x00_process_vendor_specific() so the selector
    is always in bounds, restrict the early vendor_cmd[0] read in
    qla24xx_bsg_request() to sufficiently long vendor messages, and add
    request_len checks to the sub-handlers that read further:
    qla24xx_proc_fcp_prio_cfg_cmd(), qla2x00_process_loopback(),
    qla84xx_reset(), qla84xx_updatefw(), qla2x00_read_optrom(),
    qla2x00_update_optrom(), qlafx00_mgmt_cmd() and
    qla28xx_validate_flash_image().
    
    Fixes: 01e0e15c8b3b ("scsi: don't use fc_bsg_job::request and fc_bsg_job::reply directly")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ adapted hunks to the existing OPTROM helper and absence of qla28xx_validate_flash_image(). ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Zero dport diagnostics buffer to avoid info leak [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 11:28:36 2026 -0400

    scsi: qla2xxx: Zero dport diagnostics buffer to avoid info leak
    
    [ Upstream commit a152edab3854f01dd2daf3eaf8f32cbabdb3834e ]
    
    qla2x00_do_dport_diagnostics() allocates the qla_dport_diag response
    buffer with kmalloc_obj() (non-zeroing) and, on success, copies the full
    sizeof(*dd) back to user space via sg_copy_from_buffer(). The inbound
    sg_copy_to_buffer() only fills as many bytes as the user request payload
    provides, and qla26xx_dport_diagnostics() zeroes only dd->buf. The
    options and unused[] fields are therefore copied out uninitialized,
    leaking kernel heap contents to user space.
    
    Allocate with kzalloc_obj(), matching qla2x00_do_dport_diagnostics_v2().
    
    Fixes: ec89146215d1 ("qla2xxx: Add bsg interface to support D_Port Diagnostics.")
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ Adapted kzalloc_obj(*dd) to kzalloc(sizeof(*dd), GFP_KERNEL) to match the branch’s allocation syntax. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: st: Fix use-after-free race between st_remove() and st_open() [+ + +]
Author: Laurence Oberman <[email protected]>
Date:   Wed Oct 21 11:55:26 2026 -0400

    scsi: st: Fix use-after-free race between st_remove() and st_open()
    
    commit 71caf7f84bd62a4bf91cc95abd2de690afb8d15f upstream.
    
    st_remove() drops the probe reference on the scsi_tape with kref_put()
    and only afterwards removes its index from st_index_idr. If that was the
    last reference, scsi_tape_release() frees the structure while it is
    still published in the idr.
    
    scsi_tape_get(), called from st_open(), looks up the tape in
    st_index_idr and takes a reference under st_ref_mutex and
    st_index_lock. remove_cdevs() does not wait for opens that are already
    past chrdev_open(), so an open that is blocked on st_ref_mutex while
    st_remove() holds it can take the mutex as soon as st_remove() drops it,
    find the freed tpnt in the idr and call kref_get() on it:
    
      BUG: KASAN: slab-use-after-free in st_open
      Write of size 4 ...
       st_open (drivers/scsi/st.c:254 drivers/scsi/st.c:1291)
       chrdev_open
      ...
      Freed by task ...:
       kfree
       st_remove (drivers/scsi/st.c:4512)
    
    Remove the index from the idr before dropping the reference, all under
    st_ref_mutex. A concurrent scsi_tape_get() now either runs first and
    holds a valid reference that keeps the tape alive, or runs afterwards
    and finds nothing, so st_open() fails with -ENXIO.
    
    This restores the ordering st_remove() had before the conversion to
    st_index_idr, where the tape was unpublished from scsi_tapes[] before
    the final kref_put().
    
    Fixes: 6c648d95a6af ("[SCSI] st: get rid of scsi_tapes array")
    Cc: [email protected]
    Reported-by: Dingisoul <[email protected]>
    Closes: https://lore.kernel.org/linux-scsi/[email protected]/
    Tested-by: Dingisoul <[email protected]>
    Signed-off-by: Laurence Oberman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ loberman: st_remove() still returns int in 5.15; context adjusted ]
    Signed-off-by: Laurence Oberman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: st: Save the visited block for the partition the drive is in [+ + +]
Author: Laurence Oberman <[email protected]>
Date:   Tue Oct 6 12:42:50 2026 -0400

    scsi: st: Save the visited block for the partition the drive is in
    
    [ Upstream commit c9e9f024dd4f61f0f6636c9f2ed0830f87060e11 ]
    
    set_location() saves the current tape location before switching
    partitions, so that switch_partition() can return to it later. It reads
    the location with READ POSITION but stores it in the st_partstat of
    STp->partition, ignoring the partition the drive reports.
    
    The two differ after a device reset. When the reset is recovered with
    MTREW, MTSEEK or MTEOM, st_ioctl() sets STp->partition = 0 and calls
    switch_partition() to return to STp->new_partition. A drive that was in
    partition 1 is still there, so set_location() files the partition 1
    position under partition 0. The next switch to partition 0 locates to
    that block: if partition 0 holds less data, MTSETPART fails with EIO
    (BLANK CHECK), otherwise the tape is silently positioned at the wrong
    block.
    
    IBM ULTRIUM-TD5 (LTO-5), LU reset in partition 1 at block 1025:
    
      st 12:0:0:0: [st0] Visited block 1025 for partition 0 saved.
      ...
      st 12:0:0:0: [st0] Setting block to 1025 and partition to 0.
      st 12:0:0:0: [st0] Error: 402, cmd: 2b 2 0 0 0 4
      st 12:0:0:0: [st0] Sense Key : Blank Check [current]
      st 12:0:0:0: [st0] Add. Sense: End-of-data detected
    
    Store the location in the st_partstat of the partition reported by READ
    POSITION. With the fix:
    
      st 12:0:0:0: [st0] Visited block 1025 for partition 1 saved.
    
    This is a pre-existing issue. It was not caught when testing the recent
    st reset series because the partition test was only run on scsi_debug:
    on the LTO drive it was skipped, since can-partitions is off in the test
    harness's stinit.conf, as is normal for LTO. scsi_debug hides the
    problem because its emulated tape returns to the beginning of partition
    0 on an LU reset. It was found while validating a backport of that
    series to RHEL 9.8, when the partition tests were run on real hardware
    with can-partitions enabled. The same failure then reproduced on
    unmodified RHEL 9.8 and on upstream, and the fix makes the test pass on
    v7.3-rc3 and RHEL 9.8 with an LTO-5.
    
    The harness (https://gitlab.com/loberman/tapetest, test X03) now refuses
    to silently skip the partition tests on hardware.
    
    Fixes: 7081dc75df79 ("scsi: st: Restore some drive settings after reset")
    Assisted-by: Claude
    Signed-off-by: Laurence Oberman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: target: iscsi: Fix race in discovery auth updates [+ + +]
Author: Linfeng Sun <[email protected]>
Date:   Tue Aug 11 20:48:43 2026 +0800

    scsi: target: iscsi: Fix race in discovery auth updates
    
    [ Upstream commit e15b81f602edbdee39c335546f25486a1747f3f0 ]
    
    Separate configfs opens can concurrently update the discovery AuthMethod
    parameter. Both callers may free the same value in
    iscsi_update_param_value(), causing a double-free.
    
    Protect the lookup and replacement with the discovery TPG access lock,
    as used by the other TPG configfs parameter updates.
    
    Fixes: e48354ce078c ("iscsi-target: Add iSCSI fabric support for target v4.1")
    Signed-off-by: Linfeng Sun <[email protected]>
    Reviewed-by: Mike Christie <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
sctp: check RCV_SHUTDOWN after the sendmsg connect wait [+ + +]
Author: Jun Yang <[email protected]>
Date:   Sat Sep 26 17:55:15 2026 +0800

    sctp: check RCV_SHUTDOWN after the sendmsg connect wait
    
    commit 4f1da630d13de0370e2f6361f961f1c8b384af1c upstream.
    
    sctp_wait_for_connect() drops the socket lock while it sleeps. An
    out-of-the-blue ABORT can then be processed from the socket backlog and
    unlink the association. If a concurrent shutdown(fd, SHUT_RD) sets
    RCV_SHUTDOWN, the waiter breaks with err == 0 before checking
    asoc->base.dead. Its final sctp_association_put() can then free the
    association, leaving sctp_sendmsg_to_asoc() to continue with a dangling
    pointer.
    
    Check RCV_SHUTDOWN along with the wait error in sctp_sendmsg_to_asoc()
    before using the association again. The check only accesses the socket,
    so it needs no additional association reference. Return the existing
    -ESRCH so that sctp_sendmsg() skips freeing a new association that may
    already have been destroyed.
    
    Keep sctp_wait_for_connect() unchanged to preserve its behavior for the
    connect() caller.
    
    Fixes: 668c9beb9020 ("sctp: implement assign_number for sctp_stream_interleave")
    Cc: [email protected]
    Reported-by: TencentOS Corvus AI <[email protected]>
    Signed-off-by: Jun Yang <[email protected]>
    Acked-by: Xin Long <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

sctp: copy zeroed stats to user in sctp_getsockopt_pr_streamstatus() when !streamoute [+ + +]
Author: Hui Peng <[email protected]>
Date:   Wed Sep 30 04:46:11 2026 +0000

    sctp: copy zeroed stats to user in sctp_getsockopt_pr_streamstatus() when !streamoute
    
    commit 538b529509c7ab0d909cb65bb7264edca1788d30 upstream.
    
    When an SCTP stream output extension structure (streamoute) has not yet
    been allocated, sctp_getsockopt_pr_streamstatus() sets the local stack
    variables params.sprstat_abandoned_unsent = 0 and
    params.sprstat_abandoned_sent = 0, but then immediately jumps to 'out:',
    bypassing copy_to_user(). As a result, when an uninitialized user buffer
    is passed to getsockopt(SCTP_PR_STREAM_STATUS), the kernel returns
    success (0) without copying the zeroed stats back to user space, leaving
    uninitialized data in the user buffer.
    
    Refactor the !streamoute check into an if-else chain so that when
    streamoute is NULL, params is zeroed and falls through to copy_to_user(),
    copying the zeroed stats to user space and setting retval = 0 once before
    returning.
    
    Tested in QEMU against Linux 7.3.0-rc3 using an uninitialized
    sctp_prstatus user struct passed to getsockopt(SCTP_PR_STREAM_STATUS) on a
    freshly created stream: on the unfixed kernel the user struct contains
    uninitialized stack garbage; whereas with this fix applied, getsockopt()
    copies zeroed stats into user space and returns 0.
    
    Cc: [email protected]
    Reviewed-by: Xin Long <[email protected]>
    Signed-off-by: Hui Peng <[email protected]>
    Fixes: f952be79cebd ("sctp: introduce struct sctp_stream_out_ext")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

sctp: revalidate output stream after association connect wait [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Wed Oct 7 12:57:39 2026 +0900

    sctp: revalidate output stream after association connect wait
    
    commit b7ad72414c673ce1fa1f463e807cd4f34f8be9bf upstream.
    
    When message interleaving is enabled, the first send waits for association
    establishment before building its data chunks.  The wait drops the socket
    lock, and handshake processing can reduce the output stream count to the
    peer-advertised inbound stream count.  sctp_stream_init() then frees the
    extension of every removed stream.
    
    The sender resumes with the stream that it checked before the wait.  If the
    peer removed that stream, sctp_outq_tail() later dereferences its NULL
    extension.  Fatal-oops policies then panic the host.
    
    KASAN: null-ptr-deref in range [0x38-0x3f]
    RIP: sctp_outq_tail+0x49e/0xaa0
    Call Trace:
     sctp_primitive_SEND
     sctp_sendmsg_to_asoc
     sctp_sendmsg
    
    A range check alone is insufficient.  Stream reconfiguration can grow the
    output count again while the lock is released without recreating extensions
    freed by the earlier shrink.  The stream can then be in range while its
    extension remains NULL.  The send-buffer wait has the same issue.
    
    Factor the range and extension checks into a helper and repeat both after
    each send-path wait that drops the socket lock.  Once the lock is
    reacquired, the validation remains stable through data creation and
    queueing.
    
    If validation fails after the connect wait, the auto-created association is
    already established.  Return ESRCH so the existing caller path keeps it
    under state-machine ownership instead of freeing it directly, which would
    leave protocol, counter and socket state inconsistent.
    
    Fixes: 668c9beb9020 ("sctp: implement assign_number for sctp_stream_interleave")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <[email protected]>
    Acked-by: Xin Long <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

sctp: validate chunk length in the inqueue parser [+ + +]
Author: Charles Vosburgh <[email protected]>
Date:   Thu Aug 27 17:32:53 2026 -0400

    sctp: validate chunk length in the inqueue parser
    
    commit 6cfc1b90cb86f4aabc69fb8e30128e07e2cdfa3a upstream.
    
    SCTP chunks always include a four-byte generic header, but
    sctp_inq_pop() currently accepts shorter declared lengths. A zero-length
    chunk leaves chunk_end at the current header.
    
    When ASCONF is covered by the association's SCTP-AUTH policy,
    sctp_assoc_bh_rcv() can continue before the state machine performs its
    normal chunk-length check. sctp_inq_pop() then returns the same malformed
    chunk repeatedly and the receive softirq can lock up.
    
    A remote SCTP peer can trigger this after establishing an association on
    a kernel built with CONFIG_IP_SCTP and configured with
    net.sctp.addip_enable=1 and net.sctp.auth_enable=1. The reproducer did
    not require application credentials, a shared SCTP AUTH key, or
    net.sctp.addip_noauth_enable=1.
    
    On commit f967455fb2a5 ("seg6: reset IP6CB after IPv6 decapsulation"),
    one zero-length ASCONF caused repeated
    watchdog soft-lockup reports in a two-vCPU KVM guest. All 3 pre-trigger
    health probes succeeded, while 36 of 37 post-trigger probes failed. With
    this change, all 37 post-trigger probes succeeded and no equivalent
    soft-lockup signature appeared.
    
    Reject chunks shorter than the generic SCTP header at the shared inqueue
    parser boundary. Mark the packet for discard before either caller can
    continue processing it, while preserving the four-byte generic minimum.
    Declared-length 1 through 4 controls and kernel-generated ASCONF traffic
    remained healthy. The patched sctp_hello selftest passed for IPv4 and
    IPv6.
    
    The complete private reproducer and validation evidence are available
    directly to maintainers on request.
    
    Fixes: bbd0d59809f9 ("[SCTP]: Implement the receive and verification of AUTH chunk")
    Cc: [email protected]
    Signed-off-by: Charles Vosburgh <[email protected]>
    Acked-by: Xin Long <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
security/keys: fix missed RCU read section on lookup [+ + +]
Author: Linus Torvalds <[email protected]>
Date:   Tue Oct 20 22:16:42 2026 +0200

    security/keys: fix missed RCU read section on lookup
    
    commit 43a1e3744548e6fd85873e6fb43e293eb4010694 upstream.
    
    Nicholas Carlini reports that the keyring code calls assoc_array_find()
    in find_key_to_update() without holding the RCU read lock, while the
    assoc_array_gc() code really is designed around removing the node from
    the tree and then freeing it after an RCU grace-period.
    
    The regular key handling doesn't see this because holding the keyring
    semaphore hides any lifetime issues, but the persistent key handling
    uses a different model.
    
    Instead of extending the keyring locking, just do the simple RCU locking
    that the assoc_array was designed for.
    
    [ Moved the guard at the top of the function to solve a compilation
    issue ]
    
    Reported-by: Nicholas Carlini <[email protected]>
    Cc: David Howells <[email protected]>
    Cc: Jarkko Sakkinen <[email protected]>
    Cc: Paul Moore <[email protected]>
    Cc: James Morris James Morris <[email protected]>
    Cc: Serge E. Hallyn <[email protected]>
    Signed-off-by: Linus Torvalds <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
selinux: fix data race on AVC latest_notif [+ + +]
Author: Christian Göttsche <[email protected]>
Date:   Mon Oct 12 10:32:37 2026 -0400

    selinux: fix data race on AVC latest_notif
    
    [ Upstream commit 1ca924044bf0de879a1648be93a56939652267d3 ]
    
    avc_policy_seqno() reads latest_notif without holding notif_lock, while
    avc_latest_notif_update() can update it under that lock. KCSAN reports
    these concurrent accesses during policy boolean updates and permission
    checks.
    
    Use READ_ONCE() for the lockless read and WRITE_ONCE() for the update.
    The spinlock continues to serialize the comparison and update against
    other writers. Reads made while holding notif_lock cannot race with a
    writer and can remain plain accesses.
    
    This marks both sides of the intentional concurrent access and constrains
    compiler transformations, without suppressing checking with data_race().
    
    Cc: [email protected]
    Fixes: 788e7dd4c22e ("SELinux: Improve read/write performance")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=a7f7cb0737bd91aa698c
    Signed-off-by: Christian Göttsche <[email protected]>
    Acked-by: Stephen Smalley <[email protected]>
    Signed-off-by: Paul Moore <[email protected]>
    [ sashal: Adapted global selinux_avc accesses to use avc and state->avc pointers. ]
    Signed-off-by: Sasha Levin <[email protected]>

selinux: preserve NATIVE_LABELS on already-initialized sb in set_mnt_opts [+ + +]
Author: Stephen Smalley <[email protected]>
Date:   Mon Sep 28 10:19:17 2026 -0400

    selinux: preserve NATIVE_LABELS on already-initialized sb in set_mnt_opts
    
    commit 28b7260548af3d35773477993ad4e4de41578dd7 upstream.
    
    When an NFSv4 filesystem exported with security_label is mounted a
    second time, sget_fc() returns the existing superblock and
    nfs_get_root() calls security_sb_set_mnt_opts() again on it. Since the
    superblock is already SB_INITIALIZED, selinux_set_mnt_opts() takes an
    early exit without setting SECURITY_LSM_NATIVE_LABELS in
    *set_kern_flags. nfs_get_root() then sees kflags without
    SECURITY_LSM_NATIVE_LABELS set and clears NFS_CAP_SECURITY_LABEL on
    the shared nfs_server, silently disabling per-file labeling for both
    the new and the original mount.
    
    Commit 3815a245b501 ("security/selinux: fix SECURITY_LSM_NATIVE_LABELS
    on reused superblock") fixed the same problem in
    selinux_sb_clone_mnt_opts().  The reused-superblock path for a plain
    second mount now goes through sb_set_mnt_opts rather than
    sb_clone_mnt_opts, so it needs the same treatment: on both
    SE_SBINITIALIZED early exits, set SECURITY_LSM_NATIVE_LABELS in
    *set_kern_flags when the superblock was already using
    SECURITY_FS_USE_NATVE.
    
    Cc: [email protected]
    Closes: https://github.com/SELinuxProject/selinux-kernel/issues/69
    Closes: https://github.com/SELinuxProject/selinux-kernel/issues/70
    Closes: https://github.com/SELinuxProject/selinux-testsuite/issues/91
    Closes: https://github.com/SELinuxProject/selinux-testsuite/issues/92
    Fixes: eb9ae686507b ("SELinux: Add new labeling type native labels")
    Signed-off-by: Stephen Smalley <[email protected]>
    Signed-off-by: Paul Moore <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
serial: 8250_bcm7271: fix use-after-free in brcmuart_remove() [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 08:40:02 2026 +0000

    serial: 8250_bcm7271: fix use-after-free in brcmuart_remove()
    
    commit 189b9dc8c96ec9486482f27c1372b04a7152175e upstream.
    
    brcmuart_handle_irq() starts priv->hrt to work around a receive-timeout
    quirk of the 8250 core when hardware flow control is enabled; the timer
    callback brcmuart_hrtimer_func() dereferences priv.
    
    brcmuart_remove() cancels the hrtimer before it unregisters the port, so
    a receive-timeout interrupt that arrives in between re-arms the timer.
    After devm frees priv, the callback runs on freed memory.
    
    Unregister the port before cancelling the hrtimer.
    serial8250_unregister_port() shuts the port down and frees its IRQ, so
    brcmuart_handle_irq() can no longer restart the timer, and the final
    hrtimer_cancel() drains any timer that was armed before or during the
    unregister.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 41a469482de2 ("serial: 8250: Add new 8250-core based Broadcom STB driver")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Reviewed-by: Florian Fainelli <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

serial: fix TIOCMIWAIT race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 20:09:57 2026 -0400

    serial: fix TIOCMIWAIT race
    
    [ Upstream commit 40adffec8c0090533dfaa863ced7901b60bbf1dc ]
    
    The task state must be updated before checking the wakeup condition to
    avoid missing a racing modem status update.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: [email protected]
    Link: https://lore.kernel.org/r/[email protected]
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adjusted context for direct spin_lock_irq() and spin_unlock_irq() calls. ]
    Signed-off-by: Sasha Levin <[email protected]>

serial: imx: Convert to platform remove callback returning void [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Fri Sep 4 09:18:39 2026 -0400

    serial: imx: Convert to platform remove callback returning void
    
    [ Upstream commit c066f87314b7fbbf4d72d38957436a98e7b7e503 ]
    
    The .remove() callback for a platform driver returns an int which makes
    many driver authors wrongly assume it's possible to do error handling by
    returning an error code. However the value returned is ignored (apart
    from emitting a warning) and this typically results in resource leaks.
    
    To improve here there is a quest to make the remove callback return
    void. In the first step of this quest all drivers are converted to
    .remove_new(), which already returns void. Eventually after all drivers
    are converted, .remove_new() will be renamed to .remove().
    
    Trivially convert this driver from always returning zero in the remove
    callback to the void returning variant.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 8b0b29fdcb47 ("serial: imx: serialize imx_uart_ports[] lifetime")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

serial: imx: serialize imx_uart_ports[] lifetime [+ + +]
Author: Karl Mehltretter <[email protected]>
Date:   Fri Sep 4 09:18:40 2026 -0400

    serial: imx: serialize imx_uart_ports[] lifetime
    
    [ Upstream commit 8b0b29fdcb47907ae0296b8fe829e918e05e300f ]
    
    imx_uart_probe() publishes its devm-allocated port in imx_uart_ports[]
    before uart_add_one_port() because console setup uses the table. The entry
    is not cleared when adding the port fails or after removal, leaving a
    dangling pointer.
    
    A sibling probe can register the shared console through that stale entry.
    This was reproduced under KASAN on QEMU mcimx6ul-evk by unbinding a
    sibling UART, unbinding the console UART and rebinding the sibling.
    
    Keep the entry valid through uart_remove_one_port(), then clear it. Protect
    port addition and removal together with their table updates so sibling
    operations cannot interleave. Reject an occupied slot rather than
    clobbering an active port during a duplicate-line probe.
    
    Fixes: dbff4e9ea2e8 ("IMX UART: remove statically initialized tables")
    Fixes: 9f322ad064f9 ("imx: serial: handle initialisation failure correctly")
    Reported-by: Sashiko <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]
    Link: https://lore.kernel.org/all/[email protected]
    Cc: [email protected]
    Assisted-by: Claude:claude-fable-5
    Signed-off-by: Karl Mehltretter <[email protected]>
    Reviewed-by: Frank Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ replaced scoped_guard() with explicit mutex_lock()/mutex_unlock() calls for GNU89 compatibility ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

serial: tegra: don't clear the Tx FIFO on an Rx-only reset [+ + +]
Author: Simon Gassner <[email protected]>
Date:   Thu Oct 1 08:05:39 2026 +0200

    serial: tegra: don't clear the Tx FIFO on an Rx-only reset
    
    commit 8aebfde6e84dceb7d47fe8001e50b754eb45d5df upstream.
    
    tegra_uart_fifo_reset() applies the Tegra30 workaround for
    "cannot clear the Tx FIFO while FIFO mode is enabled"
    unconditionally: it leaves FIFO mode, writes the requested FCR
    clear bits, and re-enters FIFO mode. Leaving FIFO mode empties
    both FIFOs, so an Rx-only reset discards queued Tx data as well.
    
    The break handler in tegra_uart_decode_rx_error() calls it with
    UART_FCR_CLEAR_RCVR only. On a half-duplex RS485 board whose Rx
    line is pulled low while the transceiver drives the bus, every
    transmission raises a spurious break, and all but the first
    character of the frame is lost.
    
    Only take the FIFO-mode path when the caller actually asked for
    CLEAR_XMIT. Likewise only wait for TEMT in that case: with the Tx
    FIFO deliberately left intact, that loop would otherwise spin for
    a full frame time in hard IRQ context with the port lock held.
    
    Tested on a Colibri T30 (Tegra30) with Rx DMA:
    
     - Break during transmission: the reset still fires from
       tegra_uart_decode_rx_error(), and the complete frame now
       reaches the peer. Before this change only the character in
       the shift register was sent.
     - Internal loopback with a generated break: the Rx FIFO is
       correctly cleared by the plain FCR write, and subsequent
       receive works with no frame, parity or overrun errors.
    
    Fixes: e9ea096dd225 ("serial: tegra: add serial driver")
    Cc: [email protected]
    Signed-off-by: Simon Gassner <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

serial: vt8500: Fix clock reference leak in vt8500_serial_probe() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Sep 17 15:58:34 2026 +0000

    serial: vt8500: Fix clock reference leak in vt8500_serial_probe()
    
    commit 9d8955281d9229a899e2041659a59b389027b711 upstream.
    
    of_clk_get() returns a clock with a reference that has to be released
    with clk_put(). If clk_prepare_enable() fails the function returns
    without doing so, leaking the reference.
    
    Add the missing clk_put() on that error path.
    
    Fixes: 12faa35ae5cb ("serial: vt8500: UART uses gated clock rather than 24Mhz reference")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
signal: don't retarget shared signals in a dying thread group [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Mon Sep 21 15:44:54 2026 +0200

    signal: don't retarget shared signals in a dying thread group
    
    commit c0e659511d4f49087da095a95799edb5b775a705 upstream.
    
    If the calling thread has blocked a signal then
    retarget_shared_pending() slingshots a shared pending signal to a
    sibling thread. Today it only skips PF_EXITING threads but not a
    coredumping thread.
    
    But if SIGNAL_GROUP_EXIT is set no thread in the thread-group can
    dequeue such signals anymore as get_signal() sends SIGKILL to every
    thread and prepare_signal() drops any other signal.
    
    exit_signals() also returns early on SIGNAL_GROUP_EXIT. But neither
    sigprocmask() nor the mask restore in sigtimedwait() do.
    
    Say a thread sleeps in sigtimedwait() and a sibling thread crashes. The
    sleeping thread gets woken by the zap call. It restores its mask on the
    way out and retargets a signal that was queued for the coredumping
    process. That means TIF_SIGPENDING is set on the coredumping task which
    zap_threads() had cleared. So a blocking write sees TIF_SIGPENDING and
    truncates the dump.
    
    Stop retargeting signals when SIGNAL_GROUP_EXIT is set and avoid
    needlessly truncating coredumps.
    
    Fixes: e6fa16ab9c1e ("signal: sigprocmask() should do retarget_shared_pending()")
    Cc: [email protected]
    Acked-by: Oleg Nesterov <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
smb/client: pass cifs_open_info_data to SMB2_open() [+ + +]
Author: ChenXiaoSong <[email protected]>
Date:   Wed Sep 30 20:46:35 2026 -0400

    smb/client: pass cifs_open_info_data to SMB2_open()
    
    [ Upstream commit 1f551e407bb49dce0bbd34ed6a499dad69e18020 ]
    
    Let SMB2_open() fill the smb2_file_all_info embedded in cifs_open_info_data
    directly. This removes the temporary smb2_file_all_info copy in
    smb2_open_file().
    
    Signed-off-by: ChenXiaoSong <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    
    [5.15 dependency adaptation]
    The cifs_open_info_data wrapper is absent from this stable tree. Keep the
    existing SMB2_open() argument type and callers, and use the file_info
    alias directly for the supplied smb2_file_all_info buffer. Drop the
    upstream caller and prototype changes instead of importing newer open
    and symlink handling APIs into fs/cifs.
    
    Move the existing success trace after smb2_parse_contexts(), retaining
    the six-argument trace interface in 5.15. Together with the file_info
    alias, this provides the merge context needed by 566820af017e ("smb:
    client: close handle after create-context parsing failure"). No functions
    are added, and the handle-close fix remains in the target commit.
    
    [ sashal: Reduced backport -- upstream 1f551e407bb49 touches 4 file(s), this
      backport carries 1. Not backported here:
      fs/smb/client/link.c
      fs/smb/client/smb2file.c
      fs/smb/client/smb2pdu.c
      fs/smb/client/smb2proto.h
      This note is generated from the file lists only; see the resolution record
      for the reasoning. ]
    
    Stable-dep-of: 566820af017e ("smb: client: close handle after create-context parsing failure")
    Signed-off-by: Sasha Levin <[email protected]>

smb/client: use stack-allocated smb2_file_all_info in smb3_query_mf_symlink() [+ + +]
Author: ChenXiaoSong <[email protected]>
Date:   Wed Sep 30 20:46:34 2026 -0400

    smb/client: use stack-allocated smb2_file_all_info in smb3_query_mf_symlink()
    
    [ Upstream commit fc8789bb57e625e5f32ac57ca2e7d3e7b7fda225 ]
    
    SMB2_open() only fills the fixed fields, so a stack-allocated
    smb2_file_all_info is sufficient here.
    
    Signed-off-by: ChenXiaoSong <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    Stable-dep-of: 566820af017e ("smb: client: close handle after create-context parsing failure")
    Signed-off-by: Sasha Levin <[email protected]>

 
smb3: fix for slab out of bounds on mount to ksmbd [+ + +]
Author: Steve French <[email protected]>
Date:   Mon Oct 12 09:40:55 2026 -0700

    smb3: fix for slab out of bounds on mount to ksmbd
    
    [ Upstream commit 7d34ec36abb84fdfb6632a0f2cbda90379ae21fc ]
    
    With KASAN enabled, it is possible to get a slab out of bounds
    during mount to ksmbd due to missing check in parse_server_interfaces()
    (see below):
    
     BUG: KASAN: slab-out-of-bounds in
     parse_server_interfaces+0x14ee/0x1880 [cifs]
     Read of size 4 at addr ffff8881433dba98 by task mount/9827
    
     CPU: 5 UID: 0 PID: 9827 Comm: mount Tainted: G
     OE       6.16.0-rc2-kasan #2 PREEMPT(voluntary)
     Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
     Hardware name: Dell Inc. Precision Tower 3620/0MWYPT,
     BIOS 2.13.1 06/14/2019
     Call Trace:
      <TASK>
     dump_stack_lvl+0x9f/0xf0
     print_report+0xd1/0x670
     __virt_addr_valid+0x22c/0x430
     ? parse_server_interfaces+0x14ee/0x1880 [cifs]
     ? kasan_complete_mode_report_info+0x2a/0x1f0
     ? parse_server_interfaces+0x14ee/0x1880 [cifs]
       kasan_report+0xd6/0x110
       parse_server_interfaces+0x14ee/0x1880 [cifs]
       __asan_report_load_n_noabort+0x13/0x20
       parse_server_interfaces+0x14ee/0x1880 [cifs]
     ? __pfx_parse_server_interfaces+0x10/0x10 [cifs]
     ? trace_hardirqs_on+0x51/0x60
     SMB3_request_interfaces+0x1ad/0x3f0 [cifs]
     ? __pfx_SMB3_request_interfaces+0x10/0x10 [cifs]
     ? SMB2_tcon+0x23c/0x15d0 [cifs]
     smb3_qfs_tcon+0x173/0x2b0 [cifs]
     ? __pfx_smb3_qfs_tcon+0x10/0x10 [cifs]
     ? cifs_get_tcon+0x105d/0x2120 [cifs]
     ? do_raw_spin_unlock+0x5d/0x200
     ? cifs_get_tcon+0x105d/0x2120 [cifs]
     ? __pfx_smb3_qfs_tcon+0x10/0x10 [cifs]
     cifs_mount_get_tcon+0x369/0xb90 [cifs]
     ? dfs_cache_find+0xe7/0x150 [cifs]
     dfs_mount_share+0x985/0x2970 [cifs]
     ? check_path.constprop.0+0x28/0x50
     ? save_trace+0x54/0x370
     ? __pfx_dfs_mount_share+0x10/0x10 [cifs]
     ? __lock_acquire+0xb82/0x2ba0
     ? __kasan_check_write+0x18/0x20
     cifs_mount+0xbc/0x9e0 [cifs]
     ? __pfx_cifs_mount+0x10/0x10 [cifs]
     ? do_raw_spin_unlock+0x5d/0x200
     ? cifs_setup_cifs_sb+0x29d/0x810 [cifs]
     cifs_smb3_do_mount+0x263/0x1990 [cifs]
    
    Reported-by: Namjae Jeon <[email protected]>
    Tested-by: Namjae Jeon <[email protected]>
    Cc: [email protected]
    Signed-off-by: Steve French <[email protected]>
    (cherry picked from commit 7d34ec36abb84fdfb6632a0f2cbda90379ae21fc)
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb3: make query_on_disk_id open context consistent and move to common code [+ + +]
Author: Steve French <[email protected]>
Date:   Wed Sep 30 13:33:57 2026 -0400

    smb3: make query_on_disk_id open context consistent and move to common code
    
    [ Upstream commit 1149c8467ddebfb6bb9aab37830f70a49cab7085 ]
    
    cifs and ksmbd were using a slightly different version of the query_on_disk_id
    struct which could be confusing. Use the ksmbd version of this struct, and
    move it to common code.
    
    Reviewed-by: Paulo Alcantara (SUSE) <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    
    [5.15 dependency adaptation for 67f4c1c6a1b:
    Keep the create-context declarations in the existing per-subsystem headers.
    This tree has not consolidated create_context into smbfs_common, and ksmbd
    still defines its own SMB2 headers. Moving the response into the common
    header would require unrelated header conversions.
    
    Retain the client response rename and match ksmbd's 16-byte Reserved array,
    without changing the packed wire layout. Leave the ksmbd and common headers
    unchanged and omit the upstream common-header lease comments.
    
    Rename the client's lease-break flag and both existing parser uses to the
    upstream _LE spelling. This is a value-preserving prerequisite for the
    target's lease-parser changes; no functions are added.]
    
    [ sashal: Reduced backport -- upstream 1149c8467ddeb touches 4 file(s), this
      backport carries 3. Not backported here:
      fs/ksmbd/smb2pdu.h
      fs/smbfs_common/smb2pdu.h
      This note is generated from the file lists only; see the resolution record
      for the reasoning. ]
    
    Stable-dep-of: 67f4c1c6a1b5 ("smb: client: fix create context out-of-bounds reads")
    Signed-off-by: Sasha Levin <[email protected]>

 
smb: client: avoid leaking refcount in cifs_queue_oplock_break() [+ + +]
Author: Bjoern Doebel <[email protected]>
Date:   Thu Sep 17 09:11:00 2026 -0400

    smb: client: avoid leaking refcount in cifs_queue_oplock_break()
    
    [ Upstream commit 9f2e63f1b2d5fc5b5423424902c091123e220e7e ]
    
    cifs_queue_oplock_break() unconditionally takes a reference on the
    target file before queueing cifs_oplock_break(). Only that work item
    decreases the reference counter again.
    
    If another oplock break arrives while that work is still queued,
    queue_work() will return false and not queue this second work item. As a
    result, we will never reach the point to drop the file reference again
    and are leaking this reference. This can be triggered when interacting
    with a slow-responding server.
    
    As a result, later unmount operations for this file system will fail with
    
      BUG: Dentry ... still in use (1) [unmount of cifs cifs]
      VFS: Busy inodes after unmount of cifs (cifs)
      kernel BUG at fs/super.c:777!
    
    Fix this by only incrementing the reference count if the work has been
    queued successfully. Taking it after queue_work() is safe because all
    three callers hold tcon->open_file_lock across the call and
    _cifsFileInfo_put() decrements under that same lock, so a worker that
    starts the handler in the window cannot drop the reference before it has
    been taken.
    
    Fixes: b98749cac4a69 ("CIFS: keep FileInfo handle live during oplock break")
    Cc: [email protected]
    Assisted-by: Kiro:claude-opus-5
    Signed-off-by: Bjoern Doebel <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Adjusted the patch path from fs/smb/client/misc.c to fs/cifs/misc.c. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: avoid leaking refcount when cifs_sb_tlink() fails [+ + +]
Author: Bjoern Doebel <[email protected]>
Date:   Thu Sep 17 09:14:57 2026 -0400

    smb: client: avoid leaking refcount when cifs_sb_tlink() fails
    
    [ Upstream commit 23b26f4408ac3f35a482d2e5cf6fc865d4201b71 ]
    
    cifs_oplock_break() takes over the reference that
    cifs_queue_oplock_break() acquired when it queued the work, and drops it
    with _cifsFileInfo_put() once the break has been processed.
    
    Only in setups with "-o multiuser", cifs_sb_tlink() may fail, at which
    point cifs_oplock_break() returns without putting the file reference,
    mirroring the reference leak we already fixed in the companion patch to
    cifs_queue_oplock_break().
    
    This would trigger a crash due to busy inodes on the next unmount:
    
      BUG: Dentry ... still in use (1) [unmount of cifs cifs]
      VFS: Busy inodes after unmount of cifs (cifs)
    
    Drop the reference on that path as well. Doing so before the out label
    mirrors the normal path, which also puts the reference before
    cifs_done_oplock_break().
    
    Found by Sashiko code review. The failure path was not exercised at
    runtime.
    
    Fixes: e8f5f849ffce2 ("cifs: fix potential oops in cifs_oplock_break")
    Cc: [email protected]
    Assisted-by: Kiro:claude-opus-5
    Signed-off-by: Bjoern Doebel <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Changed the target path from fs/smb/client/file.c to fs/cifs/file.c. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: clear setuid/setgid bit on write with cifsacl/modefromsid/posix extensions [+ + +]
Author: Jiangshan Yi <[email protected]>
Date:   Tue Oct 6 16:14:20 2026 +0000

    smb: client: clear setuid/setgid bit on write with cifsacl/modefromsid/posix extensions
    
    [ Upstream commit b8e5dc4f95e5484159b343903f302eb6d783f2e6 ]
    
    When a file has the setuid or setgid bit set and is written to, the VFS
    strips those bits and issues a setattr with ATTR_KILL_SUID/ATTR_KILL_SGID
    together with an ATTR_MODE carrying the already-cleared mode.
    
    Both cifs_setattr_unix() and cifs_setattr_nounix() unconditionally dropped
    ATTR_MODE in that case:
    
            /* skip mode change if it's just for clearing setuid/setgid */
            if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
                    attrs->ia_valid &= ~ATTR_MODE;
    
    This is fine for the default mount, where the mode is only emulated via
    the DOS read-only attribute and cannot represent the setuid/setgid bits
    anyway.  However, with the "cifsacl" or "modefromsid" mount options the
    mode is stored on the server through an ACL (id_mode_to_cifs_acl()), with
    the SMB3.1.1 POSIX extensions the mode is sent to the server directly,
    and with the SMB1 Unix extensions (cifs_setattr_unix) the mode is sent
    via CIFSSMBUnixSetPathInfo().  In all those cases dropping ATTR_MODE means
    the cleared mode is never pushed to the server, so the setuid/setgid bit
    survives the write.
    
    This is a security issue: on local filesystems the setuid bit is stripped
    when a file is written, but over these cifs.ko mounts the bit persists on
    the server, potentially allowing an unexpected privilege escalation on
    subsequent execution.
    
    Fix this in two places:
    
      1. cifs_setattr_nounix(): only take the "skip mode change" shortcut
         when the mode is emulated via the DOS read-only attribute (i.e.
         neither cifsacl/modefromsid nor the SMB3.1.1 POSIX extensions are
         in effect), so that the cleared mode is propagated to the server
         in the ACL / POSIX cases.
    
      2. cifs_setattr_unix(): this function is only called when Unix
         extensions are in effect, so the mode is always stored on the
         server.  Remove the shortcut entirely so that the cleared mode is
         always pushed.
    
    Fixes: d32c4f2626ac ("CIFS: ignore mode change if it's just for clearing setuid/setgid bits")
    Cc: [email protected]
    Signed-off-by: Jiangshan Yi <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Backport note for 5.15: code lives in fs/cifs/inode.c; no sbflags
      local exists here, so test cifs_sb->mnt_cifs_flags directly (same flag
      bits). Drop the upstream posix_extensions clause: 5.15 lacks
      d413eabff18d ("fs/smb/client: implement chmod() for SMB3 POSIX
      Extensions"), so cifs_setattr_nounix() has no POSIX ATTR_MODE branch;
      match its CIFS_ACL/MODE_FROM_SID check. ]
    Signed-off-by: Bjoern Doebel <[email protected]>
    Assisted-by: opencode:kimi-k3
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: close completed creates on compound wait errors [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 19:13:56 2026 -0400

    smb: client: close completed creates on compound wait errors
    
    [ Upstream commit 6c5c547f037bc18f0b8d0b5db5a648f8f630ce85 ]
    
    compound_send_recv() waits for responses in order. If a later wait is
    interrupted, or if a later MID fails during response synchronization, an
    earlier CREATE may already have opened a remote handle. The earlier mid
    is then released without invoking handle_cancelled_mid(), leaving the
    remote handle open because no FID was copied to the caller.
    
    Mark completed earlier mids as cancelled when a compound wait or MID
    synchronization aborts. Keep their response buffers attached while the
    MIDs are synchronized, and transfer them only after synchronization of
    the processed responses, so the release path can inspect successful
    CREATE responses and queue SMB2_close() after a later failure. Account for
    a remote open only after the close work is allocated and before it is
    queued, since the caller has not yet updated num_remote_opens. Mark the
    create+close compound used by smb2_unlink() so it is not closed again.
    Non-CREATE responses and compounds that already include a close keep their
    existing behavior.
    
    Fixes: e0bba0b85481 ("cifs: add compound_send_recv()")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ adapted MID cancellation to use MID_WAIT_CANCELLED with GlobalMid_Lock. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: close handle after create-context parsing failure [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 20:46:36 2026 -0400

    smb: client: close handle after create-context parsing failure
    
    [ Upstream commit 566820af017e81497fb5e9d3ad6e7ffe2828bc8b ]
    
    SMB2_open() accounts a successful CREATE response as a remote open before
    parsing its create contexts.  If smb2_parse_contexts() rejects malformed
    context data, SMB2_open() returns without closing the handle, leaving the
    server-side handle open and num_remote_opens elevated.
    
    Close the handle after a post-CREATE context parsing failure so the error
    path releases the remote resource and balances the open count.
    
    Fixes: af1689a9b770 ("smb: client: fix potential OOBs in smb2_parse_contexts()")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: discard post-EOF pagecache when extending a file via zero range [+ + +]
Author: Paulo Alcantara <[email protected]>
Date:   Wed Oct 7 04:37:33 2026 -0400

    smb: client: discard post-EOF pagecache when extending a file via zero range
    
    [ Upstream commit da4fe97fb6c730d9c94a115c7bfa6f98e0d578d0 ]
    
    smb3_zero_range() removed the pagecache only for the range being zeroed,
    so when it extends the file the folio straddling the old EOF - which may
    hold data dirtied past EOF through an mmap - was never dropped and became
    visible as file content once the file was extended.
    
    Lower the discard boundary to the smaller of the zero-range offset and the
    old EOF.
    
    Fixes: 72c419d9b073 ("cifs: fix smb3_zero_range so it can expand the file-size when required")
    Reviewed-by: David Howells <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: Christian Brauner <[email protected]>
    Cc: Matthew Wilcox <[email protected]>
    Cc: Ronnie Sahlberg <[email protected]>
    Cc: Shyam Prasad N <[email protected]>
    Cc: Tom Talpey <[email protected]>
    Cc: Bharath SM <[email protected]>
    Cc: [email protected]
    [ sashal: Replaced the unavailable local i_size variable with i_size_read(inode). ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix cifsFileInfo reference leak in deferred close [+ + +]
Author: Fan Wu <[email protected]>
Date:   Thu Sep 17 09:22:53 2026 -0400

    smb: client: fix cifsFileInfo reference leak in deferred close
    
    [ Upstream commit 5520e89a5a4f834bced64cf2ac927001cc513a40 ]
    
    When cifs_close() defers a close, it hands the cifsFileInfo reference
    of the closing struct file to the queued work. Each execution of
    smb2_deferred_work_close() drops one such reference.
    
    deferred_close_scheduled can be false while the work is pending: the
    workqueue clears PENDING when the callback starts to run, before the
    callback clears the flag under deferred_lock. A close in that
    interval requeues the running work, and the callback then clears the
    flag, leaving the requeued work pending with the flag down. A later
    cifs_open() can reuse the handle and its cifs_close() reaches the
    same branch: queue_delayed_work() fails because the work is still
    pending, but cifs_close() returns without dropping the closing file's
    reference. The cifsFileInfo count stays pinned and its tlink, dentry
    and server handle are leaked.
    
    Check the return value and hand off the reference only when work was
    actually queued. Otherwise, use the shared _cifsFileInfo_put(), like
    the mod_delayed_work() branch above: the pending execution already
    owns its reference.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: c3f207ab29f7 ("cifs: Deferred close for files")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Adjusted cifs_close() context due to missing trace_smb3_close_cached(). ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix create context out-of-bounds reads [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 13:33:58 2026 -0400

    smb: client: fix create context out-of-bounds reads
    
    [ Upstream commit 67f4c1c6a1b51e203d986779299824d1c2c590a6 ]
    
    smb2_parse_contexts() validates the complete create-context area but
    does not limit each record to its Next field before dispatching it.  A
    malformed chain can therefore expose bytes beyond the current context to
    a handler.  The QFid handler also used a full response-structure cast
    although it only reads DiskFileId.
    
    The SMB2/SMB3 lease parsers made the same layout assumption: they read
    LeaseState and LeaseFlags at canonical offsets rather than at
    DataOffset.  A valid non-canonical DataOffset could therefore yield
    unrelated in-bounds data, while a short DataLength was still accepted.
    
    Limit each context to its Next value, reject offsets before the context
    header, and reject malformed chains.  Bound the name range by the current
    context and do not dispatch a known handler when DataLength is zero.  Read
    the QFid DiskFileId only when the context data covers that field.  Parse the
    lease context from DataOffset and require DataLength to match the v1 or v2
    lease_context size used by ksmbd.  A size mismatch skips lease parsing
    without failing the open.
    
    Fixes: b8c32dbb0deb ("CIFS: Request SMB2.1 leases")
    Fixes: f047390a097e ("CIFS: Add create lease v2 context for SMB3")
    Fixes: 89a5bfa350fa ("smb3: optimize open to not send query file internal info")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix file type corruption in cifs_reparse_point_to_fattr() [+ + +]
Author: Paulo Alcantara <[email protected]>
Date:   Thu Sep 17 09:03:46 2026 -0400

    smb: client: fix file type corruption in cifs_reparse_point_to_fattr()
    
    [ Upstream commit 6bd360447941357e959414a525aa62576a448116 ]
    
    Setting the file type in cf_mode without clearing the existing S_IFMT
    bits first is wrong as it corrupts the file type when cf_mode already
    has type bits set (e.g. S_IFREG | S_IFLNK == S_IFDIR | S_IFREG).
    
    Clear S_IFMT before setting S_IFLNK for native and SMB1 symlinks.
    
    Closes: https://sashiko.dev/#/patchset/20260906181540.647469-1-pc%40manguebit.org
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: Ronnie Sahlberg <[email protected]>
    Cc: Shyam Prasad N <[email protected]>
    Cc: Tom Talpey <[email protected]>
    Cc: Bharath SM <[email protected]>
    Cc: [email protected]
    [ Moved the fix from missing reparse.c to smb311_posix_info_to_fattr() in inode.c. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix heap overflow in DACL owner/group rewrite [+ + +]
Author: Bjoern Doebel <[email protected]>
Date:   Thu Sep 17 10:08:48 2026 -0400

    smb: client: fix heap overflow in DACL owner/group rewrite
    
    [ Upstream commit 0ee150794c75bcd0be0e24ff3394f433cbae18cc ]
    
    When id_mode_to_cifs_acl rewrites an existing DACL, it allocates a
    buffer sized according to the on-disk DACL length reported by
    dacl_ptr->size. However, replace_sids_and_copy_aces may rewrite each
    ACE with a new owner/group SID obtained from the cifs.idmap upcall.
    Those SIDs can have up to SID_MAX_SUB_AUTHORITIES (15) sub-authorities,
    making each ACE up to 76 bytes (sizeof(struct smb_ace)).
    
    If the original DACL contains short SIDs (e.g., 1 sub-authority) while
    the replacement SIDs are long, the rewritten ACEs overflow the
    allocation.
    
    Fix this by always budgeting for worst-case SID expansion: allocate
    sizeof(struct smb_acl) plus num_aces * sizeof(struct smb_ace), which
    covers the smb_acl header and room for every ACE at maximum SID size.
    This replaces the previous split logic that used dacl_ptr->size for
    cifsacl mounts but num_aces * sizeof(struct smb_ace) for mode_from_sid
    mounts: both paths can trigger the same rewrite and need the same
    headroom.
    
    KASAN reports this as:
      BUG: KASAN: slab-out-of-bounds in build_sec_desc+0x1e8a/0x2680 [cifs]
      Write of size 4 at addr ffff8881a5e25374 by task chown/5298
      ...
      The buggy address is located 0 bytes to the right of
       allocated 884-byte region [ffff8881a5e25000, ffff8881a5e25374)
    
    Cc: [email protected]
    Fixes: bc3e9dd9d104 ("cifs: Change SIDs in ACEs while transferring file ownership.")
    Assisted-by: Kiro:claude-opus-4.6
    Signed-off-by: Bjoern Doebel <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Fixes: 5c3564852c58 ("cifs: Minimize the number of cifs_acl memory allocations")
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ changed smb_acl/smb_ace to cifs_acl/cifs_ace and le16_to_cpu() to le32_to_cpu() for the branch’s 32-bit num_aces field. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix next_buffer UAF and NextCommand bounds in compound PDUs [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Tue Sep 22 17:23:36 2026 -0400

    smb: client: fix next_buffer UAF and NextCommand bounds in compound PDUs
    
    [ Upstream commit 05762c5bc1cfdcac36747994fde2c04387a457f1 ]
    
    Fix several related bounds checking and pointer lifecycle issues in
    receive_encrypted_standard()'s handling of compound encrypted frames:
    
    - Clear next_buffer after assigning it to server->bigbuf. A stale
      next_buffer pointer can lead to a use-after-free on subsequent
      error paths.
    - Update pdu_length to the decrypted plaintext size (buf_size). Using
      the pre-decryption length allows NextCommand to point into stale
      ciphertext residue.
    - Reject next_cmd values smaller than MID_HEADER_SIZE(server).
    - Fix an integer overflow in the upper bound check by verifying
      pdu_length - next_cmd < MID_HEADER_SIZE(server), ensuring the
      trailing slice is large enough for a header.
    
    Fixes: b24df3e30cbf ("cifs: update receive_encrypted_standard to handle compounded responses")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Replaced unavailable MID_HEADER_SIZE(server) with (HEADER_SIZE(server) - 1). ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix OOB read/write from unvalidated DataOffset in coalesce_t2() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Mon Sep 7 10:23:14 2026 -0400

    smb: client: fix OOB read/write from unvalidated DataOffset in coalesce_t2()
    
    [ Upstream commit 6343c1da561962688f203362d80d6a3bfa39fa1b ]
    
    coalesce_t2() computes data pointers directly from server-supplied
    DataOffset fields with no validation against buffer bounds:
    
      data_area_of_tgt = (char *)&pSMBt->hdr.Protocol +
                         get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
      data_area_of_src = (char *)&pSMBs->hdr.Protocol +
                         get_unaligned_le16(&pSMBs->t2_rsp.DataOffset);
      data_area_of_tgt += total_in_tgt;
      ...
      memcpy(data_area_of_tgt, data_area_of_src, total_in_src);
    
    A small DataOffset can push a pointer below the actual byte area,
    overwriting header fields; a large one can push it past the buffer
    end, causing out-of-bounds heap reads (source) or writes (target).
    The BCC overflow guard does not prevent this: BCC reflects how much
    data is present, while DataOffset controls where in the buffer it
    starts.
    
    The "validate target area" comment present since the function was
    first written in 2005 was a placeholder that was never implemented.
    
    Add lower- and upper-bound checks for both data pointers before the
    memcpy, and before any target header fields are modified.
    
    Fixes: e4eb295d38b5 ("[PATCH] cifs: Handle multiple response transact2 part 1 of 2")
    Cc: [email protected]
    Reported-by: Shen Yongchao <[email protected]>
    Signed-off-by: Frank Sorenson <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ transplanted the bounds validation to coalesce_t2() in smb1ops.c due to code relocation ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix OOB struct field reads in move_smb2_ea_to_cifs() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Tue Sep 22 21:56:07 2026 -0400

    smb: client: fix OOB struct field reads in move_smb2_ea_to_cifs()
    
    [ Upstream commit eeb5ef6083e1cefa2ef75041b5597ff228b8d7bb ]
    
    In move_smb2_ea_to_cifs(), the while (src_size > 0) loop condition is
    insufficient. It allows iteration to continue even if the remaining
    src_size is too small to contain a complete smb2_ea_info structure.
    Consequently, reads of ea_name_length and ea_value_length can occur
    out-of-bounds.
    
    Fix this by ensuring src_size >= sizeof(*src) before attempting to read
    any structure fields. Additionally, reject any next_entry_offset that is
    smaller than sizeof(*src) or that would advance the pointer beyond the
    available buffer.
    
    Note that for calls where the server returns a malformed EA list, the
    error returned to userspace changes from -ENODATA (getxattr) or
    -ERANGE (listxattr) to -EIO. This correctly signals a server protocol
    error rather than misleadingly indicating "attribute not present" or
    "output buffer too small".
    
    Fixes: 95907fea4fd8 ("cifs: Add support for reading attributes on SMB2+")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Replaced unavailable smb_EIO2() tracing calls with -EIO. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix potential OOB read in smb3_enum_snapshots() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Tue Sep 22 15:55:01 2026 -0400

    smb: client: fix potential OOB read in smb3_enum_snapshots()
    
    [ Upstream commit 4775c3b7a597907e0b97556c7986fda238a377ae ]
    
    If snapshot_array_size is smaller than GMT_TOKEN_SIZE,
    smb3_enum_snapshots() sets ret_data_len to
    sizeof(struct smb_snapshot_array) without verifying the actual length
    of the server's reply.
    
    Because SMB2_ioctl() places no lower bound on the server-supplied
    OutputCount and allocates retbuf to exactly that length, a short reply
    results in ret_data_len exceeding the size of retbuf. The subsequent
    copy_to_user() then reads past the end of retbuf, leaking adjacent slab
    memory to userspace.  The subsequent clamp check is ineffective as it
    only reduces ret_data_len.
    
    Fix this by rejecting replies shorter than
    sizeof(struct smb_snapshot_array) with -EIO. Note that the bound is set
    to the 12-byte struct size rather than the 16-byte
    MIN_SNAPSHOT_ARRAY_SIZE defined in MS-SMB2 3.3.5.15.1, because 12 bytes
    is exactly what copy_to_user() attempts to read.
    
    Fixes: e02789a53d71 ("smb3: enumerating snapshots was leaving part of the data off end")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix smbd_connection leak on cifs_get_tcp_session() error [+ + +]
Author: Paulo Alcantara <[email protected]>
Date:   Tue Sep 22 15:33:49 2026 -0400

    smb: client: fix smbd_connection leak on cifs_get_tcp_session() error
    
    [ Upstream commit e75c96157d45e498970158c8f7373d90102e33b9 ]
    
    When an RDMA connection is successfully established via
    smbd_get_connection() but cifs_get_tcp_session() later fails (e.g.
    kthread_create() returns an error), the error path frees tcp_ses
    without first destroying the smbd_connection.
    
    Fix this by calling smbd_destroy() in the out_err cleanup path before
    kfree(tcp_ses).  smbd_destroy() safely handles the case where
    smbd_conn is NULL, so it can be called unconditionally.
    
    Closes: https://sashiko.dev/#/patchset/20260912165503.521597-1-pc%40manguebit.org
    Fixes: 2f8946464b11 ("CIFS: SMBD: Upper layer connects to SMBDirect session")
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: Tom Talpey <[email protected]>
    Cc: Stefan Metzmacher <[email protected]>
    Cc: Shyam Prasad N <[email protected]>
    Cc: Ronnie Sahlberg <[email protected]>
    Cc: Bharath SM <[email protected]>
    Cc: Namjae Jeon <[email protected]>
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: reject short Next offsets in parse_server_interfaces() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Mon Oct 12 09:40:56 2026 -0700

    smb: client: reject short Next offsets in parse_server_interfaces()
    
    [ Upstream commit 1b3221bb121079ad79a1f3c3aa360ba649832e7a ]
    
    In parse_server_interfaces(), the server-supplied Next offset is
    validated against bytes_left, but not against the size of the interface
    structure itself.
    
    A small, non-zero Next value can pass the bounds check but advance the
    pointer by less than sizeof(*p). This causes the next iteration of the
    loop to read misaligned, overlapping structure fields.
    
    Fix this by ensuring the Next offset is at least sizeof(*p).
    
    Fixes: 7d34ec36abb8 ("smb3: fix for slab out of bounds on mount to ksmbd")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    (cherry picked from commit 1b3221bb121079ad79a1f3c3aa360ba649832e7a)
    Signed-off-by: Harshit Mogalapalli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: reject userspace cifs.idmap descriptions [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Wed Sep 16 23:20:32 2026 -0400

    smb: client: reject userspace cifs.idmap descriptions
    
    [ Upstream commit d9d7eeb0cea5b55b82888f443622fd8d4ee064f3 ]
    
    cifs.idmap key descriptions carry authority-bearing fields (owner and
    group SIDs and uid/gid values in "os:"/"gs:"/"oi:"/"gi:" form) that the
    cifs.idmap upcall helper treats as kernel-originating inputs.  Unlike
    its sibling cifs.spnego, the cifs.idmap key type has no vet_description
    hook, so userspace can create keys of this type through
    request_key(2)/add_key(2) and supply those fields without CIFS origin.
    A request_key(2) call with a non-NULL callout then drives a root
    usermodehelper upcall (/sbin/request-key -> cifs.idmap) that consumes
    the unvetted description in root context.
    
    Only accept cifs.idmap descriptions while CIFS is using its private
    root_cred to request the key.  id_to_sid()/sid_to_id() already run
    under override_creds(root_cred), so the kernel-originated path is
    unaffected.
    
    This mirrors commit 3da1fdf4efbc ("smb: client: reject userspace
    cifs.spnego descriptions"), which applied the same restriction to
    cifs.spnego.
    
    Fixes: 4d79dba0e007 ("cifs: Add idmap key and related data structures and functions (try #17 repost)")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    Acked-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: split cifsFileInfo bitfields to avoid shared-byte RMW races [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Mon Oct 5 13:01:02 2026 -0500

    smb: client: split cifsFileInfo bitfields to avoid shared-byte RMW races
    
    [ Upstream commit 19465a9aeb664f1d710d0d22c07c31bfb7c85446 ]
    
    The invalidHandle, swapfile, oplock_break_cancelled, offload,
    and status_file_deleted fields are stored in the same bitfield byte
    in struct cifsFileInfo, but are updated in different code paths that
    may run simultaneously, and are protected by different locks.  Since
    bitfield assignments generate byte-level read-modify-write operations,
    a modification to one flag can overwrite a concurrent modification to
    another flag.
    
    To avoid these races, convert these flags from a bitfield to
    separate bool fields.
    
    Closes: https://lore.kernel.org/r/[email protected]
    Fixes: 3bc303c254335 ("cifs: convert oplock breaks to use slow_work facility (try #4)")
    Fixes: 4e8aea30f7751 ("smb3: enable swap on SMB3 mounts")
    Fixes: ffceb7640cbfe ("smb: client: do not defer close open handles to deleted files")
    Fixes: 173217bd73365 ("smb3: retrying on failed server close")
    Signed-off-by: Frank Sorenson <[email protected]>
    Cc: [email protected]
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    (cherry picked from commit 19465a9aeb664f1d710d0d22c07c31bfb7c85446)
    [ status_file_deleted and offload not present in kernel 5.15 ]
    Signed-off-by: Frank Sorenson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: use finish_no_open() for non-regular inodes [+ + +]
Author: Namjae Jeon <[email protected]>
Date:   Wed Sep 30 13:34:20 2026 -0400

    smb: client: use finish_no_open() for non-regular inodes
    
    [ Upstream commit e66cf1625ec4a3fe68346119f371def713fd0a4d ]
    
    An O_CREAT open can find an existing symlink or another non-regular
    inode. cifs_atomic_open() calls finish_open() on it and attaches a
    cifsFileInfo. Symlink inodes have no CIFS release operation, so the
    dentry reference held by cifsFileInfo is leaked. FMODE_OPENED also
    prevents the VFS from following the symlink.
    
    Track whether cifs_do_create() returned an open server handle. For
    non-regular inodes, close the handle if present, remove the pending
    open, and call finish_no_open() so the VFS can continue the lookup.
    Do not set FMODE_CREATED unless a regular file was opened. For
    O_NOFOLLOW with __O_REGULAR, return -ELOOP before the VFS's
    -EFTYPE check.
    
    Defer closing a legacy POSIX handle on a non-regular inode until
    after inode lookup. This avoids closing it again if lookup fails.
    
    Fixes: d2c127197dfc ("cifs: implement i_op->atomic_open()")
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: [email protected]
    [ used d_is_reg(direntry) because the older cifs_do_create() already attaches the inode. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: validate POSIX create context length [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 12:03:09 2026 -0400

    smb: client: validate POSIX create context length
    
    [ Upstream commit fa2e9900dd2a3f5a1e7ef5a8c5e8d435feedbfcc ]
    
    parse_posix_ctxt() reads the fixed nlink, reparse_tag, and mode fields
    before checking that the POSIX create context contains them.  A short
    context can pass the generic checks and still make these fixed-width
    reads run past its declared data.
    
    The current in-tree smb2_open_file() path passes a NULL posix pointer,
    so this handler is not reached on the ordinary open path.  Still require
    the POSIX data to cover all three fields before reading them because the
    helper performs those unguarded reads.  Keep the existing soft-failure
    behavior so malformed optional metadata does not fail the open.
    
    Fixes: 69dda3059e7a ("cifs: add SMB2_open() arg to return POSIX data")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
soc: qcom: geni-se: Correct QUP Core ICC vote constants [+ + +]
Author: Viken Dadhaniya <[email protected]>
Date:   Mon Oct 5 10:03:46 2026 -0400

    soc: qcom: geni-se: Correct QUP Core ICC vote constants
    
    [ Upstream commit 1cd9b1be5a9c56fd69e3f555b200a1844f9b873e ]
    
    The GENI_TO_CORE ("qup-core") ICC vote selects the QUP Core 2X clock
    rate. The CORE_2X_*_MHZ constants are expressed in Bps, but their
    values are several orders of magnitude too small. For example, the
    50 MHz threshold is represented by 2500 rather than 25000000 Bps.
    
    As a result, clients using these constants can severely under-vote the
    QUP Core clock.
    
    Correct the constants to their intended Bps thresholds so that the ICC
    provider selects the corresponding QUP Core 2X clock rate. Drop the unused
    definitions.
    
    Fixes: 58ffbba6a399 ("soc: qcom: geni: Support for ICC voting")
    Cc: [email protected]
    Signed-off-by: Viken Dadhaniya <[email protected]>
    Reviewed-by: Konrad Dybcio <[email protected]>
    Link: https://patch.msgid.link/20260915-correct-icc-bandwidth-vote-constants-v2-1-f78eb611204e@oss.qualcomm.com
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
spi: bcm63xx: disable clock on resume failure [+ + +]
Author: Can Peng <[email protected]>
Date:   Thu Sep 10 08:53:10 2026 -0400

    spi: bcm63xx: disable clock on resume failure
    
    [ Upstream commit 2b62c2c134fa32d9d3a9e7323c8ac74518eeb4ac ]
    
    bcm63xx_spi_resume() enables the controller clock before restarting the
    SPI controller queue.
    
    If spi_controller_resume() fails, the function currently reports success
    and leaves the clock enabled. Propagate the error and disable the clock
    before returning.
    
    Fixes: b42dfed83d95 ("spi: add Broadcom BCM63xx SPI controller driver")
    Cc: [email protected]
    Signed-off-by: Can Peng <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    [ changed spi_controller_resume(host) to spi_master_resume(master) to match the older API and variable name. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
staging: rtl8723bs: fix OOB read in rtw_restruct_wmm_ie() [+ + +]
Author: Muhammad Bilal <[email protected]>
Date:   Thu Sep 10 07:36:14 2026 -0400

    staging: rtl8723bs: fix OOB read in rtw_restruct_wmm_ie()
    
    [ Upstream commit 28a289beaf226b30b1e6e7d7b1a2946fe2d6e852 ]
    
    rtw_restruct_wmm_ie() scans in_ie for a WMM IE with:
    
            while (i < in_len) {
                    ...
                    if (i + 5 < in_len && in_ie[i] == 0xDD && ...) {
                            ...
                            break;
                    }
                    i += (in_ie[i + 1] + 2); /* to the next IE element */
            }
    
    When the "i + 5 < in_len" match check fails simply because i is
    within 5 bytes of the end of the buffer (i.e. no WMM IE was found
    near the tail of in_ie), execution falls through to
    "i += (in_ie[i + 1] + 2)", which reads in_ie[i + 1]. If i == in_len
    - 1 at that point, this is a 1-byte out-of-bounds read of an
    attacker-influenced IE buffer built from association/scan data.
    
    Commit a75281626fc8f ("staging: rtl8723bs: fix potential
    out-of-bounds read in rtw_restruct_wmm_ie") added the "i + 5 <
    in_len" guard to the match condition itself, but did not add an
    equivalent guard before the fallthrough advance, so the same class
    of OOB read remained reachable through the non-matching path.
    
    Add an explicit bounds check before advancing to the next IE.
    
    Fixes: 554c0a3abf216 ("staging: Add rtl8723bs sdio wifi driver")
    Cc: [email protected]
    Signed-off-by: Muhammad Bilal <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

staging: rtl8723bs: fix spacing around operators [+ + +]
Author: Vivek BalachandharTN <[email protected]>
Date:   Thu Sep 10 07:36:13 2026 -0400

    staging: rtl8723bs: fix spacing around operators
    
    [ Upstream commit 2038fe84b8bdf894b634f777096685e78e8f3774 ]
    
    Fix several instances where operators lacked spaces around them.
    This improves readability and brings the driver closer to kernel
    coding-style guidelines. No functional change.
    
    Signed-off-by: Vivek BalachandharTN <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    
    For this stable dependency, retain only the spacing change to the IE
    advance in rtw_restruct_wmm_ie(). This supplies the exact context needed
    by target commit 28a289beaf226 ("staging: rtl8723bs: fix OOB read in
    rtw_restruct_wmm_ie()"). Drop the unrelated operator-spacing hunks.
    
    Keep the existing bounds-first WMM match condition from stable commit
    4dd2d9cf563c5 (upstream a75281626fc8f); applying the older condition
    would undo its out-of-bounds-read fix. No functional change.
    
    Stable-dep-of: 28a289beaf22 ("staging: rtl8723bs: fix OOB read in rtw_restruct_wmm_ie()")
    Signed-off-by: Sasha Levin <[email protected]>

staging: sm750fb: fix mono image source stride mismatch in lynxfb_ops_imageblit() [+ + +]
Author: Muhammad Bilal <[email protected]>
Date:   Thu Sep 10 07:51:36 2026 -0400

    staging: sm750fb: fix mono image source stride mismatch in lynxfb_ops_imageblit()
    
    [ Upstream commit cc7cd2a9228175c975f62ad56ed7c767701cb4fa ]
    
    sm750_hw_imageblit() advances its monochrome source pointer by
    src_delta per scanline, and computes the correct rounded-up stride
    internally as:
    
            bytes_per_scan = (width + start_bit + 7) / 8;
    
    Its only caller, lynxfb_ops_imageblit(), instead passed src_delta as
    image->width >> 3. For widths not a multiple of 8 this under-counted
    the stride, so the source pointer fell further behind the real
    per-scanline layout on every line, corrupting the rendered image.
    
    Rather than just fixing the caller's calculation, remove src_delta
    as a parameter entirely and have sm750_hw_imageblit() advance by the
    bytes_per_scan it already computes for itself. There has only ever
    been one caller, and that caller was passing an out-of-sync
    derivative of the same width/start_bit values sm750_hw_imageblit()
    already has, so keeping stride as a separate parameter served no
    purpose beyond letting the two calculations drift apart, which is
    exactly what happened here.
    
    Rounding up, rather than down, is the direction consistent with the
    rest of the fbdev core: struct fb_image mono bitmap data (the same
    image->data this driver receives) is walked elsewhere with byte
    strides derived from a ceiling division of width by 8. The generic
    mono bit iterator in drivers/video/fbdev/core/fb_imageblit.h advances
    scanlines with "iter->data += BITS_TO_BYTES(iter->width)", and
    BITS_TO_BYTES() (include/linux/bitops.h) is a ceiling division.
    sm750_hw_imageblit()'s own "(width + start_bit + 7) / 8" is that same
    ceiling division with an added start_bit offset, so the caller's
    ">> 3" (floor) was the one calculation out of step with how this data
    layout is handled everywhere else.
    
    Found by code review of sm750_hw_imageblit()'s internal stride
    calculation against what its only caller was passing in, and
    confirmed with a clean -Werror build. I do not have this hardware,
    so this has not been exercised at runtime on real sm750 silicon.
    
    Fixes: 81dee67e215b2 ("staging: sm750fb: add sm750 to staging")
    Cc: [email protected]
    Reviewed-by: Dan Carpenter <[email protected]>
    Signed-off-by: Muhammad Bilal <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
strparser: make sure __strp_recv isn't running before tearing down the parser [+ + +]
Author: Sabrina Dubroca <[email protected]>
Date:   Mon Oct 5 15:50:02 2026 +0200

    strparser: make sure __strp_recv isn't running before tearing down the parser
    
    commit 0984ebc631792acf8fff105112ee74a6b8f1efcc upstream.
    
    The comment above strp_done() claims that if strp is stopped,
    strp_recv will no longer be called. That's only true if the caller has
    a mechanism (eg locking) to guarantee that strp_recv() calls that
    started before strp_stop() have completed by the time we call
    strp_done().
    
    This adds a dummy lock_sock/release_sock pair to guarantee that any
    in-flight strp_recv() (which runs under either bh_lock_sock or
    lock_sock, depending if it's called from ->sk_data_ready or strp_work)
    has completed.
    
    Only espintcp can be affected by this race condition, but this patch
    makes sure no future user of strp can have the bug.
    
    This could crash on strp->sk ("general mode" of strp), but this mode
    has been here for 9 years and has never been used. It'll be gone soon,
    no point worrying about it.
    
    Switch the stopped/paused/etc bits to u8's to avoid races between
    strp_stop() and strp_pause/unpause().
    
    A reproducer has been published and turns the possible UAF into an
    exploit [1].
    
    Reported-by: Hyunwoo Kim <[email protected]>
    Link: https://lore.kernel.org/all/aZLn2Faeg1FB7XOf@v4bel/
    Link: https://lore.kernel.org/all/aZgpkyTDU3aXe_V0@v4bel/
    Link: https://github.com/m0x41nos/RustyTux [1]
    Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
    Cc: [email protected]
    Signed-off-by: Sabrina Dubroca <[email protected]>
    Reviewed-by: Hyunwoo Kim <[email protected]>
    Link: https://patch.msgid.link/425d9d926709b542ed5331110c19fee4aee1f28d.1791206940.git.sd@queasysnail.net
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
SUNRPC: fix gssx_dec_option_array error path bugs [+ + +]
Author: Chris Mason <[email protected]>
Date:   Thu May 28 15:32:09 2026 -0400

    SUNRPC: fix gssx_dec_option_array error path bugs
    
    [ Upstream commit 5e9a94539b1ec17a89177d952badfd0d844d694a ]
    
    Four coupled defects in the gssx XDR option-array decoder make the
    error paths unsafe: a NULL deref in the caller, a refcount leak on
    the decoded group_info, and a latent use-after-free that the leak
    fix would otherwise expose.
    
    gssx_dec_option_array() sets oa->count = 1 before allocating
    oa->data.  If that allocation fails, -ENOMEM is returned with
    oa->count == 1 and oa->data == NULL.  All other error paths jump
    to free_oa: which frees oa->data and NULLs it but also leaves
    oa->count == 1.  The caller trusts the count:
    
        gssp_accept_sec_context_upcall()
          gssx_dec_accept_sec_context()
            gssx_dec_option_array()        /* fails, count=1 data=NULL */
          data = res.options.data[0].value /* NULL deref */
    
    Independently, free_creds: releases the partially decoded svc_cred
    with a bare kfree(creds).  gssx_dec_linux_creds() installs a
    groups_alloc() result into creds->cr_group_info; that object is
    kvmalloc-backed and refcounted, and only put_group_info() reaches
    kvfree().  A plain kfree(creds) drops the wrapper and leaks the
    group_info allocation.
    
    The natural fix for the leak is to call free_svc_cred(creds) before
    kfree(creds), but free_svc_cred() invokes put_group_info() on
    creds->cr_group_info unconditionally when non-NULL.  The existing
    out_free_groups: path in gssx_dec_linux_creds() already called
    groups_free() on that pointer without clearing it, so once
    free_svc_cred() is wired in, the subsequent put_group_info() would
    touch freed memory.
    
    Fix all four together:
    
      - Move the oa->count = 1 assignment below the oa->data allocation
        so it is never set when oa->data is NULL.
      - Reset oa->count to 0 at free_oa: so count and data stay
        coherent and the caller sees an empty option array.
      - Call free_svc_cred(creds) before kfree(creds) at free_creds:
        so the refcounted cr_group_info is released.  free_svc_cred()
        either NULL-guards each field explicitly (cr_group_info has
        an if() check) or delegates to a helper that is NULL-safe
        itself (kfree for the string fields, gss_mech_put() which
        guards with if(gm) at gss_mech_switch.c:342), so it is safe
        to call on a partially decoded svc_cred where only
        cr_uid/cr_gid/cr_group_info have been written and everything
        else is zero from kzalloc.
      - In gssx_dec_linux_creds()'s out_free_groups: path, release
        cr_group_info with put_group_info() rather than groups_free()
        so the teardown matches free_svc_cred()'s refcount-aware path,
        and clear the pointer so a later free_svc_cred() on the same
        creds does not release it a second time.
    
    Fixes: 3cfcfc102a5e ("SUNRPC: fix some memleaks in gssx_dec_option_array")
    Cc: [email protected]
    Assisted-by: kres (claude-opus-4-7)
    Signed-off-by: Chris Mason <[email protected]>
    Reviewed-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

SUNRPC: reject duplicate CREDS_VALUE options [+ + +]
Author: Chris Mason <[email protected]>
Date:   Thu May 28 15:32:10 2026 -0400

    SUNRPC: reject duplicate CREDS_VALUE options
    
    [ Upstream commit 2e4ce62385c1b8a887c5370af058ac7b52a8eaf9 ]
    
    gssx_dec_option_array() walks the wire-supplied option array and, for
    every entry whose name matches CREDS_VALUE, calls
    gssx_dec_linux_creds() on the same struct svc_cred. That helper
    unconditionally installs a fresh groups_alloc() result into
    creds->cr_group_info without releasing whatever pointer was already
    there:
    
        for (i = 0; i < count; i++) {
            ... decode name ...
            if (length == sizeof(CREDS_VALUE) &&
                memcmp(p, CREDS_VALUE, sizeof(CREDS_VALUE)) == 0) {
                err = gssx_dec_linux_creds(xdr, creds);
                ...
            }
        }
    
    A reply that carries two CREDS_VALUE entries therefore overwrites
    cr_group_info on the second iteration and orphans the group_info
    allocated by the first call. The earlier free_creds path only
    releases the last cr_group_info via free_svc_cred(), so the first
    allocation's refcount stays at one and its kvmalloc-backed storage
    is leaked. No in-tree caller of gssp_accept_sec_context_upcall()
    expects more than one CREDS_VALUE per reply.
    
    Fix by tracking whether a CREDS_VALUE option has already been
    decoded and returning -EINVAL on any subsequent match, so the
    free_creds path releases the single group_info that was installed.
    
    Fixes: 1d658336b05f ("SUNRPC: Add RPC based upcall mechanism for RPCGSS auth")
    Cc: [email protected]
    Assisted-by: kres (claude-opus-4-7)
    Signed-off-by: Chris Mason <[email protected]>
    Reviewed-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
tcp: fix use-after-free in do_tcp_getsockopt(TCP_CC_INFO) [+ + +]
Author: Cen Zhang (Microsoft Security FORGE Labs) <[email protected]>
Date:   Thu Aug 27 19:55:11 2026 -0400

    tcp: fix use-after-free in do_tcp_getsockopt(TCP_CC_INFO)
    
    commit 385e474086c2e7e29e2dded690be40dc273e20ee upstream.
    
    do_tcp_getsockopt() reads icsk->icsk_ca_ops and dereferences the
    get_info function pointer without rcu_read_lock(). With BPF struct_ops
    congestion control, ca_ops can point to dynamically allocated memory
    that is freed concurrently, resulting in a use-after-free when the
    kernel dereferences or calls through the stale pointer.
    
      BUG: KASAN: slab-use-after-free in do_tcp_getsockopt+0x2037/0x23e0
      Read of size 8 at addr ffff888013701258 by task exploit/149
       do_tcp_getsockopt+0x2037/0x23e0 (net/ipv4/tcp.c:4564)
       tcp_getsockopt+0x91/0xf0
       __sys_getsockopt+0xf7/0x170
    
    Fix this by wrapping the ca_ops load and get_info call within
    rcu_read_lock()/rcu_read_unlock(), and using READ_ONCE() to load
    the icsk_ca_ops pointer.
    
    Fixes: 0baf26b0fcd7 ("bpf: tcp: Support tcp_congestion_ops in bpf")
    Suggested-by: Eric Dumazet <[email protected]>
    Cc: [email protected]
    Cc: [email protected]
    Reviewed-by: Eric Dumazet <[email protected]>
    Signed-off-by: Cen Zhang (Microsoft Security FORGE Labs) <[email protected]>
    Reviewed-by: Jiayuan Chen <[email protected]>
    Reviewed-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/65fd3816ed5d541d9edd4bf4fcf97104a2cf907a.1787870710.git.blbllhy@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tcp: prevent collapsing skbs across boundary in rtx queue [+ + +]
Author: Willem de Bruijn <[email protected]>
Date:   Tue Sep 29 12:30:00 2026 -0400

    tcp: prevent collapsing skbs across boundary in rtx queue
    
    [ Upstream commit fc6d80eb504458d6416b75a94188b268c95c6533 ]
    
    tcp_write_collapse_fence() sets TCP_SKB_CB(skb)->eor = 1 on
    tcp_write_queue_tail(sk) to prevent skbs queued after a switch to
    device encryption from being collapsed into earlier skbs.
    
    The fence is a no-op if all earlier data has already been transmitted
    when the switch happens: sk->sk_write_queue is empty. The not yet
    acknowledged earlier skbs wait in sk->tcp_rtx_queue with eor 0.
    
    On a subsequent retransmit or SACK shift, tcp_retrans_try_collapse() or
    tcp_shift_skb_data() can then merge an skb queued after the switch into
    one queued before it.
    
    Both users of the fence are affected:
    
    - psp: devices only encrypt skbs with skb->decrypted set. The merged skb
      keeps decrypted = 0 from the earlier skb, so merged data sent after
      psp_sock_assoc_set_tx() is retransmitted in cleartext.
    
    - tls device offload: the merged skb straddles the start marker set in
      tls_set_device_offload(). The software fallback (fill_sg_in() returns
      -EINVAL) and the mlx5, nfp and funeth drivers cannot handle such an
      skb and drop it. Every retransmit rebuilds the same skb, so the
      connection stalls.
    
    Fix this in two places, for defense in depth:
    
    1. Fall back to tcp_rtx_queue_tail(sk) in tcp_write_collapse_fence()
       when tcp_write_queue_tail(sk) is NULL.
    
    2. Check !skb_cmp_decrypted(to, from) in tcp_skb_can_collapse(), as
       tcp_skb_can_collapse_rx() does on receive. skb_shift(), which both
       collapse paths call, already has a DEBUG_NET_WARN_ON_ONCE() for this
       condition.
    
    Fixes: e8f69799810c ("net/tls: Add generic NIC offload infrastructure")
    Cc: [email protected]
    Signed-off-by: Willem de Bruijn <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Reviewed-by: Daniel Zahka <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ inlined logic for missing skb_cmp_decrypted() and tcp_write_collapse_fence() helpers into existing functions. ]
    Signed-off-by: Sasha Levin <[email protected]>

tcp: refresh TS.Recent for accepted old ACKs [+ + +]
Author: Jeff Jo <[email protected]>
Date:   Thu Sep 24 15:44:58 2026 -0700

    tcp: refresh TS.Recent for accepted old ACKs
    
    [ Upstream commit 1b92780ae4fc3be64f05d97ed8833c445e73b0cf ]
    
    A TCP packet can carry new data while acknowledging traffic in the
    opposite direction. With overlapping traffic in both directions, a
    delayed packet's acknowledgment can be older than one Linux has already
    accepted, even when that packet fills a gap in the received data.
    
    Linux accepts the data, but tcp_ack() takes the old_ack path and skips
    updating TS.Recent, the timestamp saved for outgoing acknowledgments.
    The reply therefore echoes an older timestamp. If the sender uses this
    echo to measure round-trip time after a long idle period, its estimate
    includes the idle time and can reduce its sending rate.
    
    Update TS.Recent in old_ack using tcp_replace_ts_recent(), before SACK
    processing can trigger a transmission. This reuses the existing timestamp
    and sequence checks, including PAWS protection against old duplicate
    packets. ACK validation already rejects old ACKs in SYN_RECV before this
    path, so no additional state check is needed.
    
    Echoing the timestamp of the packet that fills the receive gap follows
    RFC 7323 section 4.3. In a socket reproduction with 300 seconds idle,
    controlled reordering and retransmission to exercise timestamp-based RTT
    sampling, the sender's smoothed round-trip time was 37.5 seconds without
    the fix and 15.5 ms with it.
    
    Fixes: 12fb3dd9dc3c ("tcp: call tcp_replace_ts_recent() from tcp_ack()")
    Assisted-by: LLM sparse
    Signed-off-by: Jeff Jo <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
thunderbolt: Fix KASAN reported use-after-free when request is canceled [+ + +]
Author: Mika Westerberg <[email protected]>
Date:   Tue Oct 6 18:56:03 2026 -0400

    thunderbolt: Fix KASAN reported use-after-free when request is canceled
    
    [ Upstream commit a02188ddc24b7872f0c5e0c5873f827318717803 ]
    
    Alan reported that when doing stress testing sometimes KASAN notices
    use-after-free during control channel operation (stripped down keeping
    the relevant parts):
    
     BUG: KASAN: slab-use-after-free in tb_cfg_request_sync+0x240/0x250 [thunderbolt]
     Read of size 24 at addr ffff88811067f290 by task kworker/u40:2/1760
      <TASK>
      tb_cfg_request_sync+0x240/0x250 [thunderbolt]
      tb_cfg_read_raw+0x367/0x510 [thunderbolt]
      tb_cfg_read+0xec/0x240 [thunderbolt]
      tb_port_get_link_generation+0x258/0x420 [thunderbolt]
      tb_usb3_consumed_bandwidth+0x1c1/0x2c0 [thunderbolt]
      tb_tunnel_consumed_bandwidth+0xfd/0x910 [thunderbolt]
      tb_available_bandwidth+0x5f2/0xeb0 [thunderbolt]
      tb_recalc_estimated_bandwidth+0x2a0/0x1bc0 [thunderbolt]
      tb_handle_dp_bandwidth_request+0x1897/0x5e20 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
      </TASK>
    
     Allocated by task 1760:
      __kmalloc_cache_noprof+0x1ee/0x550
      tb_cfg_read_raw+0x1d3/0x510 [thunderbolt]
      tb_cfg_read+0xec/0x240 [thunderbolt]
      tb_port_get_link_generation+0x258/0x420 [thunderbolt]
      tb_usb3_consumed_bandwidth+0x1c1/0x2c0 [thunderbolt]
      tb_tunnel_consumed_bandwidth+0xfd/0x910 [thunderbolt]
      tb_available_bandwidth+0x5f2/0xeb0 [thunderbolt]
      tb_recalc_estimated_bandwidth+0x2a0/0x1bc0 [thunderbolt]
      tb_handle_dp_bandwidth_request+0x1897/0x5e20 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
    
     Freed by task 926:
      kfree+0x18f/0x4a0
      tb_cfg_request_put+0xb7/0xe0 [thunderbolt]
      tb_cfg_request_work+0x82/0x120 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
    
     Second to last potentially related work creation:
      __queue_work+0x575/0xd00
      queue_work_on+0x77/0x80
      tb_cfg_request_cancel+0xc7/0x260 [thunderbolt]
      tb_cfg_request_sync+0x1f6/0x250 [thunderbolt]
      tb_cfg_read_raw+0x367/0x510 [thunderbolt]
      tb_cfg_read+0xec/0x240 [thunderbolt]
      tb_port_get_link_generation+0x258/0x420 [thunderbolt]
      tb_usb3_consumed_bandwidth+0x1c1/0x2c0 [thunderbolt]
      tb_tunnel_consumed_bandwidth+0xfd/0x910 [thunderbolt]
      tb_available_bandwidth+0x5f2/0xeb0 [thunderbolt]
      tb_recalc_estimated_bandwidth+0x2a0/0x1bc0 [thunderbolt]
      tb_handle_dp_bandwidth_request+0x1897/0x5e20 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
    
    The last stack trace is helpful because it shows that we are cancelling
    a request and looking at tb_cfg_request_cancel() what might happen is
    that tb_cfg_request_work() completes right before tb_cfg_request_cancel()
    starts and because of this it will call schedule_work() queueing the
    same work to run again. However, it is already removed from the
    request_queue and reference count is dropped so when
    tb_cfg_request_work() triggers again it will access memory that is
    already released.
    
    Fix this so that we first make sure a cancelled request is not handed
    away from tb_cfg_request_find() or scheduled to run. Then instead of
    relying on the worker to clean up the request we will do it in
    tb_cfg_request_cancel() after the work is canceled from running. Make
    tb_cfg_request_dequeue() release the request only if it was actually
    removed from the queue.
    
    Reported-by: Alan Borzeszkowski <[email protected]>
    Fixes: d7f781bfdbf4 ("thunderbolt: Rework control channel to be more reliable")
    Cc: [email protected]
    Signed-off-by: Mika Westerberg <[email protected]>
    [ sashal: Replaced guard()/scoped_guard() with explicit mutex locking for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

thunderbolt: Reject oversized XDomain properties responses [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Wed Sep 9 10:07:37 2026 +0900

    thunderbolt: Reject oversized XDomain properties responses
    
    commit 80756e263846ab694984e749e8c626897331438f upstream.
    
    tb_xdp_properties_request() allocates room for 45 data dwords in its
    252-byte response buffer.  The XDomain length field is six bits wide,
    however, and a malicious peer can set it to 63.  After the fixed response
    fields are subtracted, the driver treats this as 48 data dwords.
    
    Commit 322e93448d90 ("thunderbolt: Clamp XDomain response data copy to
    allocation size") only bounds the copy against data_len.  If data_len is
    at least 48, memcpy() reads 192 bytes from the 180-byte res->data array,
    causing a 12-byte heap out-of-bounds read.  Commit 4db2bd2ed478
    ("thunderbolt: Limit XDomain response copy to actual frame size") limits
    the earlier copy but does not constrain this header-derived length.
    
    Reject response data lengths that exceed the allocated source buffer
    before copying them into the assembled property block.
    
    Fixes: d1ff70241a27 ("thunderbolt: Add support for XDomain discovery protocol")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <[email protected]>
    Signed-off-by: Mika Westerberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tick/broadcast: Plug clockevents replacement race [+ + +]
Author: Thomas Gleixner <[email protected]>
Date:   Wed Sep 16 13:12:17 2026 -0400

    tick/broadcast: Plug clockevents replacement race
    
    [ Upstream commit 113a9796effe3376d2ec5aabcca1fef4fef4cd62 ]
    
    朱恺乾 reported and decoded the following race condition when a broadcast
    device is replaced:
    
    CPUA                                    CPUB
     __tick_broadcast_oneshot_control()
       bc = tick_broadcast_device.evtdev;
                                            tick_install_broadcast_device(dev)
                                            clockevents_exchange_device(cur, dev)
                                               shutdown(cur);
                                               detach(cur);
                                               cur->handler = noop;
                                               tick_broadcast_device.evtdev = dev;
    
      tick_broadcast_set_event(bc, next_event); <- FAIL: arms a detached device.
    
    If the original broadcast device has a restricted interrupt affinity mask
    and the last CPU in that mask goes offline then the BUG() in
    tick_cleanup_dead_cpu() triggers because the clockevent device is not in
    detached state.
    
    The reason for this is that tick_install_broadcast_device() is not
    serialized vs. tick broadcast operations.
    
    The obvious cure is to serialize tick_install_broadcast_device() with
    tick_broadcast_lock against a concurrent tick broadcast operation.
    
    That requires to split clockevents_exchange_device() into two parts, one
    which does the exchange, shutdown and detach operation and the other which
    drops the module reference count. This is required because the module
    reference cannot be dropped while holding tick_broadcast_lock.
    
    Let clockevents_exchange_device() do both operations as before, but let the
    broadcast device code take the two step approach and do the device
    exchange under tick_broadcast_lock and drop the module reference count
    after releasing it.
    
    Fixes: f8381cba04ba ("[PATCH] tick-management: broadcast functionality")
    Reported-by: 朱恺乾 <[email protected]>
    Signed-off-by: Thomas Gleixner <[email protected]>
    Signed-off-by: Thomas Gleixner <[email protected]>
    Reviewed-by: Bradley Morgan <[email protected]>
    Tested-by: 刘术高 <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/87cymdsu0r.ffs@tglx
    [ Replaced scoped_guard() with a block containing guard() for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
tipc: destroy topsrv workqueues before closing connections [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Mon Sep 28 16:24:38 2026 +0800

    tipc: destroy topsrv workqueues before closing connections
    
    commit 3acdd44385bc7e2e57605e073691ce69cc5a960d upstream.
    
    tipc_topsrv_stop() closed subscriber connections while the topology
    server's send and receive workqueues were still running. Socket
    callbacks and subscription events could then queue more work, and
    in-flight send/recv work could drop the last connection reference
    during the conn_idr walk.
    
    That race produced several teardown failures: refcount_t addition on
    0 from conn_get() on a connection whose release was blocked on
    idr_lock, a subsequent use-after-free in tipc_conn_close(),
    queue_work() on an already destroyed workqueue from the listener
    data-ready callback, and an RCU stall in tipc_topsrv_exit_net()
    while the walk spun under idr_lock.
    
    Clear srv->listener under idr_lock so it acts as a shutdown flag,
    skip queue_work() once it is NULL, destroy the workqueues to flush
    in-flight work, and only then close the remaining connections.
    Refuse tipc_conn_lookup() after that flag is cleared, and drop
    idr_lock when the teardown walk finds no connection, so an
    in-flight subscription event cannot pin idr_in_use while the
    walk holds the lock.
    
    v3 supersedes the narrower in-thread diff Tung Quang Nguyen
    posted on 2026-09-23. It keeps his teardown order and adds the
    lookup refusal and the empty-idr unlock.
    
    Fixes: c5fa7b3cf3cb ("tipc: introduce new TIPC server infrastructure")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tipc: hold a reference to nodes found by link name [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Tue Sep 29 00:12:46 2026 +0800

    tipc: hold a reference to nodes found by link name
    
    commit 17e73bae400f6a434dc006e3bee92c94cf781954 upstream.
    
    tipc_node_find_by_name() returns a node after dropping its RCU read lock
    without taking a reference.  The LINK_SET, LINK_GET and LINK_RESET_STATS
    handlers then lock and access the node, racing with timer-driven cleanup of
    a down peer.  Generic netlink serialization does not exclude the node
    timer.
    
    The following interleaving can leave a handler using a freed node:
    
      CPU 0: find the node under RCU and release the node read lock
      CPU 1: tipc_node_timeout() clears the links and unlinks the down node
      CPU 1: drop the list and timer references, queuing tipc_node_free()
      CPU 0: leave the RCU read-side critical section
      CPU 1: complete the grace period and free the node
      CPU 0: acquire the node lock through the stale pointer
    
    LINK_SET also uses the node's media address after releasing the node lock,
    when passing queued packets to tipc_bearer_xmit().
    
    KASAN on v7.3-rc5 reported:
    
      BUG: KASAN: slab-use-after-free in _raw_read_lock_bh
      Write of size 4 at addr ffff88807e06f008 by task poc/92
      Call Trace:
       _raw_read_lock_bh                 kernel/locking/spinlock.c:287
       tipc_nl_node_set_link             net/tipc/node.c:2475
       genl_family_rcv_msg_doit          net/netlink/genetlink.c:1114
       genl_rcv_msg                      net/netlink/genetlink.c:1209
       netlink_rcv_skb                   net/netlink/af_netlink.c:2575
    
      Allocated by task 0:
       tipc_node_create                  net/tipc/node.c:539
       tipc_node_check_dest              net/tipc/node.c:1196
       tipc_disc_rcv                     net/tipc/discover.c:252
    
      Freed by task 92:
       kfree                             mm/slub.c:6801
       rcu_core                          kernel/rcu/tree.c:2919
    
      Last potentially related work creation:
       __call_rcu_common.constprop.0     kernel/rcu/tree.c:3181
       tipc_node_timeout                 net/tipc/node.c:814
    
    Acquire a reference to the selected node with kref_get_unless_zero() before
    leaving RCU, returning NULL if the node has already been released.  Release
    that reference on every caller exit after the last node access, including
    transmission in LINK_SET.  Keep the existing link lookup order and locking
    so concurrent link removal still takes the existing error paths.
    
    Fixes: 6a939f365bdb ("tipc: Auto removal of peer down node instance")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tipc: prevent GCM nonce reuse on peer key changes [+ + +]
Author: Jérémy Jean <[email protected]>
Date:   Thu Sep 24 20:21:05 2026 +0000

    tipc: prevent GCM nonce reuse on peer key changes
    
    [ Upstream commit 512ccd3d0e91e791fb37442aa0a2599aca19783d ]
    
    TIPC can encrypt traffic between nodes using a different transmit key
    for each node. In this mode, the AES-GCM nonce for a packet sent to a
    known peer consists of a 32-bit prefix (a per-key salt XOR the peer's
    address) followed by a 64-bit counter. That counter is stored in the
    peer's RX crypto object. When the peer reports a change in which key
    it uses to receive packets, TIPC resets this counter. The sender can
    still be using the same TX key and salt, so subsequent packets reuse
    earlier nonces. This nonce reuse breaks confidentiality and exposes
    GCM's authentication key. This makes forgeries trivial: an attacker
    can exploit CTR malleability to alter captured ciphertexts and use the
    recovered authentication key to compute a valid tag for the modified
    ciphertext, under the same key and nonce.
    
    Use the TX key's existing aead->seqno counter instead. All encryptions
    using that key object share the same atomic counter, so concurrent
    encryptions get distinct nonce counter values. The counter survives
    key activation and peer reconnection, and peer key-status reports
    cannot reset it. This prevents those transitions from causing nonce
    reuse while the same TX key remains installed.
    
    The nonce format is unchanged, and receivers do not require consecutive
    counter values, so sharing the counter across peers remains compatible
    with existing receivers. A pre-existing check still invokes key
    revocation in the unlikely event that the counter wraps to zero.
    
    Fixes: fc1b6d6de220 ("tipc: introduce TIPC encryption & authentication")
    Signed-off-by: Jérémy Jean <[email protected]>
    Reviewed-by: Tung Nguyen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tipc: protect node reset trace dump with node lock [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Wed Aug 26 03:01:41 2026 +0800

    tipc: protect node reset trace dump with node lock
    
    commit dddf197f29ba5e47a476dde82bf542ca2e0d5e5e upstream.
    
    The tipc_node_reset_links trace event asks tipc_node_dump() to walk the
    node's link entries. Unlike the other node events that request link data,
    this event runs without the node lock.
    
    This permits bearer teardown to free a link while the trace callback is
    dumping it:
    
      CPU 0                                CPU 1
      trace_tipc_node_reset_links()
        tipc_node_dump()
          l = n->links[0].link
                                           tipc_node_write_lock()
                                           kfree(l)
                                           n->links[0].link = NULL
                                           tipc_node_write_unlock()
          tipc_link_dump(l)
    
    tipc_link_dump() then dereferences the stale pointer. KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tipc_link_dump
      Read of size 4 by task poc/115
      Call Trace:
       tipc_link_dump+0x10cb/0x16b0
       tipc_node_dump+0x4bb/0x740
       trace_event_raw_event_tipc_node_class+0x258/0x360
       tipc_node_reset_links+0x14d/0x1a0
       tipc_rcv+0x13f5/0x3030
       tipc_udp_recv+0x4e3/0x670
      Allocated by task 0:
       tipc_link_create+0x1e1/0x1020
       tipc_node_check_dest+0x7d2/0x11a0
       tipc_disc_rcv+0xdbf/0x1430
      Freed by task 89:
       kfree+0x131/0x3c0
       tipc_node_link_down+0x267/0x4b0
       tipc_node_delete_links+0xec/0x160
       bearer_disable+0x107/0x260
    
    Take the node write lock around the trace event. This serializes the
    dump against tipc_node_link_down(delete=true), which frees the link
    under the same write lock.
    
    Fixes: eb18a510b5cd ("tipc: add trace_events for tipc node")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Reviewed-by: Tung Nguyen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tls: device: fix out-of-bounds write in tls_append_frag() [+ + +]
Author: Jiayuan Chen <[email protected]>
Date:   Tue Sep 1 07:27:16 2026 -0400

    tls: device: fix out-of-bounds write in tls_append_frag()
    
    [ Upstream commit b17cf742eaad70ae29ac558cefb3aa9bbeea03d4 ]
    
    Found with syzkaller and a local syzbot instance running on top of a
    netdevsim TLS offload emulation; tls_device.c is otherwise only reachable
    on a machine with a NIC that implements the offload.
    
    tls_push_data() only checks whether the open record still has room for
    another frag at the bottom of its loop, and the MSG_MORE early break
    skips that check.  The record survives to the next syscall with the frag
    count it already had, and tls_append_frag() does not check either, so
    with TLS_TX_ZEROCOPY_RO every splice(SPLICE_F_MORE) of a byte or two adds
    a non-coalescing pipe page and num_frags walks off the end of
    tls_record_info.frags[MAX_SKB_FRAGS].  Once the record is pushed,
    tls_push_record() runs the same index over sg_tx_data[MAX_SKB_FRAGS] and
    the sg_set_page() writes land on the destruct_work that follows it, which
    the workqueue then calls.
    
    The byte limit is fine because copy drops to 0 and the loop falls through
    to the same check; the frag count has no such feedback.
    
    Push the record rather than keep a full one open, which is what a plain
    TCP socket does - tcp_sendmsg_locked() uses tcp_mark_push() and
    new_segment in both the copy and the MSG_SPLICE_PAGES paths, and tls_sw
    already sets full_record when the sk_msg ring fills up, MSG_MORE or not.
    
      BUG: KASAN: slab-out-of-bounds in tls_append_frag ( net/tls/tls_device.c:269)
      Write of size 8 at addr ffff8881104d1530 by task tls_oob/450
    
      CPU: 2 UID: 0 PID: 450 Comm: tls_oob Not tainted 7.2.0-rc7+ #329 PREEMPT
      Call Trace:
       <TASK>
       dump_stack_lvl (lib/dump_stack.c:94 lib/dump_stack.c:120)
       print_report (mm/kasan/report.c:378 mm/kasan/report.c:482)
       kasan_report (mm/kasan/report.c:595)
       tls_append_frag (net/tls/tls_device.c:269)
       tls_push_data (net/tls/tls_device.c:518)
       tls_device_sendmsg (net/tls/tls_device.c:583)
       inet_sendmsg (net/ipv4/af_inet.c:865)
       sock_sendmsg (net/socket.c:775 net/socket.c:790 net/socket.c:813)
       splice_to_socket (fs/splice.c:884)
       do_splice (fs/splice.c:936 fs/splice.c:1349)
       __do_splice (fs/splice.c:1431)
       __x64_sys_splice (fs/splice.c:1634 fs/splice.c:1616)
       do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94)
       entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
       </TASK>
    
    and, once the record is pushed:
    
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:300:24
      index 18 is out of range for type 'skb_frag_t [17]'
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:301:41
      index 18 is out of range for type 'scatterlist [17]'
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:302:39
      index 18 is out of range for type 'scatterlist [17]'
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:307:38
      index 26 is out of range for type 'scatterlist [17]'
    
      kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
      BUG: unable to handle page fault for address: ffffea000411a680
      #PF: supervisor instruction fetch in kernel mode
      #PF: error_code(0x0011) - permissions violation
      Oops: Oops: 0011 [#1] SMP KASAN PTI
      Workqueue: ktls_device_destruct 0xffffea000411a680
      RIP: 0010:0xffffea000411a680
      Call Trace:
       <TASK>
       worker_thread (kernel/workqueue.c:3405 kernel/workqueue.c:3486)
       kthread (kernel/kthread.c:436)
       ret_from_fork (arch/x86/kernel/process.c:158)
       ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
       </TASK>
    
    Fixes: e8f69799810c ("net/tls: Add generic NIC offload infrastructure")
    Cc: [email protected]
    Signed-off-by: Jiayuan Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
 
tools: gpio: fix building from the top level with O= [+ + +]
Author: Sasha Levin <[email protected]>
Date:   Sun Oct 11 18:33:33 2026 -0400

    tools: gpio: fix building from the top level with O=
    
    commit 52336337f1a01ad803c7f3ddb23f40222e9ad58d upstream.
    
    "make O=<dir> tools/gpio" fails:
    
      Makefile:27: /tools/build/Makefile.include: No such file or directory
    
    tools/Makefile clears srctree, and the gpio Makefile only works it out
    again when building_out_of_srctree is not set, which the top-level
    Makefile sets for O= builds.
    
    Also work out srctree when it is empty, as tools/bpf/Makefile does
    since commit a89b2cbf71d64 ("tools, bpf: Fix build for 'make -s
    tools/bpf O=<dir>'").
    
    Fixes: 4a6a6f5c4aeed ("tools: gpio: Use !building_out_of_srctree to determine srctree")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Sasha Levin <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Bartosz Golaszewski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields [+ + +]
Author: Lee Jones <[email protected]>
Date:   Tue Oct 13 11:24:48 2026 +0000

    tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields
    
    commit a244c241593b5b38a08f0df2cb43c26574efbdcb upstream.
    
    In check_synth_field(), when a synthetic event field is a stacktrace
    (field->is_stack) and the histogram field is not a "long[" stacktrace
    array, validation falls through to the generic size and signedness
    comparison.
    
    Because parse_synth_field() sets a stacktrace field's type to
    "__data_loc unsigned long[]", its size is sizeof(u64) and
    synth_field_signed() marks it as signed.  Consequently, any 8-byte
    signed scalar histogram field passes the fallback check, and its scalar
    value is subsequently dereferenced as a kernel stacktrace pointer in
    get_field_size() and trace_stack().
    
    Furthermore, checking strstr(hist_field->type, "long[") is insufficient
    because tracepoint fields defined with __bitmask() or __rel_bitmask()
    also have type "__data_loc unsigned long[]" or "__rel_loc unsigned
    long[]", whilst create_hist_field() treats them as 4-byte scalar values
    without HIST_FIELD_FL_STACKTRACE.
    
    Propagate HIST_FIELD_FL_STACKTRACE to variable references and field
    variables (whilst excluding variable aliases from per-element
    stacktrace capture), and reject any mismatch between
    HIST_FIELD_FL_STACKTRACE and field->is_stack in check_synth_field().
    
    Cc: [email protected]
    Fixes: 00cf3d672a9d ("tracing: Allow synthetic events to pass around stacktraces")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Lee Jones <[email protected]>
    Acked-by: Masami Hiramatsu (Google) <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    [Lee: Omit create_var_field() and hist_trigger_elt_update() hunks as
          288709c9f3b0 ("tracing: Allow stacktraces to be saved as histogram
          variables") is not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tracing: Fix 64-bit and signed histogram fields on 32-bit kernels [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Thu Sep 17 10:55:32 2026 +0900

    tracing: Fix 64-bit and signed histogram fields on 32-bit kernels
    
    commit 443d23176812803d0fa182b8d05ef066a7b8271f upstream.
    
    DEFINE_HIST_FIELD_FN() reads a trace event field and widens it to the u64
    the histogram uses as a key or a value:
    
            type *addr = (type *)(event + hist_field->field->offset);
    
            return (u64)(unsigned long)*addr;
    
    unsigned long is 32 bits on a 32-bit kernel, so the intermediate cast
    discards the upper half of a 64-bit field, and widens a signed field by
    zero extension from 32 bits rather than sign extension from its own
    width. Five of the eight instantiations are wrong there: s64, u64, s32,
    s16 and s8.
    
    The cast came in with commit 79e577cbce4c ("tracing: Support string type
    key properly"), which also added hist_field_dynstring() and
    hist_field_pstring(). Those convert a char * to u64 and do warn without
    an unsigned long in between on 32-bit. DEFINE_HIST_FIELD_FN() converts an
    integer and never a pointer, so it gains nothing from the cast and only
    loses information.
    
    Drop the intermediate cast and let the usual arithmetic conversions widen
    *addr according to its own type. unsigned long is 64 bits on LP64, so the
    two forms are identical there and 64-bit kernels are unaffected.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 79e577cbce4c ("tracing: Support string type key properly")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Donggeun Yoo <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Fix hist trigger timestamps for buffered events [+ + +]
Author: Tengda Wu <[email protected]>
Date:   Tue Sep 29 10:40:15 2026 +0000

    tracing: Fix hist trigger timestamps for buffered events
    
    commit 9414ca3b99e5a7f1f3bf51c2a01b383e1b355dd0 upstream.
    
    Syzkaller triggered a WARN_ON_ONCE(!nest) warning:
    
      WARNING: kernel/trace/ring_buffer.c:821 at ring_buffer_event_time_stamp
      Call trace:
        ring_buffer_event_time_stamp
        hist_field_timestamp
        hist_fn_call
        event_hist_trigger
        event_triggers_call
        __event_trigger_test_discard
        trace_event_buffer_commit
        do_trace_event_raw_event_sched_switch
        trace_event_raw_event_sched_switch
    
    The warning is probabilistically reproducible and is related to syzkaller
    executing the following commands:
    
      echo 'prev_pid == 999999' > events/sched/sched_switch/filter
      echo 'hist:keys=common_timestamp' > events/sched/sched_switch/trigger
    
    The specific triggering process is as follows:
    
    CPU 0                                           CPU 1
    (context switching)                             (echo 'hist:keys=common_timestamp' > \
                                                            events/sched/sched_switch/trigger)
    do_trace_event_raw_event_##call
      trace_event_buffer_lock_reserve
        if (!tr->no_filter_buffering_ref &&
            trace_file->flags & EVENT_FILE_FL_FILTERED)
            return entry;  // return directly
                                                    event_hist_trigger_parse
                                                      hist_register_trigger
                                                        tracing_set_filter_buffering(file->tr, true);
                                                          tr->no_filter_buffering_ref++;
        __trace_buffer_lock_reserve
          rb_start_commit
            local_inc(&cpu_buffer->committing);  // skipped and not executed
      trace_event_buffer_commit
        __event_trigger_test_discard
          event_triggers_call
            event_hist_trigger
              hist_fn_call
                hist_field_timestamp
                  ring_buffer_event_time_stamp
                    nest = local_read(&cpu_buffer->committing);
                    WARN_ON_ONCE(!nest)  // trigger warning
    
    The root cause is that when an event file has a filter attached and the
    hist trigger has not yet been attached, trace_event_buffer_lock_reserve()
    writes the event into the per-CPU trace_buffered_event temp buffer instead
    of reserving it in the ring buffer, so cpu_buffer->committing is not
    incremented. When the event is later processed at commit time by a hist
    trigger, hist_field_timestamp() -> ring_buffer_event_time_stamp() sees a
    zero committing count, triggering WARN_ON_ONCE(!nest).
    
    tracing_event_time_stamp() was added by commit d8279bfc5e959 ("tracing:
    Add tracing_event_time_stamp() API") for exactly this case: if the event
    is the per-CPU trace_buffered_event, it returns the current ring buffer
    timestamp. But it never gained a caller. Use it in hist_field_timestamp(),
    so that a hist trigger that races onto a buffered event records the
    current time, which is only marginally later than when the event was
    recorded, instead of warning and recording a bogus timestamp.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: b94bc80df648 ("tracing: Use a no_filter_buffering_ref to stop using the filter buffer")
    Signed-off-by: Tengda Wu <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Fix the shift out of bounds in the log2 histogram modifier [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Wed Sep 16 09:27:35 2026 +0900

    tracing: Fix the shift out of bounds in the log2 histogram modifier
    
    commit 647c2f97fcb94bc642cefe6db004999974563f06 upstream.
    
    The .log2 key modifier files a value under its base-2 order:
    
      # echo 'hist:keys=bytes_req.log2' > events/kmem/kmalloc/trigger
    
    hist_field_log2() computes that as ilog2(roundup_pow_of_two(val)). The
    out-of-line form of roundup_pow_of_two() is
    
            return 1UL << fls_long(n - 1);
    
    which shifts by 64 on a 64-bit kernel both when n is 0, where n - 1
    wraps to ULONG_MAX, and when n is above 2^63. Both are ordinary keys,
    because the field fetch hands every value over as a u64: a syscall
    argument of 0 reaches the first, and one above 2^63 reaches the second.
    
    Keying sys_enter_lseek on offset.log2 and passing 0, 1, 2, 3, 1000,
    2^63+1 and U64_MAX gives
    
      { offset: ~ 2^1  } hitcount:          1
      { offset: ~ 2^10 } hitcount:          1
      { offset: ~ 2^2  } hitcount:          1
      { offset: ~ 2^0  } hitcount:          4
    
    Keys above 2^63 land in the lowest bucket. With CONFIG_UBSAN_SHIFT=y
    the shift is also reported:
    
      UBSAN: shift-out-of-bounds in include/linux/log2.h:57:13
      shift exponent 64 is too large for 64-bit type 'long unsigned int'
       __ubsan_handle_shift_out_of_bounds.cold+0xdd/0x1cb
       hist_fn_call.cold+0x8b/0xd9
       event_hist_trigger+0x1cc/0x790
       ftrace_syscall_enter+0x197/0x360
       do_syscall_64+0x402/0x4b0
    
    Use order_base_2(), which is ilog2(n - 1) + 1 for n > 1 and 0 below
    that. It returns what the old expression returned on every input the
    old one was defined for. Where it was not, 0 stays in bucket 0, which
    is where x86_64 had been putting it, and the keys above 2^63 move into
    bucket 64.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 4b94f5b7b4a5 ("tracing: Add hist trigger 'log2' modifier")
    Signed-off-by: Donggeun Yoo <[email protected]>
    Assisted-by: Claude:claude-fable-5
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Reject incomplete event filter expressions [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Fri Oct 23 10:46:20 2026 -0700

    tracing: Reject incomplete event filter expressions
    
    commit 1fdc4164e488916402badddbb1f51e9380dabb91 upstream.
    
    A non-empty expression normally finishes in predicate_parse()'s inner
    loop, which resolves the pending logical operators before jumping to
    finalization. If the input ends after an operator, possibly followed by
    unary '!' tokens, the outer loop instead falls through with unresolved
    operator state.
    
    For example, "common_pid == 1 || common_pid == 2 &&" leaves
    prog[0].target equal to -1. The second pass then reads prog[-1] before
    the forward-jump check can reject it. Depending on adjacent slab
    contents, it can also copy an out-of-bounds word into a branch target
    that passes the forward-only check. A self-targeted perf tracepoint
    counting event can reach this path through PERF_EVENT_IOC_SET_FILTER.
    
    Reject the outer-loop fallthrough when a predicate has already been
    parsed. This ensures that non-empty expressions only reach finalization
    after the inner loop has resolved their operators. Keep the existing
    no-filter error for input that has no predicates. Add a regression test
    for trailing logical operators and unary negations.
    
    Fixes: 80765597bc587 ("tracing: Rewrite filter logic to be simpler and faster")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Assisted-by: Codex:gpt-6-astra
    Acked-by: Masami Hiramatsu (Google) <[email protected]>
    Tested-by: JongHyuk Kim(MalHyuk) <[email protected]>
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Save the event file instead of the compatible histogram [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Tue Sep 15 08:47:54 2026 +0900

    tracing: Save the event file instead of the compatible histogram
    
    commit d5c42664fc094899af9aae5300b27fe8fdb658ef upstream.
    
    create_field_var_hist() creates a histogram on the matched event to
    supply a field variable, and records it on the target so it can be torn
    down later:
    
            hist_data = find_compatible_hist(target_hist_data, file);
            ...
            /* Save the compatible histogram information */
            var_hist->hist_data = hist_data;
    
    hist_data is not the histogram it creates. It is one that was already
    there, whose keys the new one copies. The saved pointer has a single
    user, unregister_field_var_hists(), which runs when the target is
    removed:
    
            file = hist_data->field_var_hists[i]->hist_data->event_file;
    
    find_compatible_hist() matches on keys alone, so it can pick one with no
    variables of its own. check_var_refs() then returns false and the user
    can remove it while the target still points at it:
    
     BUG: KASAN: slab-use-after-free in event_hist_trigger_free+0x2b2/0x320
     Read of size 8 at addr ffff8880093b90e0 by task init/1
    
     Freed by task 1:
      kfree+0x154/0x420
      event_hist_trigger_free+0x1d5/0x320
      event_hist_trigger_parse+0x35f3/0x69e0
      trigger_process_regex+0x1a6/0x250
    
    Save the event file instead. It is all the dereference ever wanted, and
    it does not go away when the user removes a trigger.
    
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Link: https://patch.msgid.link/[email protected]
    Fixes: 02205a6752f2 ("tracing: Add support for 'field variables'")
    Signed-off-by: Donggeun Yoo <[email protected]>
    Assisted-by: Claude:claude-fable-5
    Acked-by: Tom Zanussi <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Set the trace clock before registering the histogram trigger [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Wed Oct 14 07:58:06 2026 +0000

    tracing: Set the trace clock before registering the histogram trigger
    
    [ Upstream commit 6ede78d0563a2a3ae3e46f9c07cedb5d79645429 ]
    
    hist_register_trigger() puts the trigger on the global named_triggers
    list in cmd_ops->init(), and only then sets the trace clock:
    
            if (data->cmd_ops->init) {
                    ret = data->cmd_ops->init(data);
                    if (ret < 0)
                            goto out;
            }
    
            if (hist_data->enable_timestamps) {
                    ret = tracing_set_clock(file->tr, hist_data->attrs->clock);
                    if (ret) {
                            hist_err(tr, HIST_ERR_SET_CLOCK_FAIL, errpos(clock));
                            goto out;
                    }
    
    The clock string is not checked anywhere before that call, so a named
    trigger using common_timestamp with an unknown clock fails after it has
    already become findable. event_hist_trigger_parse() then frees it
    without taking it off the list, and the next lookup by name reads the
    freed object:
    
     ~# cd /sys/kernel/tracing/events/sched/sched_switch
     ~# echo 'hist:name=foo:keys=common_pid:ts=common_timestamp:clock=bogus' > trigger
     bash: echo: write error: Invalid argument
     ~# echo 'hist:name=foo:keys=common_pid' > trigger
    
      BUG: KASAN: slab-use-after-free in find_named_trigger+0xac/0xc0
      Read of size 8 at addr ffff88800915d760 by task init/1
       find_named_trigger+0xac/0xc0
       hist_register_trigger+0xc1/0x900
       event_hist_trigger_parse+0x3146/0x6af0
       event_trigger_write+0xce/0x160
      Freed by task 63:
       kfree+0x154/0x420
       trigger_kthread_fn+0xfd/0x160
    
    Set the clock before the trigger is registered, so that nothing which
    can fail runs after it is published, the way commit 6f86bdeab633
    ("tracing: Fix bad hist from corrupting named_triggers list") moved the
    registration below the rest of the setup.
    
    tracing_set_filter_buffering() is reference counted, so the init failure
    path has to drop the reference that the clock block now takes first.
    
    Cc: [email protected]
    Fixes: a4072fe85ba3 ("tracing: Add a clock attribute for hist triggers")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Donggeun Yoo <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    [Lee: Call data->ops->init(data->ops, data) as b052d70f7c9c ("tracing:
          Merge struct event_trigger_ops into struct event_command") and
          476705419518 ("tracing: Remove redundant trigger_ops params") are
          not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tracing: Unregister field variable histograms when the command fails [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Mon Sep 14 19:40:36 2026 +0900

    tracing: Unregister field variable histograms when the command fails
    
    commit 91c14d6c13096091c56304120aaa26e479130b8b upstream.
    
    An action that names a field on another event needs that field as a
    variable, so create_field_var_hist() registers a second hist trigger on
    that event to provide it, and records it in
    target_hist_data->field_var_hists[].
    
    If a later part of the same command fails, create_actions() returns an
    error and event_hist_trigger_parse() jumps to out_free. The write fails
    with -EINVAL and sched_switch gets no trigger, but:
    
      # echo 'hist:keys=pid:ts0=common_timestamp.usecs' >> \
          events/sched/sched_waking/trigger
      # echo 'my_synth u64 lat; int a; int b' >> synthetic_events
      # echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts0:\
          onmatch(sched.sched_waking).my_synth($wakeup_lat,prio,nosuchfld)'\
          >> events/sched/sched_switch/trigger
      # cat events/sched/sched_waking/trigger
      hist:keys=pid:vals=hitcount:ts0=common_timestamp.usecs:sort=hitcount:size=2048:clock=global [active]
      hist:keys=pid:vals=hitcount:synthetic_prio=prio:sort=hitcount:size=2048 [active]
    
    The second histogram is the one created for 'prio'. It is still active and
    still counting.
    
    out_free reaches destroy_field_var_hists(), which frees the
    field_var_hists[] entries, but never unregister_field_var_hists(), which is
    what removes the triggers and runs only from event_hist_trigger_free(). The
    entry is freed and the trigger is left with nothing tracking it.
    
    Unregister the field variable histograms in out_free as well, and record
    each one as soon as its trigger is registered rather than after the lookup
    that follows it, so no exit can leave a registered trigger untracked. The
    entry then belongs to field_var_hists[] and is released by
    destroy_field_var_hists(), so freeing it on that exit would be a double
    free.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 02205a6752f2 ("tracing: Add support for 'field variables'")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Donggeun Yoo <[email protected]>
    Assisted-by: Claude:claude-fable-5
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tty: abort break signalling on hangup [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 16:16:35 2026 -0400

    tty: abort break signalling on hangup
    
    [ Upstream commit 845a2737e0f5ffe5ca8d38de556012b0c9472cdd ]
    
    The break ioctls can race with hangup and end up calling into a tty
    driver for a device that is already gone or powered down.
    
    Drivers must handle this race, but TCSBRK and TCSBRKP should still be
    aborted to avoid calling back into the driver after a user-controlled
    timeout (possibly even after the tty has been reopened).
    
    Note that drivers should disable any break state on shutdown so just
    return on hangup (calling break_ctl() again is racy and will most likely
    fail for drivers handling the race).
    
    Fixes: f34d7a5b7010 ("tty: The big operations rework")
    Cc: stable <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tty: add break_wait kernel-doc [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Sep 25 11:42:22 2026 +0200

    tty: add break_wait kernel-doc
    
    [ Upstream commit 5dad87615c9861cfa366ca984b52f581e861df20 ]
    
    Add the missing kernel-doc description for the new break_wait field in
    struct tty_struct.
    
    Fixes: 845a2737e0f5 ("tty: abort break signalling on hangup")
    Reported-by: Randy Dunlap <[email protected]>
    Link: https://lore.kernel.org/[email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tty: amiserial: fix broken TIOCMIWAIT [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Sep 11 11:01:32 2026 +0200

    tty: amiserial: fix broken TIOCMIWAIT
    
    commit 615f35fd5aee169cc4881a8594f2fa234a4d0bb8 upstream.
    
    A change replacing interruptible_sleep_on() inadvertently broke the
    TIOCMIWAIT implementation which now immediately returns -EIO (unless
    there is a racing modem status update).
    
    Replace the old hangup (and signal) detection with a check for the
    TTY_IO_ERROR flag which is set on hangup.
    
    Fixes: 591cee0a3563 ("tty/amiserial: avoid interruptible_sleep_on")
    Reported-by: [email protected]
    Link: https://lore.kernel.org/[email protected]
    Cc: [email protected]   # 3.14
    Cc: Arnd Bergmann <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Reviewed-by: Jiri Slaby <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: finish kernel-doc of tty_struct members [+ + +]
Author: Jiri Slaby <[email protected]>
Date:   Fri Nov 26 09:15:49 2021 +0100

    tty: finish kernel-doc of tty_struct members
    
    [ Upstream commit 18e6c0751cf9ae0631a2623e31af2bf504f72c30 ]
    
    There are already pieces of kernel-doc documentation for struct
    tty_struct in tty.h. Finish the documentation for the members which were
    undocumented yet.
    
    It also includes tuning the already existing pieces like flow and ctrl,
    especially adding highlights to them.
    
    Signed-off-by: Jiri Slaby <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 5dad87615c98 ("tty: add break_wait kernel-doc")
    Signed-off-by: Sasha Levin <[email protected]>

tty: fix saved termios reset race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 17:31:49 2026 -0400

    tty: fix saved termios reset race
    
    [ Upstream commit 8df07fe93573e9e548d6645273e9bcb6eb74059e ]
    
    Resetting saved termios state on device registration is needed where a
    minor number can be reused for an entirely different device and where
    the old settings may prevent the port from even being opened (e.g. when
    CLOCAL is not set).
    
    Not all TTY drivers guarantee that the minor number is no longer in use
    when registering devices however, something which can lead to a
    use-after-free when closing a TTY (and saving its termios) races with
    re-registration.
    
    Add a new TTY_DRIVER_RESET_SAVED_TERMIOS flag to request that any saved
    termios state is reset on registration and only set it for drivers that
    make sure that the minor number is no longer in use.
    
    Fixes: 93857edd9829 ("tty: reset termios state on device registration")
    Reported-by: Chengfeng Ye <[email protected]>
    Link: https://lore.kernel.org/[email protected]
    Cc: [email protected]   # 4.12
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adapted the new flag to hexadecimal macro definitions and Greybus’s existing post-allocation flags assignment. ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: introduce and use tty_port_tty_vhangup() helper [+ + +]
Author: Jiri Slaby (SUSE) <[email protected]>
Date:   Thu Oct 8 22:16:48 2026 +0800

    tty: introduce and use tty_port_tty_vhangup() helper
    
    [ Upstream commit 2b5eac0f8c6e79bc152c8804f9f88d16717013ab ]
    
    This code (tty_get -> vhangup -> tty_put) is repeated on few places.
    Introduce a helper similar to tty_port_tty_hangup() (asynchronous) to
    handle even vhangup (synchronous).
    
    And use it on those places.
    
    In fact, reuse the tty_port_tty_hangup()'s code and call tty_vhangup()
    depending on a new bool parameter.
    
    Signed-off-by: "Jiri Slaby (SUSE)" <[email protected]>
    Cc: Karsten Keil <[email protected]>
    Cc: David Lin <[email protected]>
    Cc: Johan Hovold <[email protected]>
    Cc: Alex Elder <[email protected]>
    Cc: Oliver Neukum <[email protected]>
    Cc: Marcel Holtmann <[email protected]>
    Cc: Johan Hedberg <[email protected]>
    Cc: Luiz Augusto von Dentz <[email protected]>
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ Ting-Han: adjust context in uart_remove_one_port(), which is still
      called that and keeps its "ret" variable in this version ]
    Assisted-by: LLM
    Signed-off-by: Ting-Han Hou <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tty: port: fix tty_port_tty_vhangup() race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Thu Oct 8 22:16:49 2026 +0800

    tty: port: fix tty_port_tty_vhangup() race
    
    [ Upstream commit b48820de8c1a596c5b99775524dfce73c6576c5d ]
    
    Drivers rely on tty_port_tty_vhangup() to synchronously hang up their
    ports before tearing down resources as part of deregistration (e.g. on
    physical disconnect).
    
    If tty_port_tty_vhangup() races with another hangup it may however
    return before the port has been shut down. This is in turn can lead to
    use-after-free and NULL-pointer dereferences in racing ioctls (including
    a synchronous hangup) and in processing of racing asynchronous hangups
    (carrier loss).
    
    Add the missing serialisation to tty_port_tty_vhangup() and
    tty_port_hangup() so that the former does not return until the port has
    been shut down also when there is a racing hangup.
    
    Note that serial core does not use tty_port_hangup(), but it already
    holds the port mutex when clearing port->tty and shutting down the port
    in uart_hangup().
    
    Fixes: 7ca0ff9ab321 ("tty: Add a full port_close function")
    Cc: [email protected]   # 2.6.32: 2b5eac0f8c6e: tty: introduce and use tty_port_tty_vhangup() helper
    Cc: [email protected]   # 2.6.32
    Reported-by: [email protected]
    Link: https://lore.kernel.org/[email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ Ting-Han: use mutex_lock()/spin_lock_irqsave() instead of guard(),
      scoped_guard() and the tty_port_tty class, matching the existing code
      in this version of tty_port.c; tty_port_shutdown() has no kernel-doc
      here, so there is none to move ]
    Assisted-by: LLM
    Signed-off-by: Ting-Han Hou <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tty: reformat kernel-doc in tty_io.c [+ + +]
Author: Jiri Slaby <[email protected]>
Date:   Mon Oct 5 16:16:34 2026 -0400

    tty: reformat kernel-doc in tty_io.c
    
    [ Upstream commit 796a75a98762f14006d2f941163b589f7ebcdf87 ]
    
    Kernel-doc is a bit strict about some formatting. So fix these:
    1) When there is a tab in comments, it thinks the line is a continuation
       one. So the description of the functions end up as descriptions of
       the last parameter described. Remove the tabs.
    
    2) Remove newlines before parameters description and after the comments.
       This was not wrong per se, only inconsistent with the rest of the
       file.
    
    3) Add periods to the end of sentences where appropriate.
    
    4) Add "()" to function names and "%" to constants, so that they are
       properly highlighted.
    
    By the above, this patch also unifies these docs with the other
    kernel-doc's in this file.
    
    Signed-off-by: Jiri Slaby <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 845a2737e0f5 ("tty: abort break signalling on hangup")
    Signed-off-by: Sasha Levin <[email protected]>

tty: serial: max3100: shut down timer before freeing port [+ + +]
Author: Fan Wu <[email protected]>
Date:   Mon Oct 5 17:47:52 2026 -0400

    tty: serial: max3100: shut down timer before freeing port
    
    [ Upstream commit db0949bbd06db0a75b4b1076f1e25194be7d956a ]
    
    max3100_shutdown() stops the polling timer but returns early during
    system suspend. If the SPI device is unbound before resume, the serial
    core does not call max3100_shutdown() again, so max3100_remove() frees
    the port while the timer remains armed. max3100_timeout() may then
    access the freed port and re-arm the timer.
    
    Add final timer teardown to max3100_remove() and use
    timer_shutdown_sync() to prevent a racing callback from re-arming it.
    Also free the IRQ and destroy the workqueue there before freeing the
    port. Keep timer_delete_sync() in max3100_shutdown() so that a
    subsequent open() can re-arm the timer.
    
    The workqueue is created before request_irq() and destroyed on both
    request_irq() failure and normal shutdown. Its presence at remove thus
    identifies the IRQ left registered when suspend bypasses shutdown.
    
    Free the IRQ before destroying the workqueue, in both
    max3100_shutdown() and max3100_remove(), and cancel the pending work
    in between. free_irq() waits for a running interrupt handler to
    finish and no new handler can start afterwards, so a racing handler
    cannot queue work on a workqueue that is being destroyed; the
    force_end_work check in max3100_dowork() only narrows that window, as
    a handler delayed between the check and queue_work() could still run
    after the teardown has cleared the workqueue pointer. Cancelling the
    work also keeps destroy_workqueue() from waiting on a queued work item
    in case remove() ever runs while the freezable workqueue is still
    frozen, e.g. device removal during the resume window, before
    workqueues are thawed.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 7831d56b0a35 ("tty: MAX3100")
    Cc: [email protected] # 6.2+
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adapted IRQ teardown to use s->irq instead of the port’s irq field. ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: serial: qcom_geni_serial: Keep console RX functional after deep idle [+ + +]
Author: Viken Dadhaniya <[email protected]>
Date:   Tue Sep 15 18:56:28 2026 +0530

    tty: serial: qcom_geni_serial: Keep console RX functional after deep idle
    
    commit 63ef71d1474b5417b5b2dec700cd251c44a570d9 upstream.
    
    At baud rates up to 115200, the serial console uses only a 1 kBps keepalive
    vote for the GENI_TO_CORE ("qup-core") ICC path. This vote keeps the path
    active but does not request a QUP Core 2X clock rate.
    
    When the CPU enters a deeper idle state, the missing Core clock vote can
    leave the console RX path unresponsive.
    
    Use the 19.2 MHz Core 2X vote at low baud rates, while retaining the 50 MHz
    vote at higher baud rates, so that console RX remains functional after deep
    idle transitions.
    
    Fixes: 7cf563b2c846 ("tty: serial: qcom_geni_serial: Add interconnect support")
    Cc: [email protected]
    Reviewed-by: Konrad Dybcio <[email protected]>
    Signed-off-by: Viken Dadhaniya <[email protected]>
    Link: https://patch.msgid.link/20260915-correct-icc-bandwidth-vote-constants-v2-2-f78eb611204e@oss.qualcomm.com
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: tty_port: restore TTY_IO_ERROR on activation failure [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 17:12:47 2026 -0400

    tty: tty_port: restore TTY_IO_ERROR on activation failure
    
    [ Upstream commit 56964f6a31238fb41d5830bb42520c5b10ff7d8f ]
    
    Make sure to restore the TTY_IO_ERROR flag if activation fails to
    prevent I/O attempts on a port that is gone or powered down.
    
    This specifically avoids issues like kernel panic due to unclocked
    accesses or NULL-pointer dereferences when accessing powered down or
    deregistered ports when a TTY ioctl races with hangup and open.
    
    Note that the flag is set again in tty_port_close() but not restoring it
    on activation failure leaves a window where drivers fail to handle the
    ioctl-hangup race.
    
    Fixes: a9a37ec33a1b ("tty: tty_port: Move the IO_ERROR clear")
    Cc: stable <[email protected]>  # 2.6.33
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adapted to the existing activation-failure block with explicit mutex unlocking. ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: vcc: hold port lock when clearing tty pointer in vcc_cleanup [+ + +]
Author: Joshua Rogers <[email protected]>
Date:   Mon Aug 3 16:10:55 2026 +0200

    tty: vcc: hold port lock when clearing tty pointer in vcc_cleanup
    
    commit 03b49c991abb8d021ca6fe51cd173447236b0552 upstream.
    
    vcc_cleanup() sets port->tty to NULL without holding port->lock, racing
    with vcc_event() LDC callbacks that read port->tty under port->lock and
    then use tty->port. This can cause a use-after-free when the callback
    dereferences tty->port after cleanup has already destroyed and freed it.
    
    Assisted-by: AISLE:Snapshot
    Cc: stable <[email protected]>
    Signed-off-by: Joshua Rogers <[email protected]>
    Reviewed-by: Jiri Slaby <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: vcc: zero-initialize control packet in vcc_send_ctl() [+ + +]
Author: Joshua Rogers <[email protected]>
Date:   Mon Aug 3 16:10:54 2026 +0200

    tty: vcc: zero-initialize control packet in vcc_send_ctl()
    
    commit 1f71f565e3585da1098ff19ca3c24687dab59185 upstream.
    
    The stack-allocated struct vio_vcc pkt was partially initialized,
    leaving the tag.stype_env field uninitialized before being sent via
    ldc_write(), potentially leaking kernel stack data to the LDC peer.
    
    Assisted-by: AISLE:Snapshot
    Cc: stable <[email protected]>
    Signed-off-by: Joshua Rogers <[email protected]>
    Reviewed-by: Jiri Slaby <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: vt: fix memory leak in vc_allocate() [+ + +]
Author: Mingyu Wang <[email protected]>
Date:   Mon Oct 5 17:04:06 2026 -0400

    tty: vt: fix memory leak in vc_allocate()
    
    [ Upstream commit 5b114bfc1dfd88f9d50822d532f7f1fce0f7388a ]
    
    If the screen buffer allocation fails in vc_allocate(), the error handling
    path jumps to `err_free`. However, this path fails to release the unicode
    screen map attached to `vc->uni_pagedict_loc`.
    
    During the early stages of vc_allocate(), the unicode screen map is either
    newly allocated via con_set_default_unimap() or shares the default unicode
    map from a previously initialized console (which increments its refcount).
    If the subsequent kzalloc() for the screen buffer fails, the err_free path
    frees the vc structure but leaves the attached uni_pagedict with an
    elevated refcount. This results in an unreferenced object memory leak, as
    the reference to the dictionary is lost and its refcount can never reach
    zero.
    
    This issue was discovered by DevGen (an automated virtual device modeling
    fuzzer based on Syzkaller). During fuzzing with kernel fault injection
    (failslab) enabled, the fuzzer forcefully failed the kzalloc() for the
    screen buffer, exposing this error-handling path leak.
    
    Fix this by checking *vc->uni_pagedict_loc and calling con_free_unimap(vc)
    in the err_free path before kfree(vc). This safely decrements the refcount
    and releases the dictionary memory if this was the last reference. The
    explicit check is added to maintain consistency with other callers.
    
    Fixes: 34902b7f2754 ("tty: vt, get rid of weird source code flow")
    Cc: stable <[email protected]>
    Signed-off-by: Mingyu Wang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Replaced the upstream uni_pagedict_loc field with the existing vc_uni_pagedir_loc field. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
unicode: free the map after a grace period [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Oct 21 12:04:39 2026 -0400

    unicode: free the map after a grace period
    
    [ Upstream commit a96c5299bd7305eb984377681eb3222a57376405 ]
    
    generic_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and
    dereference the unicode map while a pathwalk in rcu mode holds nothing
    but rcu_read_lock(). The filesystems that use them, ext4, f2fs and
    tmpfs, drop the map with utf8_unload() from ->put_super(), which runs
    when the last reference to the mount goes away. A lookup that is still
    inside such a filesystem at that point reads a freed map.
    
    With a pathwalk held up in utf8_casefold_hash() while the last reference
    to a casefolded tmpfs goes away:
    
      BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950
      Read of size 8 at addr ff110001030fe658 by task walker/98
      Call Trace:
       <TASK>
       utf8nlookup+0x74c/0x950
       utf8byte+0x160/0x1560
       utf8_casefold_hash+0x167/0x230
       generic_ci_d_hash+0xdd/0x1c0
       link_path_walk+0x11ad/0x1d30
       path_lookupat+0x63/0xb00
       filename_lookup+0x1f1/0x5b0
       vfs_statx+0xd7/0x3b0
      [...]
      Allocated by task 94:
       __kmalloc_cache_noprof+0x249/0x560
       utf8_load+0x4e/0x570
       shmem_parse_opt_casefold.isra.0+0x92/0x270
      [...]
      Freed by task 97:
       kfree+0x1db/0x5b0
       shmem_put_super+0x72/0x170
       generic_shutdown_super+0x14c/0x530
       kill_anon_super+0x3a/0x60
       deactivate_locked_super+0x9c/0xf0
       cleanup_mnt+0x9f/0x130
    
    So far that has been hard to hit. umount(2) waits for a grace period
    in namespace_unlock() before it drops the mount, so only a mount whose
    last reference goes away elsewhere, like the close of a file or a chdir
    out of a lazily unmounted directory, can race a walker. So it is
    reachable.
    
    Delay the free until a grace period has passed. The map and the data
    table it holds a reference to then outlive any pathwalk that found the
    superblock before the mount went away. The reference on the data table
    module is dropped from the rcu callback as well. utf8-core is built in
    whenever CONFIG_UNICODE is set, so there is no module exit that would
    have to wait for the callbacks.
    
    Overlayfs points the s_encoding of an overlay at the map of its first
    layer without taking a reference of its own. That stays correct. The
    layer is held by the overlay, so its map is dropped only after the
    overlay is gone.
    
    Fixes: b886ee3e778e ("ext4: Support case-insensitive file name lookups")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: Replaced the custom RCU callback with kfree_rcu() because built-in Unicode tables need no module reference release. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
USB: cdc-acm: fix racy TIOCMIWAIT implementation [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Sep 7 11:51:30 2026 +0200

    USB: cdc-acm: fix racy TIOCMIWAIT implementation
    
    commit be4219dd98608736e13e0b790ef742b76a13254d upstream.
    
    Check the wakeup condition after adding the task to the waitqueue and
    updating the task state to avoid missing a racing modem status update or
    disconnect.
    
    Store the old icount on entry and do not update it in the completion
    handler to avoid missing events or reporting spurious ones (due to modem
    status changes before TIOCMIWAIT was called).
    
    Fixes: 5a6a62bdb925 ("cdc-acm: add TIOCMIWAIT")
    Cc: stable <[email protected]>
    Cc: Oliver Neukum <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
usb: cdns3: Fix NULL pointer dereference in cdns3_pci_probe [+ + +]
Author: Jie Deng <[email protected]>
Date:   Mon Aug 10 10:36:26 2026 +0800

    usb: cdns3: Fix NULL pointer dereference in cdns3_pci_probe
    
    commit e5052f2c5c73c1dcca42bafc0bc737af2b2af059 upstream.
    
    The Cadence USBSS controller is a two-function PCI device. The first
    probed function allocates the driver data and stores it with
    pci_set_drvdata(), while the second function reuses it via
    pci_get_drvdata() when pci_is_enabled() reports that the first
    function has already been probed.
    
    When the second function is probed while the first one has been
    enabled but has not yet set its driver data, pci_get_drvdata()
    returns NULL, and the subsequent wrap->devfn assignment dereferences
    a NULL pointer and crashes the kernel.
    logs:
    Call trace:
      cdns3_pci_probe+0xa4/0x300
      local_pci_probe+0x44/0xa8
      pci_call_probe+0x54/0x158
      pci_device_probe+0x84/0x100
      really_probe+0x184/0x3d0
      __driver_probe_device+0x80/0x178
      driver_probe_device+0x44/0xe8
      __driver_attach+0xec/0x1f8
      bus_for_each_dev+0x7c/0xe0
      driver_attach+0x28/0x38
      bus_add_driver+0x110/0x238
      driver_register+0x64/0x128
      __pci_register_driver+0x50/0x60
      cdns3_pci_driver_init+0x28/0x38
      do_one_initcall+0x5c/0x280
      do_initcalls+0x104/0x1d8
      kernel_init_freeable+0x140/0x218
      kernel_init+0x28/0x1f8
      ret_from_fork+0x10/0x20
    
    Return -EPROBE_DEFER in this case so that probing is retried after
    the first function has completed its probe.
    
    Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
    Cc: stable <[email protected]>
    Signed-off-by: Jie Deng <[email protected]>
    Acked-by: Peter Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: cdns3: fix use-after-free in cdns3_gadget_exit() [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 09:56:55 2026 +0000

    usb: cdns3: fix use-after-free in cdns3_gadget_exit()
    
    commit ebe9b68c396792c15d0ac690d592e449e74ed804 upstream.
    
    cdns3_gadget_start() arms two works on system_freezable_wq:
    pending_status_wq for the deferred ep0 status stage and aligned_buf_wq
    for realigned request buffers. Both handlers use the cdns3_device the
    works are embedded in, and cdns3_pending_setup_status_handler() also
    calls the ep0 request completion.
    
    cdns3_gadget_exit() does not wait for these works. It frees all
    endpoints and aligned buffers and drops the last reference to the
    gadget device, which frees priv_dev, so a work queued before the exit
    can run after the free.
    
    Fix this by waiting for both works after the gadget driver is unbound
    and the IRQ is freed, when no new work can be queued, and before the
    endpoints and buffers are released.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
    Cc: stable <[email protected]>
    Reported-by: Sicong Huang <[email protected]>
    Closes: https://lore.kernel.org/linux-usb/[email protected]/
    Suggested-by: Sicong Huang <[email protected]>
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Acked-by: Peter Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: core: clear both ep_in and ep_out for non-ep0 control endpoints [+ + +]
Author: Hui Peng <[email protected]>
Date:   Sun Sep 20 23:17:02 2026 +0000

    usb: core: clear both ep_in and ep_out for non-ep0 control endpoints
    
    commit 0e8baa78d872f2db440d8b9ded946ab8dceb89eb upstream.
    
    In usb_enable_endpoint(), non-zero control endpoints (where
    usb_endpoint_xfer_control(&ep->desc) is true) populate both
    dev->ep_in[epnum] and dev->ep_out[epnum] with the same struct
    usb_host_endpoint pointer.
    
    However, usb_disable_endpoint() only clears either dev->ep_out[epnum] or
    dev->ep_in[epnum] depending on the direction bit of epaddr when
    reset_hardware is set, leaving the opposite direction's array slot
    pointing to the disabled/freed endpoint.
    
    Clear both dev->ep_out[epnum] and dev->ep_in[epnum] when disabling a
    non-ep0 control endpoint with reset_hardware set, and update the
    function kerneldoc accordingly.
    
    Tested in QEMU against Linux 7.3.0-rc3 using dummy_hcd and raw-gadget to
    enumerate a USB device with a non-zero control endpoint
    (bEndpointAddress 0x01, bmAttributes USB_ENDPOINT_XFER_CONTROL),
    verifying that both dev->ep_in[1] and dev->ep_out[1] are cleared when
    the interface is disabled.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Hui Peng <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
USB: dwc2: shut down wakeup timer before freeing HCD state [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Mon Oct 5 13:15:51 2026 -0400

    USB: dwc2: shut down wakeup timer before freeing HCD state
    
    [ Upstream commit fd772af9512cdecb83de34a461801533828e77fd ]
    
    dwc2_wakeup_detected() accesses the DWC2 host state and can rearm the
    wakeup timer.  dwc2_hcd_free() currently deletes the timer only after
    freeing host-owned state, and timer_delete() does not synchronize a
    callback or prevent it from being queued again.
    
    Stop and shut down the timer in dwc2_hcd_release(), before the HCD
    resources are freed.  This covers both the HCD initialization error path
    and normal HCD removal.
    
    Fixes: 7359d482eb4d ("staging: HCD files for the DWC2 driver")
    Cc: stable <[email protected]>
    Assisted-by: Codex:GPT-5
    Signed-off-by: Runyu Xiao <[email protected]>
    Reviewed-by: Thinh Nguyen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adapted the timer removal hunk to match del_timer() instead of timer_delete(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
usb: dwc3: gadget: fix IRQ storm on invalid event buffer count [+ + +]
Author: Jiazi Liu <[email protected]>
Date:   Mon Oct 5 17:04:18 2026 -0400

    usb: dwc3: gadget: fix IRQ storm on invalid event buffer count
    
    [ Upstream commit 1ff77cbefe5a653ea12874c213ea4bd0d72c1067 ]
    
    When dwc3_check_event_buf() reads a GEVNTCOUNT value exceeding the
    event buffer length, commit 63ccd26cd1f6 ("usb: dwc3: gadget: check
    that event count does not exceed event buffer length") returns IRQ_NONE
    without writing back GEVNTCOUNT. Since the DWC3 interrupt is
    level-triggered, the uncleared IRQ source keeps the line asserted,
    causing a tight IRQ storm that accumulates 99,900 unhandled interrupts
    and triggers spurious.c:184 BUG -> kernel panic.
    
    The resulting call stack:
      __report_bad_irq+0xac/0xc8
      note_interrupt+0x340/0x468
      handle_irq_event+0xac/0xc0
      handle_fasteoi_irq+0x120/0x228
      gic_handle_irq+0x68/0x108
      ...
      kernel BUG at kernel/irq/spurious.c:184
    
    To reproduce, write a bogus value exceeding the event buffer length
    directly to the GEVNTCOUNT register:
    
      devmem <DWC3_BASE + 0xc40c> 4 0x1004
    
    Write the bogus count back to GEVNTCOUNT to clear the IRQ source,
    consistent with the stale event clearing pattern in
    dwc3_event_buffers_setup(), and schedule error recovery to
    reinitialize the controller.
    
    Fixes: 63ccd26cd1f6 ("usb: dwc3: gadget: check that event count does not exceed event buffer length")
    Cc: stable <[email protected]>
    Suggested-by: Thinh Nguyen <[email protected]>
    Signed-off-by: Jiazi Liu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Acked-by: Thinh Nguyen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Changed dwc3_writel() to pass dwc->regs for the existing register-write API. ]
    Signed-off-by: Sasha Levin <[email protected]>

usb: gadget: aspeed-vhub: cancel wake work on device removal [+ + +]
Author: Fan Wu <[email protected]>
Date:   Tue Sep 8 04:17:39 2026 +0000

    usb: gadget: aspeed-vhub: cancel wake work on device removal
    
    commit 20388c8d1d74c203fec8194c45cd31afdfab934e upstream.
    
    wake_work is armed from the gadget .wakeup callback to resume suspended
    downstream ports, and it is never cancelled in ast_vhub_remove(), so a
    work item queued before or during removal can run after devm has freed
    vhub and its ports, a use-after-free.
    
    Cancelling the work alone is not sufficient: usb_gadget_wakeup() takes
    no lock and the unbind path never clears wakeup_en, so a remote-wakeup
    request in flight on another CPU can re-arm the work after the cancel
    and before vhub is freed.
    
    ast_vhub_del_dev() already clears d->registered under vhub->lock before
    unregistering the gadget. Refuse the wakeup in ast_vhub_udc_wakeup()
    once d->registered is clear: the check and the schedule_work() are then
    atomic against the unbind, so a wakeup that passed before the flag was
    cleared is drained by the cancel_work_sync() after the del_dev loop,
    and one that arrives later returns without arming. Also move INIT_WORK()
    to the top of ast_vhub_probe(), since the probe error path reuses
    ast_vhub_remove() and would otherwise cancel a never-initialized work
    item.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 7ecca2a4080c ("usb/gadget: Add driver for Aspeed SoC virtual hub")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Reviewed-by: Benjamin Herrenschmidt <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: gadget: at91_udc: Convert to platform remove callback returning void [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Fri Sep 4 10:00:21 2026 -0400

    usb: gadget: at91_udc: Convert to platform remove callback returning void
    
    [ Upstream commit cbd1b152519a581bfe14fb6b14ea6e57cca426c1 ]
    
    The .remove() callback for a platform driver returns an int which makes
    many driver authors wrongly assume it's possible to do error handling by
    returning an error code. However the value returned is ignored (apart
    from emitting a warning) and this typically results in resource leaks.
    
    To improve here there is a quest to make the remove callback return
    void. In the first step of this quest all drivers are converted to
    .remove_new(), which already returns void. Eventually after all drivers
    are converted, .remove_new() will be renamed to .remove().
    
    In the error path emit an error message replacing the (less useful)
    message by the core. Apart from the improved error message there is no
    change in behaviour.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: c27d13ce4bab ("usb: gadget: at91_udc: drain polled-VBUS timer/work before udc is freed")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: gadget: at91_udc: drain polled-VBUS timer/work before udc is freed [+ + +]
Author: Fan Wu <[email protected]>
Date:   Fri Sep 4 10:00:22 2026 -0400

    usb: gadget: at91_udc: drain polled-VBUS timer/work before udc is freed
    
    [ Upstream commit c27d13ce4bab80fbdf6523928071b6c24b37606c ]
    
    In polled-VBUS mode (board.vbus_pin && board.vbus_polled), probe arms a
    self-restarting cycle: at91_vbus_timer() schedules vbus_timer_work, and
    at91_vbus_timer_work() calls at91_vbus_update() and re-arms the timer via
    mod_timer(). Both recover the same udc through container_of and dereference
    it on every iteration.
    
    Neither teardown path cancels this cycle. udc is devm-allocated, so it is
    freed after at91udc_remove() returns, and is likewise freed when probe
    fails and devres runs. A timer callback or work item that is pending or
    running at either point dereferences the freed udc.
    
    Add at91_udc_shutdown_vbus_timer() and call it from at91udc_remove() and
    from the usb_add_gadget_udc() failure path in probe; the remaining probe
    error paths fail before the timer is armed. timer_shutdown_sync() waits
    for a running callback and clears timer->function, which makes the work
    handler's mod_timer() a permanent no-op; cancel_work_sync() then drains
    any pending or running work whose re-arm attempt now does nothing. The
    timer must be shut down first, since cancelling the work alone would let
    the timer re-queue it. The guard mirrors probe: in IRQ mode the timer and
    work_struct are never initialized.
    
    This does not require a fault; a normal driver unbind can interleave with
    an already queued work item.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 4037242c4f5f ("ARM: 6209/3: at91_udc: Add vbus polarity and polling mode")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
USB: gadget: dummy-hcd: Fix wait for outstanding request completions [+ + +]
Author: Alan Stern <[email protected]>
Date:   Sun Sep 20 17:37:34 2026 -0400

    USB: gadget: dummy-hcd: Fix wait for outstanding request completions
    
    commit b263ff9b0fc5c1f371d65c4eb196b31263d039ff upstream.
    
    The dummy-hcd driver emulates synchronize_irq() by waiting until its
    private callback_usage counter drops to 0 (with the private lock not
    held).  This counter is incremented whenever a gadget driver callback
    occurs (which requires the private lock to be dropped), but not when a
    request completion handler is called.
    
    This is an oversight.  Request completion is triggered by timer
    interrupts (emulating device IRQs in a real UDC), and the interrupt
    handlers are supposed to have completed when the synchronize_irq()
    emulation routine returns -- they aren't supposed to be in the middle
    of a completion callback.  If this happens it can lead to a gadget
    driver's unbind routine running before all outstanding request
    completions have finished, maybe even allowing the gadget driver's
    module to be unloaded while a completion handler is still running.
    
    Fix the oversight by incrementing the callback_usage value across
    request completion callbacks.
    
    Link: https://lore.kernel.org/linux-usb/[email protected]/
    Fixes: 7dbd8f4cabd9 ("USB: dummy-hcd: Fix erroneous synchronization change")
    Tested-by: Minseo Kim <[email protected]>
    Signed-off-by: Alan Stern <[email protected]>
    Cc: stable <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
usb: gadget: f_fs: Fix NULL pointer dereference in FUNCTIONFS_ENDPOINT_DESC [+ + +]
Author: Yuchao Zhang <[email protected]>
Date:   Fri Sep 18 08:54:38 2026 +0800

    usb: gadget: f_fs: Fix NULL pointer dereference in FUNCTIONFS_ENDPOINT_DESC
    
    commit 9cd072788c76595529eb38f42bf94d23852f8534 upstream.
    
    When user space sets up FunctionFS with only full-speed descriptors
    (e.g., flags = FUNCTIONFS_HAS_FS_DESC) and the gadget operates at a
    higher speed (such as USB_SPEED_HIGH or USB_SPEED_SUPER),
    config_ep_by_speed() detects that the function lacks descriptors for
    the current speed, logs a warning, and falls back to full-speed
    descriptors. The endpoint is then successfully enabled via
    usb_ep_enable(), and epfile->ep becomes valid.
    
    However, when user space subsequently issues the FUNCTIONFS_ENDPOINT_DESC
    ioctl to query the endpoint descriptor, ffs_epfile_ioctl() selects the
    descriptor index solely based on gadget->speed:
    
            switch (epfile->ffs->gadget->speed) {
            case USB_SPEED_SUPER:
            case USB_SPEED_SUPER_PLUS:
                    desc_idx = 2;
                    break;
            case USB_SPEED_HIGH:
                    desc_idx = 1;
                    break;
            default:
                    desc_idx = 0;
            }
            desc = epfile->ep->descs[desc_idx];
            memcpy(&desc1, desc, desc->bLength);
    
    Because user space only supplied full-speed descriptors,
    epfile->ep->descs[1] is NULL. Dereferencing desc->bLength triggers an
    immediate kernel NULL pointer dereference panic.
    
    Fix this by falling back through lower speed descriptors if the current
    speed descriptor was not supplied, matching the fallback logic in
    config_ep_by_speed() and historical f_fs behavior. If still missing,
    fall back to epfile->ep->ep->desc (the active descriptor), and return
    -EINVAL safely if no valid descriptor is found. In addition, mark desc
    as const to match struct usb_ep::desc and avoid discarding qualifiers.
    
    Fixes: c559a3534109 ("usb: gadget: f_fs: add ioctl returning ep descriptor")
    Cc: [email protected]
    Signed-off-by: Yuchao Zhang <[email protected]>
    Acked-by: Michał Nazarewicz <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: gadget: f_mass_storage: fix null pointer dereference in fsg_common_set_num_buffers() [+ + +]
Author: Jeffin Philip <[email protected]>
Date:   Wed Sep 9 22:22:33 2026 -0400

    usb: gadget: f_mass_storage: fix null pointer dereference in fsg_common_set_num_buffers()
    
    [ Upstream commit 2c0f5ca48674a5b5f9fa4a9c3325aa48053af0bc ]
    
    Previously fsg_num_buffers_validate() was removed as it was not
    necessary due to Kconfig setting the limits for n from 2 to 256 with
    default as 2. However, setting the page content in such a way that
    kstrtou8() reflects n value as either 0 or 1 bypasses these
    restrictions leading to a null pointer dereference if n is 0. Fix
    this by adding a check for n < 2 and returning -EINVAL if n is
    either 0 or 1 consistent with Kconfig logic.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=791be35f1fbcc85d06d7
    Fixes: fe5a6c48fd95 ("usb: gadget: storage: get rid of fsg_num_buffers_validate()")
    Cc: stable <[email protected]>
    Signed-off-by: Jeffin Philip <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ adjusted context to retain the branch’s existing kcalloc() call instead of kzalloc_objs(). ]
    Signed-off-by: Sasha Levin <[email protected]>

usb: gadget: f_uac1_legacy: validate bRequest index in generic_{set,get}_cmd [+ + +]
Author: Liu Chao <[email protected]>
Date:   Mon Sep 21 15:25:51 2026 +0800

    usb: gadget: f_uac1_legacy: validate bRequest index in generic_{set,get}_cmd
    
    commit 9062d50e75c24dc7911be05c9b1719b3b256af15 upstream.
    
    generic_set_cmd() and generic_get_cmd() use the low nibble of
    ctrl->bRequest as an index into con->data[]:
    
        u8 cmd = (ctrl->bRequest & 0x0F);  /* 0 .. 15 */
        ...
        con->data[cmd] = value;            /* OOB when cmd >= 5 */
    
    struct usb_audio_control (include/linux/usb/audio.h) declares data as
    a 5-element array, so indices 5 through 15 write (or read) up to 44
    bytes past the end of the array on the heap.
    
    A malicious USB host can craft a class-specific SET_CUR / GET_CUR
    request with an arbitrary bRequest value, triggering the out-of-bounds
    access from an IRQ completion handler with no further preconditions.
    
    Add an ARRAY_SIZE() guard to both functions.
    
    Fixes: c47d7b09891a ("USB: audio: add USB audio class definitions")
    Cc: stable <[email protected]>
    Reviewed-by: Weibin Liu <[email protected]>
    Signed-off-by: Liu Chao <[email protected]>
    Reviewed-by: Ivy Lopez <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: hub: use shorter 120ms post resume hold for SS root hubs [+ + +]
Author: Lovekesh Solanki <[email protected]>
Date:   Thu Sep 3 16:59:03 2026 +0530

    usb: hub: use shorter 120ms post resume hold for SS root hubs
    
    commit 29480b05e6e226594dc11ccf2a036fbd5cdd0e42 upstream.
    
    Holding a USB3 hub PM runtime reference for 200ms at hub resume triggers
    an AMD platform issue.  Users running Android adb report crashes after
    adb has been polling and waking up the USB subsystem once a second for
    some time.  Vendors are working on a solution.  Disabling USB runtime PM
    is one way to prevent this issue, but it is also proven that reducing the
    hold time to 120ms in resume also mitigates it.  See Link for more
    details.
    
    Reducing the hold time to 120ms for the USB3 roothub is in itself a valid
    change and optimization, as the current 200ms is excessive: a root hub
    has no upstream suspended hub whose wake propagation needs to be
    accounted for, but still need some time for USB3 link training to
    complete.
    
    Keep the 200ms hold for external hubs that commit 8f5b7e2bec1c
    ("usb: hub: fix detection of high tier USB3 devices behind suspended
    hubs") is intended for.
    
    Reported-by: Mathieu Fluhr <[email protected]>
    Link: https://lore.kernel.org/all/CAPyJwA_D9qw0T72f8zwM1yKjP+To=maVANbcdsWM7yRmbBxYvw@mail.gmail.com/
    Cc: stable <[email protected]>
    Fixes: 8f5b7e2bec1c ("usb: hub: fix detection of high tier USB3 devices behind suspended hubs")
    Signed-off-by: Lovekesh Solanki <[email protected]>
    Acked-by: Mathias Nyman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: octeon-hcd: fix the FIFO-flush timeout computation [+ + +]
Author: Orgad Shaneh <[email protected]>
Date:   Mon Oct 5 10:03:37 2026 -0400

    usb: octeon-hcd: fix the FIFO-flush timeout computation
    
    [ Upstream commit 4c7a1b9f1f1979f2b3b69428ada12680695159c2 ]
    
    cvmx_wait_tx_rx() computes its 100us deadline from
    (u64)octeon_get_clock_rate - the address of the function, not its
    return value; the parentheses have been missing since the
    CVMX_WAIT_FOR_FIELD32 macro became a function. The cast makes it
    compile silently, and the resulting deadline is effectively infinite.
    
    On a healthy controller the flush bit clears on the first read and
    nothing is noticed. On a controller whose PHY did not come up (for
    example when the reference-clock configuration is wrong for the board),
    txfflsh/rxfflsh never clear and probe spins forever in __delay() -
    observed as a hard hang with a soft-lockup splat on a CN5020 board,
    where the board watchdog then resets the system with no console output.
    
    Call the function, restoring the 100us timeout the code always
    intended.
    
    Fixes: 3e195a80e096 ("Staging: octeon-usb: Replaces CVMX_WAIT_FOR_FIELD32 macro with a function")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Orgad Shaneh <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

usb: ohci-da8xx: disable controller wakeup on cleanup [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Sep 14 21:20:08 2026 -0400

    usb: ohci-da8xx: disable controller wakeup on cleanup
    
    commit 901197dd4c7dcffbf97426487d4c047555c98554 upstream.
    
    The OHCI core marks controllers with RemoteWakeupConnected as
    wakeup-capable. Probe enables wakeup, but neither removal nor a later
    notifier registration failure disables it, leaving the wakeup source
    attached.
    
    Disable controller wakeup after removing the HCD on both paths.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: a6eeeb9f45b5 ("USB: Update USB default wakeup settings")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: ohci-s3c2410: disable controller wakeup on removal [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Sep 14 21:20:09 2026 -0400

    usb: ohci-s3c2410: disable controller wakeup on removal
    
    commit 8dd8451c527e2a723bca20da5a6d724b8592551f upstream.
    
    Probe enables controller wakeup after the OHCI core marks controllers with
    RemoteWakeupConnected as wakeup-capable. Removal does not undo this, so the
    wakeup source can remain attached after driver unbind.
    
    Disable controller wakeup after removing the HCD.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: a6eeeb9f45b5 ("USB: Update USB default wakeup settings")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: ohci-spear: disable controller wakeup on removal [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Oct 5 11:10:52 2026 -0400

    usb: ohci-spear: disable controller wakeup on removal
    
    [ Upstream commit b1b0f8bdbbc891a4ee7f3b1a878c633e02b7bbeb ]
    
    Probe enables controller wakeup after the OHCI core marks controllers with
    RemoteWakeupConnected as wakeup-capable. Removal does not undo this, so the
    wakeup source can remain attached after driver unbind.
    
    Disable controller wakeup after removing the HCD.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: a6eeeb9f45b5 ("USB: Update USB default wakeup settings")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

usb: ohci-spear: Remove unnecessary NULL check before clk_disable_unprepare() [+ + +]
Author: Chen Ni <[email protected]>
Date:   Mon Oct 5 11:10:51 2026 -0400

    usb: ohci-spear: Remove unnecessary NULL check before clk_disable_unprepare()
    
    [ Upstream commit a891b9aebcc7406fe2f439d184bac3948fb08645 ]
    
    clk_disable_unprepare() already checks NULL by using IS_ERR_OR_NULL.
    Remove unneeded NULL check for clk here.
    
    Signed-off-by: Chen Ni <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: b1b0f8bdbbc8 ("usb: ohci-spear: disable controller wakeup on removal")
    Signed-off-by: Sasha Levin <[email protected]>

usb: ohci-st: disable controller wakeup on removal [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Sep 14 21:20:11 2026 -0400

    usb: ohci-st: disable controller wakeup on removal
    
    commit 08b2ccd7eb7e41f77a04a09112ca3edcc588e3f0 upstream.
    
    Probe enables controller wakeup after the OHCI core marks controllers with
    RemoteWakeupConnected as wakeup-capable. Removal does not undo this, so the
    wakeup source can remain attached after driver unbind.
    
    Disable controller wakeup after removing the HCD.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: d115837259ad ("usb: host: ohci-st: Add OHCI driver support for ST STB devices")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Reviewed-by: Patrice Chotard <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
USB: serial: clean up core error labels [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 17:54:19 2026 -0400

    USB: serial: clean up core error labels
    
    [ Upstream commit 96a83c95c3da5ba55ea2cf6ce87de10fc03417a9 ]
    
    Clean up the core error labels by consistently naming them after what
    they do rather than after from where they are jumped to.
    
    Reviewed-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Stable-dep-of: 646e5b28b4fd ("USB: serial: fix driver deregistration order")
    Signed-off-by: Sasha Levin <[email protected]>

USB: serial: cp210x: add Corsair AX1500i Power Supply [+ + +]
Author: Jérémy Carrat <[email protected]>
Date:   Thu Sep 10 18:26:09 2026 +0200

    USB: serial: cp210x: add Corsair AX1500i Power Supply
    
    commit d84e27d87738634b92001500435ae4dadba10a13 upstream.
    
    The Corsair AX1500i power supply exposes its Corsair Link monitoring
    interface on a mini-USB port through an on-board CP2103, using a
    Corsair-specific product ID. Without the ID in the table no driver binds
    and no tty is created.
    
    Tested by forcing the driver association with
    
      echo 1b1c 1c02 > /sys/bus/usb-serial/drivers/cp210x/new_id
    
    and then setting the serial port to 115200 8N1. Adding the ID is sufficient
    to talk to the device: the tty reaches a USB-to-SMBus bridge sitting behind
    the UART, which identifies itself as "USB to SMB Bridge (Firmware by Ross
    Fosler)" version 0.9 and relays PMBus reads to the power supply controller.
    Input voltage and current, input and output power, internal temperature and
    fan speed were all read back on an AX1500i.
    
      [    7.806181] usb 3-14: New USB device found, idVendor=1b1c, idProduct=1c02, bcdDevice= 1.00
      [  698.526754] usbcore: registered new interface driver cp210x
      [  698.526767] usbserial: USB Serial support registered for cp210x
      [  698.527863] cp210x 3-14:1.0: cp210x converter detected
      [  698.529263] usb 3-14: cp210x converter now attached to ttyUSB0
    
    The related AX1600i (1b1c:1c11, iProduct "USB API") is expected to be the
    same kind of device but has not been tested here, so it is not added.
    
    Cc: [email protected]
    Signed-off-by: Jérémy Carrat <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: fix driver deregistration order [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 17:54:20 2026 -0400

    USB: serial: fix driver deregistration order
    
    [ Upstream commit 646e5b28b4fdbc1b828a2398d6ced2c1dd308a46 ]
    
    USB serial driver modules register one driver for the USB bus and one or
    more drivers for the ports on the USB serial bus.
    
    When unloading a driver module, the USB driver must be deregistered
    before the USB serial bus drivers so that I/O is stopped before
    unbinding the ports to avoid use-after-free in completion handlers
    accessing port data.
    
    Note that the "new_id" attributes must first be removed to prevent new
    ids from being added and triggering a probe of the USB driver after it
    has been deregistered.
    
    Fixes: 765e0ba62613 ("usb-serial: new API for driver registration")
    Cc: [email protected]      # 3.4
    Cc: Alan Stern <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

USB: serial: fix dynamic id driver deregistration race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Aug 21 17:45:44 2026 +0200

    USB: serial: fix dynamic id driver deregistration race
    
    commit 63594e8ffe097bc0b7639936f33799a7653dded2 upstream.
    
    Only free the dynamic ids after having deregistered the driver and
    removed the "new_id" attribute to avoid leaking any id added by a racing
    write to the attribute.
    
    Fixes: 93bacefc4cc0 ("USB serial: add dynamic id support to usb-serial core")
    Cc: [email protected]      # 2.6.21
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: fix ioctl hangup race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 19:15:00 2026 -0400

    USB: serial: fix ioctl hangup race
    
    [ Upstream commit ae0e61d95677efa778379853e495d748e6efbf95 ]
    
    The tty ioctls can race with hangup and end up calling into a tty driver
    for a device that is already gone or powered down.
    
    Serialise the callbacks using the tty port mutex and add the missing
    checks to make sure the port has not been hung up before accessing port
    driver data or hardware.
    
    This specifically avoids dereferencing a NULL-pointer if a device is
    disconnected during lengthy break signalling.
    
    Note that TIOCGICOUNT and TIOCMIWAIT do not access port driver data or
    hardware and are therefore not affected by the race.
    
    Fixes: f34d7a5b7010 ("tty: The big operations rework")
    Reported-by: Nick Bowler <[email protected]>
    Link: https://lore.kernel.org/all/CADyTPExB2kYOOwkO0JqGhKaYVDqO9uS9WCw0J=MCTdVhcGOogA@mail.gmail.com/
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/r/[email protected]
    Cc: [email protected]      # 2.6.26
    Signed-off-by: Johan Hovold <[email protected]>
    [ sashal: Adapted to void-returning break_ctl() and the older termios signature while omitting hunks for absent XR RS-485 handlers. ]
    Signed-off-by: Sasha Levin <[email protected]>

USB: serial: fix port tear down use-after-free [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Aug 21 17:45:43 2026 +0200

    USB: serial: fix port tear down use-after-free
    
    commit 33c920f7c5952dfc42d1b8ea6efe16b1f0bb0c5b upstream.
    
    Some drivers for multiport devices access port driver data from
    completion handlers of shared URBs submitted at attach() or first open()
    and stopped at disconnect() or last close(), respectively.
    
    A simple NULL check before accessing the driver data makes sure that a
    port state container has at least been allocated, but a completion
    handler can still race with port tear down.
    
    Reorder the disconnect handling so that ports are not deregistered (and
    their driver data freed) until after all ports have been hung up and the
    driver disconnect() callback has run so that all I/O has been stopped.
    
    Fixes: 2d93148ab698 ("USB: serial: fix lifetime and locking problems")
    Reported-by: [email protected]
    Link: https://lore.kernel.org/all/[email protected]/
    Cc: [email protected]      # 2.6.30
    Cc: Alan Stern <[email protected]>
    Reviewed-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Compal EXC-T1 support [+ + +]
Author: Ian Lin <[email protected]>
Date:   Fri Sep 4 16:00:46 2026 +0800

    USB: serial: option: add Compal EXC-T1 support
    
    commit b51faf3f2e307f114854bbe6d495f03cd5370686 upstream.
    
    The Compal EXC-T1 is a Qualcomm MDM9207-based LTE modem which reports
    "EXC-x1" as its USB product string. It exposes diagnostic, modem, AT,
    and NMEA ports as vendor-specific interfaces with subclass 0x10 and
    protocols 0x01 through 0x04.
    
    Add exact interface matches for these four ports, leaving the ff/ff/ff
    interface unbound.
    
    Relevant output from usb-devices:
    
    T:  Bus=03 Lev=02 Prnt=03 Port=03 Cnt=01 Dev#=  6 Spd=480  MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=04b7 ProdID=4d22 Rev=03.18
    S:  Manufacturer=CEI
    S:  Product=EXC-x1
    C:  #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=500mA
    I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=10 Prot=01 Driver=option
    I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=02 Driver=option
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=03 Driver=option
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=04 Driver=option
    I:  If#= 4 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=05 Driver=qmi_wwan
    
    Tested on a Compal EXC-T1 modem using an Ubuntu kernel build. The four
    serial interfaces bound to option and exposed ttyUSB3 through ttyUSB6.
    
    Assisted-by: Codex:GPT-5
    Signed-off-by: Ian Lin <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Compal EXM-G1x support [+ + +]
Author: Ian Lin <[email protected]>
Date:   Mon Aug 31 16:44:05 2026 +0800

    USB: serial: option: add Compal EXM-G1x support
    
    commit 7f11480cda081de78a05d8c97073df66326b50b3 upstream.
    
    The Compal EXM-G1x is a Qualcomm SDX12-based LTE modem. Add support for
    its vendor-specific serial interfaces with protocols 0x30, 0x40, and
    0x60.
    
    Relevant output from usb-devices:
    
    T:  Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  4 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs=  1
    P:  Vendor=04b7 ProdID=8217 Rev=05.04
    S:  Manufacturer=COMPAL
    S:  Product=EXM-G1x
    C:  #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA
    I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=option
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    I:  If#= 4 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#= 8 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan
    
    Tested on a Compal EXM-G1x modem.
    
    Assisted-by: Codex:GPT-5
    Signed-off-by: Ian Lin <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Quectel EG060W [+ + +]
Author: Carlo Szelinsky <[email protected]>
Date:   Wed Aug 12 13:42:28 2026 +0300

    USB: serial: option: add Quectel EG060W
    
    commit cd243401994880b8b6810c53177bce56eebaece5 upstream.
    
    Add Quectel EG060W with product ID 0x6004.
    The three vendor-specific interfaces are DIAG, NMEA and AT; the CDC-NCM
    data interfaces are handled by the cdc_ncm driver.
    
    T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
    D:  Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
    P:  Vendor=2c7c ProdID=6004 Rev= 3.18
    S:  Manufacturer=Quectel
    S:  Product=EG060W-EAAA
    S:  SerialNumber=123456789ABCD
    C:* #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=  2mA
    A:  FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0d Prot=00
    I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver=cdc_ncm
    E:  Ad=82(I) Atr=03(Int.) MxPS=  16 Ivl=32ms
    I:  If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_ncm
    I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_ncm
    E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
    E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:* If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
    E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:* If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
    E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    
    Cc: [email protected]
    Signed-off-by: Carlo Szelinsky <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Quectel RG660QB [+ + +]
Author: Sebastian Sjoholm <[email protected]>
Date:   Thu Sep 3 20:00:29 2026 +0200

    USB: serial: option: add Quectel RG660QB
    
    commit 6177bcd94be83f80a032c2e69a06606d325335b9 upstream.
    
    Add support for the Quectel RG660QB 5G module (USB ID 2c7c:013d).
    The interface layout is the same as the RG650V:
    
      If 0: DIAG   ff/ff/30, 2 endpoints
      If 1: NMEA   ff/00/00, 2 endpoints
      If 2: AT     ff/00/00, 3 endpoints
      If 3: Modem  ff/00/00, 3 endpoints
      If 4: QMI    ff/ff/ff, 3 endpoints
    
    Match the serial interfaces on class/subclass/protocol so that the QMI
    interface is left to qmi_wwan.
    
      # lsusb -v -d 2c7c:013d
    
      Bus 004 Device 002: ID 2c7c:013d Quectel Wireless Solutions Co., Ltd. RG660QB-EU
      Device Descriptor:
        bLength                18
        bDescriptorType         1
        bcdUSB               3.20
        bDeviceClass            0
        bDeviceSubClass         0
        bDeviceProtocol         0
        bMaxPacketSize0         9
        idVendor           0x2c7c Quectel Wireless Solutions Co., Ltd.
        idProduct          0x013d
        bcdDevice            6.06
        iManufacturer           1 Quectel
        iProduct                2 RG660QB-EU
        iSerial                 3 f50119d0
        bNumConfigurations      1
        Configuration Descriptor:
          bLength                 9
          bDescriptorType         2
          wTotalLength       0x0105
          bNumInterfaces          5
          bConfigurationValue     1
          iConfiguration          4 DIAG_SER_RMNET
          bmAttributes         0xa0
            (Bus Powered)
            Remote Wakeup
          MaxPower              896mA
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        0
            bAlternateSetting       0
            bNumEndpoints           2
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass    255 Vendor Specific Subclass
            bInterfaceProtocol     48
            iInterface              0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x01  EP 1 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x81  EP 1 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        1
            bAlternateSetting       0
            bNumEndpoints           2
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass      0
            bInterfaceProtocol      0
            iInterface              0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x82  EP 2 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x02  EP 2 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        2
            bAlternateSetting       0
            bNumEndpoints           3
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass      0
            bInterfaceProtocol      0
            iInterface              6 CDEV Serial
            ** UNRECOGNIZED:  05 24 00 10 01
            ** UNRECOGNIZED:  05 24 01 00 00
            ** UNRECOGNIZED:  04 24 02 02
            ** UNRECOGNIZED:  05 24 06 00 00
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x84  EP 4 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x000a  1x 10 bytes
              bInterval               9
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x83  EP 3 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x03  EP 3 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        3
            bAlternateSetting       0
            bNumEndpoints           3
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass      0
            bInterfaceProtocol      0
            iInterface              6 CDEV Serial
            ** UNRECOGNIZED:  05 24 00 10 01
            ** UNRECOGNIZED:  05 24 01 00 00
            ** UNRECOGNIZED:  04 24 02 02
            ** UNRECOGNIZED:  05 24 06 00 00
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x86  EP 6 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x000a  1x 10 bytes
              bInterval               9
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x85  EP 5 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x04  EP 4 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        4
            bAlternateSetting       0
            bNumEndpoints           3
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass    255 Vendor Specific Subclass
            bInterfaceProtocol    255 Vendor Specific Protocol
            iInterface              7 RmNet
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x88  EP 8 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0008  1x 8 bytes
              bInterval               9
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x87  EP 7 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               6
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x05  EP 5 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               2
      Binary Object Store Descriptor:
        bLength                 5
        bDescriptorType        15
        wTotalLength       0x0023
        bNumDeviceCaps          2
        SuperSpeed USB Device Capability:
          bLength                10
          bDescriptorType        16
          bDevCapabilityType      3
          bmAttributes         0x00
          wSpeedsSupported   0x000f
            Device can operate at Low Speed (1Mbps)
            Device can operate at Full Speed (12Mbps)
            Device can operate at High Speed (480Mbps)
            Device can operate at SuperSpeed (5Gbps)
          bFunctionalitySupport   1
            Lowest fully-functional device speed is Full Speed (12Mbps)
          bU1DevExitLat           0 micro seconds
          bU2DevExitLat           0 micro seconds
        SuperSpeedPlus USB Device Capability:
          bLength                20
          bDescriptorType        16
          bDevCapabilityType     10
          bmAttributes         0x00000001
            Sublink Speed Attribute count 1
            Sublink Speed ID count 0
          wFunctionalitySupport   0x1100
          bmSublinkSpeedAttr[0]   0x000a4030
            Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus
          bmSublinkSpeedAttr[1]   0x000a40b0
            Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus
      Device Status:     0x0000
        (Bus Powered)
    
    Tested with an early sample of the module on a Quectel 5G EVB connected
    over USB 3 to a Raspberry Pi 5.
    
    Assisted-by: LLM
    Signed-off-by: Sebastian Sjoholm <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add support for SIMCom SIM8260C [+ + +]
Author: Zhao Dongdong <[email protected]>
Date:   Mon Aug 17 15:14:27 2026 +0800

    USB: serial: option: add support for SIMCom SIM8260C
    
    commit 35c950c9ec2c4c4d45dc9b63cfe8fca774ce33a0 upstream.
    
    Add support for SIMCom SIM8260C (1e0e:902b).
    
    T:  Bus=08 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    P:  Vendor=1e0e ProdID=902b Rev= 5.04
    S:  Manufacturer=SIMCOM
    S:  Product=SDXLEMUR-LITE-MTP _SN:120696AB
    S:  SerialNumber=0123456789ABCDEF
    C:* #Ifs= 8 Cfg#= 1 Atr=a0 MxPwr=896mA
    A:  FirstIf#= 5 IfCount= 3 Cls=01(audio) Sub=00 Prot=20
    I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=option
    E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan_simcom
    E:  Ad=88(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 5 Alt= 0 #EPs= 0 Cls=01(audio) Sub=01 Prot=20 Driver=snd-usb-audio
    I:* If#= 6 Alt= 0 #EPs= 0 Cls=01(audio) Sub=02 Prot=20 Driver=snd-usb-audio
    I:  If#= 6 Alt= 1 #EPs= 1 Cls=01(audio) Sub=02 Prot=20 Driver=snd-usb-audio
    E:  Ad=05(O) Atr=0d(Isoc) MxPS=  34 Ivl=1ms
    I:* If#= 7 Alt= 0 #EPs= 0 Cls=01(audio) Sub=02 Prot=20 Driver=(none)
    I:  If#= 7 Alt= 1 #EPs= 1 Cls=01(audio) Sub=02 Prot=20 Driver=(none)
    E:  Ad=89(I) Atr=0d(Isoc) MxPS=  34 Ivl=1ms
    
    Signed-off-by: Zhao Dongdong <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: quatech2: fix baud rate overflow [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Sep 15 14:40:12 2026 +0200

    USB: serial: quatech2: fix baud rate overflow
    
    commit ec06546b43b612cefc851558981b4955c0ef9e46 upstream.
    
    The requested baud rate is incorrectly truncated to 16 bits so that
    line speeds above 65535 bps cannot be set.
    
    Use 32 bits for the rate while rejecting rates outside of
    [50,921600] to avoid having the 16-bit divisor overflow.
    
    Fixes: f7a33e608d9a ("USB: serial: add quatech2 usb to serial driver")
    Cc: [email protected]      # 3.5
    Cc: Bill Pemberton <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: ssu100: fix baud rate overflow [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Sep 15 14:40:11 2026 +0200

    USB: serial: ssu100: fix baud rate overflow
    
    commit afc235a217360c6859068d2e37a4df305c4d1be2 upstream.
    
    The requested baud rate is incorrectly truncated to 16 bits so that
    line speeds above 65535 bps cannot be set.
    
    Use 32 bits for the rate and remainder while rejecting rates outside of
    [50,460800] to avoid having the divisor or remainder overflow.
    
    This issue was flagged by an LLM.
    
    Fixes: 52af95459939 ("USB: add USB serial ssu100 driver")
    Cc: [email protected]      # 2.6.36
    Cc: Bill Pemberton <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
usb: storage: realtek_cr: fix use-after-free on disconnect [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Wed Sep 9 22:19:27 2026 -0400

    usb: storage: realtek_cr: fix use-after-free on disconnect
    
    [ Upstream commit 4ffee1aebb0c0ffcda9faffd17834ea9b00d42cc ]
    
    realtek_cr_destructor() calls timer_delete() before the chip containing
    the timer is freed. The timer callback may still be running and can
    rearm itself, resulting in a use-after-free.
    
    Use timer_shutdown_sync() to wait for the callback and prevent further
    rearming. Do this unconditionally because ss_en may be changed after
    the timer is armed.
    
    Move timer_setup() into init_realtek_cr() so the timer is initialized
    before any failure path can invoke the destructor.
    
    Found by static analysis.
    
    Fixes: e931830bb877 ("Realtek cr: Add autosuspend function.")
    Cc: stable <[email protected]>
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ adapted the timer_delete() removal to the branch’s del_timer() spelling. ]
    Signed-off-by: Sasha Levin <[email protected]>

usb: storage: sierra_ms: reject short SWoC info transfers [+ + +]
Author: Syed Labeeq Sajid Bukhari <[email protected]>
Date:   Thu Sep 10 19:03:43 2026 +0500

    usb: storage: sierra_ms: reject short SWoC info transfers
    
    commit 8a0200d14acd9db388b85cd016e68a4e60d900ec upstream.
    
    sierra_get_swoc_info() requests sizeof(struct swoc_info) (60) bytes
    from the device via usb_control_msg(), but its callers only treat a
    negative return value as failure. A device that answers the
    vendor-specific GetSwocInfo request with a short IN transfer is
    therefore accepted, leaving the tail of the freshly allocated
    (kmalloc(), non-zeroing) swoc_info buffer uninitialized.
    
    truinst_show() subsequently prints swocInfo->rev, swocInfo->LinuxSKU
    and swocInfo->LinuxVer from that buffer into the world-readable
    (0444) "truinst" sysfs attribute. An emulated/malicious USB device
    (VID 0x1199, PID 0x0fff) can exploit this to disclose up to 5 bytes
    of stale kernel heap memory (kmalloc-64) to unprivileged userspace,
    once per sysfs read, indefinitely. On kernels built without
    init_on_alloc this leaks recently freed heap contents.
    
    Only accept the transfer when the full structure was received.
    sierra_ms_init() already retries failed queries, so well-behaved
    devices are unaffected.
    
    Fixes: 32fe5e393455 ("USB Storage Sierra: TRU-Install feature update")
    Cc: stable <[email protected]>
    Signed-off-by: Syed Labeeq Sajid Bukhari <[email protected]>
    Assisted-by: Kimi:K2 [Kimi Code CLI]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: tcpm: constrain TCPM_SOURCING_VBUS event handling [+ + +]
Author: Amit Sunil Dhamne <[email protected]>
Date:   Wed Sep 9 22:19:26 2026 -0400

    usb: typec: tcpm: constrain TCPM_SOURCING_VBUS event handling
    
    [ Upstream commit cd3b9cea675bbfebc223f007dc2f4e79524fa54c ]
    
    When a sink detach occurs while waiting for TX send status, the old
    TCPM_SOURCING_VBUS event along with TCPM_VBUS_EVENT and TCPM_CC_EVENT
    can be queued in port->pd_events. Because TCPM_SOURCING_VBUS is
    evaluated after TCPM_VBUS_EVENT and TCPM_CC_EVENT in
    tcpm_pd_event_handler(), a stale TCPM_SOURCING_VBUS event can override
    the detach handling and incorrectly set port->vbus_source and
    port->vbus_present to true.
    
    Add a state guard to check that the port is either operating as a
    Source (tcpm_port_is_source(port)) or in a Fast Role Swap (FRS) state
    up to FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED before processing
    TCPM_SOURCING_VBUS. Otherwise, discard and log the event.
    
    Log snippet for error condition before fix:
    [72792.204955] state change SRC_ATTACHED -> SRC_STARTUP [rev3 NONE_AMS]
    [72792.204960] sourcing vbus
    [72792.204962] VBUS on
    [72792.204970] AMS POWER_NEGOTIATION start
    [72792.204974] cc:=4
    [72792.205319] state change SRC_STARTUP -> AMS_START [rev3 POWER_NEGOTIATION]
    [72792.205325] state change AMS_START -> SRC_SEND_CAPABILITIES [rev3 POWER_NEGOTIATION]
    [72792.205332] PD TX, header: 0x11a1
    [72792.216911] PD TX complete, status: 2
    [72792.216957] pending state change SRC_SEND_CAPABILITIES -> SRC_SEND_CAPABILITIES @ 150 ms [rev3 POWER_NEGOTIATION]
    [72792.218005] VBUS off
    [72792.218013] pending state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED @ 650 ms [rev3 POWER_NEGOTIATION]
    [72792.218020] VBUS VSAFE0V
    [72792.218024] state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED [rev3 POWER_NEGOTIATION]
    [72792.218458] CC1: 2 -> 0, CC2: 0 -> 0 [state SNK_UNATTACHED, polarity 0, disconnected]
    [72792.218467] VBUS on --> VBUS left on
    [72792.218980] disable vbus discharge ret:0
    [72792.235193] Start toggling
    
    After fix:
    [ 1195.291691] state change SRC_ATTACHED -> SRC_STARTUP [rev3 NONE_AMS]
    [ 1195.291698] sourcing vbus
    [ 1195.291700] VBUS on
    [ 1195.291707] AMS POWER_NEGOTIATION start
    [ 1195.291710] cc:=4
    [ 1195.291758] state change SRC_STARTUP -> AMS_START [rev3 POWER_NEGOTIATION]
    [ 1195.291794] state change AMS_START -> SRC_SEND_CAPABILITIES [rev3 POWER_NEGOTIATION]
    [ 1195.291798] PD TX, header: 0x11a1
    [ 1195.297056] PD TX complete, status: 2
    [ 1195.297092] pending state change SRC_SEND_CAPABILITIES -> SRC_SEND_CAPABILITIES @ 150 ms [rev3 POWER_NEGOTIATION]
    [ 1195.297177] VBUS off
    [ 1195.297184] pending state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED @ 650 ms [rev3 POWER_NEGOTIATION]
    [ 1195.297227] CC1: 2 -> 0, CC2: 0 -> 0 [state SRC_SEND_CAPABILITIES, polarity 0, disconnected]
    [ 1195.307469] cc:=2
    [ 1195.307544] pending state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED @ 650 ms [rev3 POWER_NEGOTIATION]
    [ 1195.307555] Discarding sourcing vbus! Invalid state SRC_SEND_CAPABILITIES
    [ 1195.957636] state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED [delayed 650 ms]
    [ 1195.957732] disable vbus discharge ret:0
    [ 1195.970196] Start toggling
    [ 1195.970468] VBUS off
    [ 1196.051637] VBUS off
    [ 1196.051642] VBUS VSAFE0V
    
    Fixes: 8dc4bd073663 ("usb: typec: tcpm: Add support for Sink Fast Role SWAP(FRS)")
    Cc: stable <[email protected]>
    Assisted-by: Gemini:gemini-3.1-pro
    Signed-off-by: Amit Sunil Dhamne <[email protected]>
    Reviewed-by: Badhri Jagan Sridharan <[email protected]>
    Acked-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: tcpm: fix debug accessory mode detection for sink ports [+ + +]
Author: Xu Yang <[email protected]>
Date:   Wed Sep 9 22:19:25 2026 -0400

    usb: typec: tcpm: fix debug accessory mode detection for sink ports
    
    [ Upstream commit f6ec9bb4acc7182b25a793ad094a764e1cb819a7 ]
    
    The port in debug accessory mode can be either a source or sink. The
    previous tcpm_port_is_debug() function only checked for source port.
    
    Commit 8db73e6a42b6 ("usb: typec: tcpm: allow sink (ufp) to toggle into
    accessory mode debug") changed the detection logic to support both roles,
    but left some logic in _tcpm_cc_change() unchanged, This causes the state
    machine to transition to an incorrect state when operating as a sink in
    debug accessory mode. Log as below:
    
    [  978.637541] CC1: 0 -> 5, CC2: 0 -> 5 [state TOGGLING, polarity 0, connected]
    [  978.637567] state change TOGGLING -> SRC_ATTACH_WAIT [rev1 NONE_AMS]
    [  978.637596] pending state change SRC_ATTACH_WAIT -> DEBUG_ACC_ATTACHED @ 180 ms [rev1 NONE_AMS]
    [  978.647098] CC1: 5 -> 0, CC2: 5 -> 5 [state SRC_ATTACH_WAIT, polarity 0, connected]
    [  978.647115] state change SRC_ATTACH_WAIT -> SRC_ATTACH_WAIT [rev1 NONE_AMS]
    
    It should go to SNK_ATTACH_WAIT instead of SRC_ATTACH_WAIT state.
    
    To fix this, add tcpm_port_is_debug_source() and tcpm_port_is_debug_sink()
    helper to explicitly identify the power mode in debug accessory mode.
    Update the state transition logic in _tcpm_cc_change() to ensure the state
    machine transitions comply with Type-C specification. Also update the logic
    in run_state_machine() to keep consistency.
    
    Fixes: 8db73e6a42b6 ("usb: typec: tcpm: allow sink (ufp) to toggle into accessory mode debug")
    Cc: stable <[email protected]>
    Signed-off-by: Xu Yang <[email protected]>
    Acked-by: Heikki Krogerus <[email protected]>
    Reviewed-by: Amit Sunil Dhamne <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    
    [Backport to 6.12: This tree lacks 8db73e6a42b6 and the associated
    sink debug-accessory state-machine support. Retain only the source-debug
    macro extraction and source-side call-site updates. Keep
    tcpm_port_is_debug() source-only and omit the sink-debug macro and all
    sink/audio attachment transitions introduced by the upstream dependency.
    This preserves existing detection and state transitions while providing
    tcpm_port_is_debug_source() for cd3b9cea675b ("usb: typec: tcpm: constrain
    TCPM_SOURCING_VBUS event handling"). No functions are added.]
    
    Stable-dep-of: cd3b9cea675b ("usb: typec: tcpm: constrain TCPM_SOURCING_VBUS event handling")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: tcpm: recover after failure to start the frs ams [+ + +]
Author: Amit Sunil Dhamne <[email protected]>
Date:   Thu Sep 3 00:22:21 2026 +0000

    usb: typec: tcpm: recover after failure to start the frs ams
    
    commit 90156585765b29304f07b0e4a1c56a969876fcfc upstream.
    
    Reset the port if the tcpm fails to start the FAST_ROLE_SWAP AMS by
    initiating error recovery on it.
    
    This helps in cases where some cables (incorrectly) signal an FRS to
    an FRS capable port during disconnection. The TCPC autonomously starts
    sourcing VBUS on detecting the FRS signal. However, the VBUS sourcing is
    left on when the FAST_ROLE_SWAP AMS fails to start (as tcpm_sink_tx_ok
    is 0 as CC is open due to the cable disconnect). This is because the
    code sets the state to INVALID_STATE without resetting the port state.
    
    Log snippet before changes:
    [  101.401960] AMS FAST_ROLE_SWAP start
    [  101.401971] Sink TX No Go
    [  101.401982] sourcing vbus
    [  101.401987] VBUS on
    [  101.402159] VBUS on
    [  109.257809] CC1: 0 -> 0, CC2: 5 -> 0 [state SNK_READY, polarity 1, disconnected]
    [  111.267442] VBUS on
    
    After changes:
    [   70.541211] AMS FAST_ROLE_SWAP start
    [   70.541220] Sink TX No Go
    [   70.541228] state change SNK_READY -> ERROR_RECOVERY [rev3 NONE_AMS]
    [   70.541362] VBUS on
    [   70.541365] sourcing vbus
    [   70.541367] VBUS on
    [   70.541374] state change ERROR_RECOVERY -> PORT_RESET [rev3 NONE_AMS]
    [   70.541410] disable vbus discharge ret:0
    [   70.543028] Setting usb_comm capable false
    [   70.544009] Setting voltage/current limit 0 mV 0 mA
    [   70.544034] polarity 0
    [   70.544239] Requesting mux state 0, usb-role 0, orientation 0
    [   70.555550] cc:=0
    [   70.555595] pending state change PORT_RESET -> PORT_RESET_WAIT_OFF @ 100 ms [rev3 NONE_AMS]
    [   70.555697] VBUS off
    [   70.555702] VBUS VSAFE0V
    [   70.555762] CC1: 5 -> 0, CC2: 0 -> 0 [state PORT_RESET, polarity 0, disconnected]
    [   70.587794] VBUS off
    [   70.587799] VBUS VSAFE0V
    [   70.655672] state change PORT_RESET -> PORT_RESET_WAIT_OFF [delayed 100 ms]
    [   70.655682] state change PORT_RESET_WAIT_OFF -> SNK_UNATTACHED [rev3 NONE_AMS]
    [   70.655686] Start toggling
    [   70.656274] CC1: 0 -> 0, CC2: 0 -> 0 [state TOGGLING, polarity 0, disconnected]
    
    Fixes: 0908c5aca31e ("usb: typec: tcpm: AMS and Collision Avoidance")
    Cc: stable <[email protected]>
    Signed-off-by: Amit Sunil Dhamne <[email protected]>
    Reviewed-by: Badhri Jagan Sridharan <[email protected]>
    Acked-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: tipd: fix uninitialized typec_partner_desc in tps6598x_connect() [+ + +]
Author: Radhey Shyam Pandey <[email protected]>
Date:   Sun Sep 6 18:49:41 2026 +0530

    usb: typec: tipd: fix uninitialized typec_partner_desc in tps6598x_connect()
    
    commit c4b27b3605788bbf9e4251f3cd4ab94645ab036f upstream.
    
    tps6598x_connect() passes a stack-allocated typec_partner_desc to
    typec_register_partner() after initializing only usb_pd, accessory and
    identity.
    
    typec_register_partner() copies attach and deattach from the descriptor
    into the partner. With those fields left unset, garbage function pointers
    may be stored and later invoked from typec_partner_link_device() when a USB
    device is linked to the port. Uninitialized pd_revision and usb_capability
    similarly leak stack data through partner sysfs.
    
    Zero-initialize the descriptor so optional callbacks remain NULL and the
    remaining fields are zero.
    
    Fixes: 0a4c005bd171 ("usb: typec: driver for TI TPS6598x USB Power Delivery controllers")
    Cc: stable <[email protected]> # 5.15+
    Reviewed-by: Heikki Krogerus <[email protected]>
    Signed-off-by: Radhey Shyam Pandey <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: ucsi: acpi: Assume UCSI 1.2 on Acer Nitro ANV15-41 [+ + +]
Author: Pannarat Wiriyaarritham <[email protected]>
Date:   Mon Oct 5 17:20:18 2026 -0400

    usb: typec: ucsi: acpi: Assume UCSI 1.2 on Acer Nitro ANV15-41
    
    [ Upstream commit 8c51ea651d043c786c37668c51624bd6b338a0ef ]
    
    The Acer Nitro ANV15-41 exposes a functional UCSI ACPI PPM but
    reports a UCSI VERSION value of zero.
    
    ucsi_register() rejects a zero version with -ENODEV, leaving the
    system without registered USB Type-C connectors.
    
    The PPM works correctly when using the UCSI 1.2 layout. With UCSI
    1.2 assumed, both Type-C connectors register correctly and USB Power
    Delivery negotiation works.
    
    Add a DMI-specific UCSI operation for the Acer Nitro ANV15-41 that
    substitutes UCSI 1.2 only when firmware reports a zero version.
    Preserve any valid non-zero firmware version.
    
    Tested on an Acer Nitro ANV15-41 with BIOS V1.51.
    
    Fixes: c1b0bc2dabfa ("usb: typec: Add support for UCSI interface")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Pannarat Wiriyaarritham <[email protected]>
    Reviewed-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Moved the read_version callback logic into ucsi_acpi_read() because the dedicated callback is unavailable. ]
    Signed-off-by: Sasha Levin <[email protected]>

usb: typec: ucsi: displayport: Current CAM OOB index fixup [+ + +]
Author: Jameson Thies <[email protected]>
Date:   Thu Sep 17 03:20:08 2026 +0000

    usb: typec: ucsi: displayport: Current CAM OOB index fixup
    
    commit ea31c6498c61307dc0d8ce338a7f268cb8cbdd57 upstream.
    
    Update ucsi_displayport_enter() to return invalid error when the PPM
    reports an current alternate mode greater than or equal to
    UCSI_MAX_ALTMODES. While here, remove 0xff current cam assignment on
    failed GET_CURRENT_CAM response.
    
    Fixes: 04cec690b1fd ("usb: typec: ucsi: displayport: Fix OOB altmode array index")
    Cc: stable <[email protected]>
    Reviewed-by: Heikki Krogerus <[email protected]>
    Reviewed-by: Benson Leung <[email protected]>
    Signed-off-by: Jameson Thies <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: ucsi: Get the connector fwnode based on reg value [+ + +]
Author: Prashanth K <[email protected]>
Date:   Wed Sep 16 09:58:08 2026 +0530

    usb: typec: ucsi: Get the connector fwnode based on reg value
    
    commit 6c51f09c6db5868a5090e8dd4d7764660c87f1ad upstream.
    
    ucsi_find_fwnode() currently maps UCSI connectors to Device tree
    connector nodes based on the order in which connector child nodes
    are described in DT.
    
    This can fail because the ordering of child nodes isn't guaranteed
    in Device-tree. For example, DTB may contain connector@1 before
    connector@0, causing connector numbers to be associated with the wrong
    fwnode. As a result, role switch and Type-C notifications can be
    delivered to the wrong remote endpoints.
    
    Fix this by using the "reg" property of each connector to match
    its corresponding fwnode. While at it, if the reg property isn't
    present, then fall back to the old method.
    
    Fixes: c1b0bc2dabfa ("usb: typec: Add support for UCSI interface")
    Cc: stable <[email protected]>
    Signed-off-by: Prashanth K <[email protected]>
    Reviewed-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: xhci: bail out of setup if the controller is inaccessible [+ + +]
Author: Breno Leitao <[email protected]>
Date:   Tue Sep 1 07:10:03 2026 -0400

    usb: xhci: bail out of setup if the controller is inaccessible
    
    [ Upstream commit 78203d5b54a40f0e36196ebf31c9c7a380fc8811 ]
    
    xhci_gen_setup() locates the operational registers using the capability
    length read from the very first register:
    
            xhci->op_regs = hcd->regs +
                    HC_LENGTH(readl(&xhci->cap_regs->hc_capbase));
    
    If the controller is dead or has dropped off the bus, that read returns
    ~0, HC_LENGTH() truncates it to 0xff, and op_regs ends up 0xff bytes
    past the page-aligned MMIO base, i.e. unaligned. The first access
    through it, xhci_halt() -> xhci_handshake() reading op_regs->status, is
    then an unaligned readl() on device memory. arm64 faults on unaligned
    device accesses, so instead of xhci_handshake() catching the all-ones
    value and returning -ENODEV, setup oopses:
    
      xhci-pci-renesas 0005:08:00.0: Unable to change power state from D3cold to D0, device inaccessible
      xhci-pci-renesas 0005:08:00.0: xHCI Host Controller
      xhci-pci-renesas 0005:08:00.0: new USB bus registered, assigned bus number 1
      Unable to handle kernel paging request at virtual address ffff80030a770103
        ESR = 0x0000000096000021
        FSC = 0x21: alignment fault
      Internal error: Oops: 0000000096000021 [#1]  SMP
      pc : xhci_halt [xhci_hcd]
      Call trace:
       xhci_halt
       xhci_gen_setup
       xhci_pci_setup
       usb_add_hcd
       usb_hcd_pci_probe
       xhci_pci_common_probe
       xhci_pci_renesas_probe
    
    This was hit with a Renesas uPD720201 that failed to power up ("Unable
    to change power state from D3cold to D0, device inaccessible") yet still
    reached the HCD probe path.
    
    Read the capability register once, and if it reads back the all-ones
    value (as xhci_handshake() and xhci_reset() already test for), abort
    setup with -ENODEV before op_regs is derived from it. Reading it once
    also avoids re-reading a register that may change under a concurrent
    hot-removal.
    
    Fixes: 66d4eadd8d06 ("USB: xhci: BIOS handoff and HW initialization.")
    Cc: [email protected]
    Signed-off-by: Breno Leitao <[email protected]>
    Signed-off-by: Mathias Nyman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ adapted the double hc_capbase register read via hcc_params/hci_version to use a single new local hc_capbase variable ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vc_screen: reload vc pointer before if (ret) in vcs_write() to avoid UAF [+ + +]
Author: Yi Yang <[email protected]>
Date:   Mon Oct 5 02:40:44 2026 -0400

    vc_screen: reload vc pointer before if (ret) in vcs_write() to avoid UAF
    
    [ Upstream commit 226bd5603371cd9f6642cbb9e9a677f445de3530 ]
    
    The reload of 'vc' added by commit 8fb9ea65c9d1 ("vc_screen: reload load
    of struct vc_data pointer in vcs_write() to avoid UAF") sits after the
    'if (ret)' block, so the copy-failure break path exits the loop without
    reloading vc. If the vc was kfree()'d via vc_port_destruct during the
    unlocked copy_from_user() window, the post-loop
    'if (written && vc) vcs_scr_updated(vc)' is reached with a stale
    non-NULL vc. The '&& vc' guard from commit a287620312dc ("vc_screen:
    fix null-ptr-deref in vcs_notifier() during concurrent vcs_write") only
    handles the NULL case, not this stale-non-NULL case; vcs_notifier() then
    reads param->vc->vc_num from freed memory:
    
      BUG: KASAN: slab-use-after-free in vcs_notifier+0x7c/0xd0
      Read of size 2 at addr ffff888007149190
      Call Trace:
       vcs_notifier+0x7c/0xd0
       atomic_notifier_call_chain+0x70/0xa0
       vcs_scr_updated+0x77/0xa0
       vcs_write+0x71b/0x7e0
      Allocated by task: vc_allocate -> con_install -> tty_open
      Freed by task: kfree <- vt_ioctl (VT_DISALLOCATE -> vc_port_destruct)
    
    Move the reload to immediately after console_lock(), before 'if (ret)',
    so every break path below passes a fresh vc to the post-loop
    vcs_scr_updated().
    
    Fixes: a287620312dc ("vc_screen: fix null-ptr-deref in vcs_notifier() during concurrent vcs_write")
    Cc: [email protected]
    Signed-off-by: Yi Yang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Replaced the direct -ENXIO return with a ret assignment and goto unlock_out. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vlan: require the MAC header to be present in __vlan_insert_inner_tag() [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Tue Sep 29 10:12:42 2026 -0400

    vlan: require the MAC header to be present in __vlan_insert_inner_tag()
    
    [ Upstream commit ab888242fce4f16f6c4d4c6ec53939ad36aa3b3a ]
    
    __vlan_insert_inner_tag() only guarantees head room via skb_cow_head(),
    never that mac_len bytes of MAC header are present.  Its ETH_HLEN
    wrappers - __vlan_insert_tag() under skb_vlan_push(), and
    vlan_insert_tag() under validate_xmit_vlan() on the generic transmit
    path - therefore rewrite the first 16 bytes at skb->data: a 12-byte
    memmove plus two 2-byte stores at +12 and +14.  No caller supplies the
    bound, while the pop helpers use skb_ensure_writable()/pskb_may_pull().
    
    An IFF_TUN device has hard_header_len == 0, so packet_snd() accepts a
    one-byte AF_PACKET/SOCK_RAW frame.  The first vlan push only sets a
    hwaccel tag; the next - clsact "action vlan push" or
    bpf_skb_vlan_push() - enters the helper with skb->len still 1.  The
    head comes from skbuff_small_head without __GFP_ZERO, so each push
    drags bytes from beyond skb->tail into the frame.  After three the
    one-byte send leaves as 13 bytes carrying 11 bytes of uninitialised
    slab:
    
      0000: 5a b3 62 12 80 88 ff ff 00 b3 62 12 81
               `------------------------------'
      only 0x5a was sent; the rest is slab, here the top 56 bits of a
      linear-map address
    
    Require the MAC header the helper rewrites to be present, so such a
    frame is dropped rather than transmitted.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Reported-by: [email protected]
    Signed-off-by: Xiang Mei <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adjusted context around skb_cow_head(skb, VLAN_HLEN) because the branch lacks upstream meta_len handling. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vsock/virtio: validate packet source for connected sockets [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Thu Oct 22 15:10:43 2026 -0400

    vsock/virtio: validate packet source for connected sockets
    
    [ Upstream commit dee44f41f206becb41c492899c1996cfd7f82a1b ]
    
    virtio_transport_recv_pkt() looks up sockets first by the full source and
    destination tuple, then by destination only in the bound table. The
    fallback is needed for listening and connecting sockets, but sockets remain
    in the bound table after connect(), so it can also return a non-listening
    socket.
    
    The fallback does not validate the source address. In TCP_SYN_SENT, a
    RESPONSE from an unrelated source can transition the victim socket to
    TCP_ESTABLISHED while its stored remote address remains unchanged.
    Subsequent RW packets from that source are delivered through the same
    destination-only fallback.
    
    This was reproduced with capability-empty processes under different UIDs.
    The attacker discovered the target tuple through unprivileged AF_VSOCK
    sock_diag and caused the victim socket to read 16 attacker-chosen bytes;
    the intended peer-side socket read 0 of those 16 bytes.
    
    Add vsock_check_source() to validate the transport, source port and source
    CID against the peer stored in a non-listening socket. The local transport
    is the CID exception because its packets are generated internally with
    VMADDR_CID_LOCAL as their source, including connections using CID aliases.
    
    Use the helper after lock_sock() in the virtio receive path.
    
    Fixes: 06a8fc78367d ("VSOCK: Introduce virtio_vsock_common.ko")
    Closes: https://lore.kernel.org/netdev/[email protected]/
    Cc: [email protected]
    Suggested-by: Stefano Garzarella <[email protected]>
    Reviewed-by: Bobby Eshleman <[email protected]>
    Signed-off-by: Daehyeon Ko <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ sashal: adjusted receive-path context to retain virtio_transport_reset_no_sock(t, pkt). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vsock: treat TCP_CLOSING as once-established [+ + +]
Author: Michal Luczaj <[email protected]>
Date:   Mon Oct 5 02:26:22 2026 +0200

    vsock: treat TCP_CLOSING as once-established
    
    [ Upstream commit 4f6ac74fa594a918d41255c941256e1d51592d3b ]
    
    Handle the TCP_ESTABLISHED -> TCP_CLOSING transition on OP_RST, which can
    race with the connect loop. Immediately break and return 0 on
    ESTABLISHED/CLOSING. The return value of connect() should reflect what
    happened up to the point the connection was established or failed. Events
    that occur afterwards must not affect it. E.g. even if OP_RW has already
    set sk_err, connect() should still return 0, not ENOBUFS because of it.
    Adapt the inaccurate comment above signal_pending().
    
    Resetting a socket that is still present in connected_table can lead to
    memory corruption. The reporter noted lost transports for in-flight skbs,
    and I have reproduced crashes caused by re-insertion into connected_table.
    
      list_add double add: new=, prev=, next=.
      kernel BUG at lib/list_debug.c:35!
      Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
      Workqueue: vsock-loopback vsock_loopback_work
      RIP: 0010:__list_add_valid_or_report+0x11f/0x130
      Call Trace:
       vsock_insert_connected.cold+0xe/0x13
       virtio_transport_recv_pkt+0x10e9/0x1460
       vsock_loopback_work+0x305/0x480
       process_one_work+0xe4c/0x1560
       worker_thread+0x4f1/0xd60
       kthread+0x36e/0x470
       ret_from_fork+0x47b/0x6b0
       ret_from_fork_asm+0x1a/0x30
    
    This fix is supplementary to commit 002541ef650b ("vsock: Ignore
    signal/timeout on connect() if already established"). Details under Link.
    
    Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
    Reported-by: Hyunwoo Kim <[email protected]>
    Link: https://lore.kernel.org/netdev/anzT1fREOSyHT99k@v4bel/
    Signed-off-by: Michal Luczaj <[email protected]>
    Reviewed-by: Stefano Garzarella <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
vt: skip screen update for DEC alignment test on backgroup consoles [+ + +]
Author: Zizhi Wo <[email protected]>
Date:   Sat Sep 5 14:43:37 2026 +0800

    vt: skip screen update for DEC alignment test on backgroup consoles
    
    commit 0928ed9bd7946baee911efa401088697836e3b1e upstream.
    
    [BUG]
    Recently, we encountered a KASAN warning as follows:
    
    BUG: KASAN: slab-out-of-bounds in fb_pad_aligned_buffer+0x11f/0x140
    Read of size 1 at addr ff1100015fd9f6a4 by task tty_fbcon_oob/1239
    CPU: 7 UID: 0 PID: 1239 Comm: tty_fbcon_oob Not tainted 7.3.0-rc1 #100 PREEMPT(full)
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-4.fc41 04/01/2014
    Call Trace:
     <TASK>
     ...
     kasan_report+0xf0/0x120
     fb_pad_aligned_buffer+0x11f/0x140
     ccw_putcs+0x86c/0xa80
     fbcon_putcs+0x338/0x410
     do_update_region+0x21d/0x450
     do_con_write+0x1e0e/0x4880
     con_write+0x13/0x80
     n_tty_write+0x374/0x1010
     file_tty_write.isra.0+0x404/0x7a0
     ...
    
    reproduce:
    1) open /dev/tty0, set a KDFONTOP ioctl with op.op = KD_FONT_OP_SET,
    op.width = 8 and op.height = 16 (visible VC1)
    2) open /dev/tty1, set a KDFONTOP ioctl with op.op = KD_FONT_OP_SET,
    op.width = 28 and op.height = 24 (invisible VC2)
    3) echo 3 > /sys/devices/virtual/graphics/fbcon/rotate_all
    4) write EShash8(esc hash8) to tty1
    
    [CAUSE]
    All VCs render to the framebuffer. setfont only modifies the target VC's
    font without resizing the framebuffer backing buffer (par->rotated.buf);
    the buffer is only resized for the visible VC
    (fbcon_do_set_font -> ... -> vc_do_resize -> update_screen). This relies on
    the con_should_update() check performed before every update_region().
    
    However, the ESC # 8 path (do_con_trol -> do_update_region) omits the
    con_should_update() check. After changing the font size of an invisible VC,
    do_update_region() fills using the new font size against a buffer that was
    never resized, causing an out-of-bounds access.
    
    [FIX]
    Only push the update when the console is visible and not blanked, add
    the con_should_update() check in the do_con_trol() like every other call
    site of do_update_region() (update_region(), invert_screen(), ...).
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable <[email protected]>
    Signed-off-by: Zizhi Wo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
vxlan: Fix potential null-ptr-deref in vxlan_gro_prepare_receive(). [+ + +]
Author: Kuniyuki Iwashima <[email protected]>
Date:   Sat May 2 03:12:59 2026 +0000

    vxlan: Fix potential null-ptr-deref in vxlan_gro_prepare_receive().
    
    commit 30a45c0bffdd62350261e2f2689fdba426a33578 upstream.
    
    udp_tunnel_sock_release() could set sk->sk_user_data to NULL
    while vxlan_gro_prepare_receive() is running.
    
    Let's check if rcu_dereference_sk_user_data() is NULL after
    skb_gro_remcsum_init().
    
    Fixes: 5602c48cf875 ("vxlan: change vxlan to use UDP socket GRO")
    Signed-off-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Artem Novikov: Apply the check to the older vxlan_gro_receive()
      implementation. Initialize the remcsum state first and use the
      existing out path for cleanup when sk_user_data has been cleared. ]
    Signed-off-by: Artem Novikov <[email protected]>
    Signed-off-by: Fedor Pchelkin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

vxlan: use one headroom snapshot for neighbour replies [+ + +]
Author: Sanghyun Park <[email protected]>
Date:   Fri Sep 18 12:26:58 2026 +0900

    vxlan: use one headroom snapshot for neighbour replies
    
    [ Upstream commit 481506a756dcd828ef42391cb08f38d8d96d38fc ]
    
    vxlan_na_create() samples LL_RESERVED_SPACE() to size the reply skb and then
    samples it again to reserve headroom. A concurrent vxlan_changelink() can
    update needed_headroom between the two reads, creating a TOCTOU race. The
    second value can exceed the allocation and make the Ethernet header write out
    of bounds.
    
    The race is reproducible on the unpatched kernel. It occurred when
    vxlan_na_create() generated a neighbour reply while vxlan_changelink() changed
    the link headroom. KASAN caught a four-byte write two bytes beyond a 704-byte
    skbuff_small_head allocation.
    
    Snapshot the headroom once and use that value for both allocation and
    reservation.
    
    Fixes: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()")
    Signed-off-by: Sanghyun Park <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
watch_queue: Fix note pool publication race in watch_queue_set_size() [+ + +]
Author: Cen Zhang (Microsoft) <[email protected]>
Date:   Wed Oct 21 21:30:17 2026 -0400

    watch_queue: Fix note pool publication race in watch_queue_set_size()
    
    [ Upstream commit 5e531d62f1f8834faf7a4eed0d41105cf6570a8f ]
    
    There is a race between watch_queue_set_size() and post_one_notification().
    watch_queue_set_size() publishes wqueue->notes, notes_bitmap, nr_pages and
    nr_notes with plain stores, and post_one_notification() reads them with
    plain loads under a different lock, so nothing orders the four stores
    against the poster's loads: depending on the build, notes can be stored
    last (gcc 14 on x86-64 does this).  Since keyctl_watch_key() lets a watch
    attach to a queue before it is sized, post_one_notification() can already
    be running on another CPU at that moment: it reads nr_notes > 0, passes
    its bounds check, and then reads notes while it is still NULL,
    dereferencing notes[0].
    
    An unprivileged user triggers this reliably by watching one of its own
    keys through a notification pipe and racing ioctl(IOC_WATCH_QUEUE_SET_SIZE)
    on that pipe against keyctl(KEYCTL_SETPERM) on the key from another CPU,
    triggering:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      RIP: 0010:post_one_notification.isra.0+0xa2/0x1e0
      Call Trace:
       __post_watch_notification+0x148/0x180
       keyctl_setperm_key+0x119/0x130
       do_syscall_64+0x108/0x4c0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
      Kernel panic - not syncing: Fatal exception in interrupt
    
    Fix this by publishing nr_notes last with smp_store_release(), and by
    reading it once with smp_load_acquire() in post_one_notification() before
    the bitmap and the page array are touched.  A poster that observes a
    non-zero nr_notes then also observes the pool behind it; one that observes
    zero drops the notification as before.
    
    Fixes: c73be61cede5 ("pipe: Add general notification queue support")
    Reported-by: Dae R. Jeong <[email protected]>
    Closes: https://lore.kernel.org/all/ZT-S8Q7tyutcvu_q@dragonet/
    Reported-by: [email protected]
    Suggested-by: Dae R. Jeong <[email protected]>
    Signed-off-by: Cen Zhang (Microsoft) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Bradley Morgan <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adjusted post_one_notification() context for the existing mask variable and null-pipe check ]
    Signed-off-by: Sasha Levin <[email protected]>

 
watchdog: cpu5wdt.c: Fix use-after-free bug caused by cpu5wdt_trigger [+ + +]
Author: Duoming Zhou <[email protected]>
Date:   Sun Mar 24 22:04:44 2024 +0800

    watchdog: cpu5wdt.c: Fix use-after-free bug caused by cpu5wdt_trigger
    
    [ Upstream commit 573601521277119f2e2ba5f28ae6e87fc594f4d4 ]
    
    When the cpu5wdt module is removing, the origin code uses del_timer() to
    de-activate the timer. If the timer handler is running, del_timer() could
    not stop it and will return directly. If the port region is released by
    release_region() and then the timer handler cpu5wdt_trigger() calls outb()
    to write into the region that is released, the use-after-free bug will
    happen.
    
    Change del_timer() to timer_shutdown_sync() in order that the timer handler
    could be finished before the port region is released.
    
    Fixes: e09d9c3e9f85 ("watchdog: cpu5wdt.c: add missing del_timer call")
    Signed-off-by: Duoming Zhou <[email protected]>
    Reviewed-by: Guenter Roeck <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Wim Van Sebroeck <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

watchdog: rtd119x: Avoid division by zero [+ + +]
Author: Tzung-Bi Shih <[email protected]>
Date:   Tue Sep 22 14:21:13 2026 -0400

    watchdog: rtd119x: Avoid division by zero
    
    [ Upstream commit 5af7d2cbd20f893def03c8310a460ade66a5d822 ]
    
    clk_get_rate() could return 0.  Avoid a division by zero panic.
    
    Fixes: 2bdf6acbfead ("watchdog: Add Realtek RTD1295")
    Cc: [email protected]
    Signed-off-by: Tzung-Bi Shih <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

watchdog: rtd119x: Use devm_clk_get_enabled() helper [+ + +]
Author: Christophe JAILLET <[email protected]>
Date:   Tue Sep 22 14:21:12 2026 -0400

    watchdog: rtd119x: Use devm_clk_get_enabled() helper
    
    [ Upstream commit 6cc0768ba6f5293a4435612164a2cfbf2edbd025 ]
    
    The devm_clk_get_enabled() helper:
       - calls devm_clk_get()
       - calls clk_prepare_enable() and registers what is needed in order to
         call clk_disable_unprepare() when needed, as a managed resource.
    
    This simplifies the code and avoids the need of a dedicated function used
    with devm_add_action_or_reset().
    
    Signed-off-by: Christophe JAILLET <[email protected]>
    Reviewed-by: Guenter Roeck <[email protected]>
    Link: https://lore.kernel.org/r/14b521b821279bc5111dc80b55d0936c5767c737.1672418470.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Wim Van Sebroeck <[email protected]>
    Stable-dep-of: 5af7d2cbd20f ("watchdog: rtd119x: Avoid division by zero")
    Signed-off-by: Sasha Levin <[email protected]>

 
wifi: ath11k: reset ar->num_stations on hardware start [+ + +]
Author: Nicolas Escande <[email protected]>
Date:   Wed Aug 12 16:58:05 2026 +0200

    wifi: ath11k: reset ar->num_stations on hardware start
    
    [ Upstream commit 7e0ad05ebc72fffba2bdf2400400902d94ed7272 ]
    
    When (multiple) hw restart occurs, we end up in a situation where we
    cannot accept new stations / mesh peers. This seems to be the
    'num_stations' in 'struct ath11k' that did not get reset properly in
    this case. In ath11k_mac_op_start(), it was indeed the only accounting var
    that did not get reset so let's clear it too.
    
    This avoids problems like those:
    
            [1248828.088023] WARNING: CPU: 0 PID: 12281 at net/mac80211/util.c:1682 ieee80211_reconfig_stations+0x98/0xc0
            [1248828.088115] Call trace:
            [1248828.088116]  ieee80211_reconfig_stations+0x98/0xc0 (P)
            [1248828.088119]  ieee80211_reconfig+0x774/0x1438
            [1248828.088123]  ieee80211_restart_work+0x10c/0x178
            [1248828.088127]  process_one_work+0x178/0x3c0
            [1248828.088130]  worker_thread+0x280/0x440
            [1248828.088133]  kthread+0xe0/0xf8
            [1248828.088137]  ret_from_fork+0x10/0x20
            [1248828.088141] ---[ end trace 0000000000000000 ]---
            [1248836.686604] ath11k_pci 0000:04:00.0: refusing to associate station: too many connected already (128)
            [1248836.686609] ath11k_pci 0000:04:00.0: Failed to add station: xx:xx:xx:xx:xx:xx for VDEV: 1
    
    Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.9.0.1-01977-QCAHKSWPL_SILICONZ-1
    
    Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
    Signed-off-by: Nicolas Escande <[email protected]>
    Reviewed-by: Rameshkumar Sundaram <[email protected]>
    Reviewed-by: Baochen Qiang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jeff Johnson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

wifi: brcmfmac: fix P2P device removal race in brcmf_detach() [+ + +]
Author: Michele Dionisio <[email protected]>
Date:   Thu Sep 24 14:30:27 2026 +0200

    wifi: brcmfmac: fix P2P device removal race in brcmf_detach()
    
    commit 08a3f02fea636e97a7422d1512f76dacdb5b0887 upstream.
    
    When the driver is removed while the user space process that created
    the P2P device (e.g. wpa_supplicant) is still exiting, the P2P device
    interface is removed twice and the kernel crashes.
    
    The two paths are:
    
     - wpa_supplicant, on exit, sends NL80211_CMD_DEL_INTERFACE for the P2P
       device. nl80211_del_interface() holds RTNL and the wiphy mutex and
       calls brcmf_p2p_del_vif(), which disables discovery and waits up to
       1.5 s for BRCMF_E_IF_DEL. Then it calls brcmf_remove_interface(),
       which unregisters the wdev and frees the vif and the ifp.
    
     - brcmf_detach() sets the bus down, so BRCMF_E_IF_DEL never arrives,
       and calls brcmf_remove_interface(ifp, false) for the same ifp.
       brcmf_p2p_ifp_removed() reads ifp->vif and then blocks on
       rtnl_lock(). When brcmf_p2p_del_vif() releases RTNL, it calls
       cfg80211_unregister_wdev() on the wdev that was already unregistered
       and freed.
    
    The second list_del_rcu() of wdev->list faults on LIST_POISON2:
    
      brcmfmac: brcmf_p2p_del_vif delete P2P vif
      brcmfmac: brcmf_p2p_deinit_discovery enter
      brcmfmac: brcmf_p2p_del_vif P2P: GO_NEG_PHASE status cleared
      brcmfmac: brcmf_detach Enter
      brcmfmac: brcmf_bus_change_state 1 -> 0
      brcmfmac: brcmf_remove_interface Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_del_if Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_p2p_ifp_removed P2P: device interface removed
      [1.5 s later, brcmf_p2p_del_vif() timed out]
      brcmfmac: brcmf_remove_interface Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_del_if Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_p2p_ifp_removed P2P: device interface removed
      Unable to handle kernel paging request at virtual address dead000000000122
      Internal error: Oops: 96000044 [#1] PREEMPT_RT SMP
      pc : _cfg80211_unregister_wdev+0x6c/0x264 [cfg80211]
      Call trace:
       _cfg80211_unregister_wdev+0x6c/0x264 [cfg80211]
       cfg80211_unregister_wdev+0x10/0x1c [cfg80211]
       brcmf_p2p_ifp_removed+0x84/0xb0 [brcmfmac]
       brcmf_remove_interface+0x1f4/0x254 [brcmfmac]
       brcmf_detach+0x88/0x180 [brcmfmac]
       brcmf_sdio_remove+0x90/0x7b0 [brcmfmac]
       brcmf_sdiod_remove+0x20/0xa0 [brcmfmac]
       brcmf_ops_sdio_remove+0xbc/0x12c [brcmfmac]
       sdio_bus_remove+0x38/0x144
       device_release_driver_internal+0x1e8/0x2c0
       device_release_driver+0x14/0x20
       brcmf_sdio_bus_remove+0x2c/0x40 [brcmfmac]
       brcmf_fwvid_unregister_vendor+0xd8/0x170 [brcmfmac]
       __exit_compat+0x18/0x418 [brcmfmac_cyw]
       __arm64_sys_delete_module+0x1ac/0x244
    
    The log was taken with debug=0x406 on an i.MX 8M Plus board with a
    CYW55513 (Sona IF513) on SDIO. The driver is the Ezurio backport of
    brcmfmac from v6.18.22 on a 5.4-rt kernel. The code involved is the same
    in mainline.
    
    To reproduce:
    
      1. Start wpa_supplicant on wlan0 and let it associate. It creates the
         P2P device (iw dev shows "type P2P-device").
      2. Stop wpa_supplicant and remove the driver without waiting for
         wpa_supplicant to exit:
    
           kill $(pidof wpa_supplicant)
           rmmod brcmfmac_cyw brcmfmac
    
    The crash is reproducible on that board.
    
    For the interface without a netdev (the P2P device), take RTNL and the
    wiphy mutex in brcmf_detach() before reading iflist, and remove it with
    locked=true. If brcmf_p2p_del_vif() runs first, brcmf_detach() finds the
    slot empty. If brcmf_detach() runs first, nl80211 does not find the wdev
    any more. The interfaces with a netdev are removed as before, because
    brcmf_del_if() takes RTNL on its own for the primary interface.
    
    Fixes: 9831bcb987df ("brcmfmac: Deleting of p2p device is leaking memory.")
    Cc: [email protected]
    Assisted-by: claude-opus-5-5
    Signed-off-by: Michele Dionisio <[email protected]>
    Acked-by: Arend van Spriel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: cfg80211: avoid double free if updating BSS fails [+ + +]
Author: Benjamin Berg <[email protected]>
Date:   Wed Dec 20 13:41:43 2023 +0200

    wifi: cfg80211: avoid double free if updating BSS fails
    
    [ Upstream commit acc44cbd7727115f9381c35c2898b1b5af665ec8 ]
    
    cfg80211_update_known_bss will always consume the passed IEs. As such,
    cfg80211_update_assoc_bss_entry also needs to always set the pointers to
    NULL so that no double free can occur.
    
    Note that hitting this would probably require being connected to a
    hidden BSS which is then doing a channel switch while also switching to
    be not hidden anymore at the same time.
    
    Signed-off-by: Benjamin Berg <[email protected]>
    Reviewed-by: Johannes Berg <[email protected]>
    Signed-off-by: Miri Korenblit <[email protected]>
    Link: https://msgid.link/20231220133549.8891edb28d51.Id09c5145363e990ff5237decd58296302e2d53c8@changeid
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

wifi: cfg80211: preserve hidden-group beacon IE ownership [+ + +]
Author: Zhao Li <[email protected]>
Date:   Mon Sep 14 23:28:25 2026 +0800

    wifi: cfg80211: preserve hidden-group beacon IE ownership
    
    [ Upstream commit cc45f313d85533d647ce619326302aad6f797c14 ]
    
    A hidden-group probe-response entry borrows its beacon IEs from the
    group's beacon entry. cfg80211_update_assoc_bss_entry() can pass such
    an entry to cfg80211_update_known_bss() when merging scan entries
    after a channel switch.
    
    Copying the borrowed beacon_ies into the associated entry gives the
    same allocation two owners. Releasing the group's beacon entry can
    then leave the associated entry pointing to freed IEs, which are
    freed again when that entry is released.
    
    Skip beacon IE replacement when the source entry belongs to a hidden
    group. Preserve probe-response processing, the subsequent metadata
    updates, and the existing rejection path for conflicting hidden
    beacon updates.
    
    Fixes: 0afd425b1b64 ("cfg80211: fix duplicated scan entries after channel switch")
    Reported-by: Yilin Zhang <[email protected]>
    Closes: https://lore.kernel.org/linux-wireless/[email protected]/
    Assisted-by: Codex:gpt-6-astra
    Signed-off-by: Zhao Li <[email protected]>
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

wifi: cw1200: fix TX padding OOB read leaking heap data to device [+ + +]
Author: Tianchu Chen <[email protected]>
Date:   Fri Sep 4 15:23:34 2026 +0000

    wifi: cw1200: fix TX padding OOB read leaking heap data to device
    
    commit 7c1611780823b76219cb1478db53dfd890c4a9a2 upstream.
    
    The TX path rounds the transfer size up to the bus alignment
    (align_size(), up to 511 bytes for SDIO, 1 byte for SPI) but sends
    the padded length straight from the frame buffer, which has no room
    reserved for the padding.  cw1200_data_write() therefore reads past
    the end of the frame and the bus transfer carries those bytes to the
    device.  A bogus device can collect up to 511 bytes of kernel heap
    data per TX frame.
    
    The RX path does not have this problem: it allocates the skb with
    the aligned length (alloc_len) before reading.
    
    Compute the exact padding with the bus align_size() callback, make
    sure queued TX frames have tailroom for it, and zero the padding
    bytes before the transfer so nothing past the frame is exposed.
    
    This is not expected to change driver behavior on most cases: frame
    contents and transfer sizes are unchanged, only the content of the
    padding bytes (previously undefined stale memory, now zero), which
    the device never reads since the WSM header carries the real frame
    length.  The skb expansion can only fail under memory exhaustion,
    in which case the frame is dropped like on the existing error paths
    of cw1200_tx().
    
    Discovered by Atuin - Automated Vulnerability Discovery Engine.
    
    Fixes: a910e4a94f69 ("cw1200: add driver for the ST-E CW1100 & CW1200 WLAN chipsets")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Tianchu Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: iwlegacy: 3945: free EEPROM data on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 16 15:37:36 2026 +0800

    wifi: iwlegacy: 3945: free EEPROM data on remove
    
    commit f8ebe286394c0bbb4a6dbacb182a34ab6376922d upstream.
    
    il3945_pci_probe() calls il_eeprom_init(), which allocates memory for
    the EEPROM data. The probe failure paths release this allocation with
    il_eeprom_free(), but the remove path does not free it after a
    successful probe.
    
    As a result, the EEPROM data is leaked when the PCI device is removed.
    
    Free the EEPROM data in il3945_pci_remove() before releasing the
    mac80211 hardware structure.
    
    This issue was found by manual code inspection.
    
    Fixes: 073d3f5f1b3b ("iwlwifi: changing EEPROM layout handling")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Acked-by: Stanislaw Gruszka <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: libipw: reject TKIP frames without a full MIC [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Tue Sep 22 15:45:58 2026 -0400

    wifi: libipw: reject TKIP frames without a full MIC
    
    [ Upstream commit 06f42accaf3c6aecab1dcc57f68dde6c06c8b380 ]
    
    libipw_michael_mic_verify() assumes that an skb contains an eight-byte
    Michael MIC. A short TKIP frame makes the unsigned payload length wrap,
    causing michael_mic() to read past the skb.
    
    Check that the MIC is present before verifying it, and use the existing
    MICHAEL_MIC_LEN constant for all MIC lengths in the verifier.
    
    Fixes: b453872c35cf ("[NET] ieee80211 subsystem")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ adapted libipw changes to the older lib80211 implementation and Michael MIC helper interface. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: account proxy paths against the mesh path limit [+ + +]
Author: Zhao Li <[email protected]>
Date:   Tue Oct 6 18:10:57 2026 -0400

    wifi: mac80211: account proxy paths against the mesh path limit
    
    [ Upstream commit a5f35d4b112af1415ff06bd501c8cc26cc08aa8b ]
    
    Proxy-path churn can drive the interface path counter negative and let
    later mesh path additions exceed MESH_MAX_MPATHS.
    
    mesh_path_free_rcu() decrements the interface mpaths counter for entries
    from both the mesh and proxy path tables, but mpp_path_add() never
    reserves a slot in that counter. Removing or expiring a proxy path
    therefore returns a slot that was never charged.
    
    mesh_path_add() uses the same counter to enforce MESH_MAX_MPATHS, so once
    it falls below the number of installed paths the limit no longer holds.
    
    Reserve the shared quota before allocating a proxy path and release it on
    every unsuccessful addition. Mesh and proxy paths now share one
    1024-entry budget, so mpp_path_add() can return -ENOSPC at that limit.
    
    Fixes: ece1a2e7e860 ("mac80211: Remove mesh paths when an interface is removed")
    Cc: [email protected]
    Assisted-by: LLM sparse kasan
    Signed-off-by: Zhao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: Adjusted error-handling braces to accommodate the missing mesh_fast_tx_flush_addr() call. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: count only matching reservations in reserved switch [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Wed Oct 7 01:26:59 2026 -0400

    wifi: mac80211: count only matching reservations in reserved switch
    
    [ Upstream commit 437f3727b4fd715266c296435c116288f82666fd ]
    
    ieee80211_vif_use_reserved_switch() validates a replacement by counting
    assigned links on ctx->replace_ctx and treating reservations too
    broadly. A link can still be assigned to the old channel context while
    holding a reservation that belongs to a different replacement
    operation.
    
    That can make the current replacement appear complete too early. If
    another link finalizes first, the function can free the
    WILL_BE_REPLACED chanctx while the unmatched link and driver still use
    it, leading to a use-after-free in later beacon generation.
    
    Require an in-place reservation to point at the current replacement
    context, and require the reserved and assigned contexts to be the
    matching replacement pair, before counting or moving the link.
    
    Fixes: 5bcae31d9cb1 ("mac80211: implement multi-vif in-place reservations")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Link: https://patch.msgid.link/4b6c4b8648ab1920c38a40be32c0b1a2797b4ac6.1785726007.git.zhilinz@nebusec.ai
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: Adapted per-link reservation handling to the existing per-interface helpers and list traversal. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: drain PS delivery work during station teardown [+ + +]
Author: Zhao Li <[email protected]>
Date:   Wed Sep 16 19:37:35 2026 +0800

    wifi: mac80211: drain PS delivery work during station teardown
    
    commit 67a9e80c3ca20c9044cd6ee72cd6278dd19b5023 upstream.
    
    Removing an AP or mesh station can notify the driver and wake TXQs after
    the station has already been removed from the driver, and can update
    num_sta_ps and the power-save queues after station cleanup has purged
    them.
    
    sta_deliver_ps_frames() tests sta->dead only before it starts delivery. A
    worker that passes that test can be delayed while teardown sets sta->dead
    and removes the station from the driver; when it resumes it still runs the
    full delivery.
    
    The existing cancel_work_sync() sits near the end of
    __cleanup_single_sta(), after the final driver state transition and after
    PS accounting and queue purging, so it drains the worker only once the
    state it has to protect has already changed. Before commit d34ba2168a3c
    ("mac80211: don't delay station destruction") cleanup was deferred
    through the same ordered workqueue as the delivery work, which kept the
    two ordered.
    
    Cancel the work after setting sta->dead and before moving the driver
    state, and move the existing cancellation to the start of
    __cleanup_single_sta(). The first drain closes the driver-lifetime window;
    driver callbacks during the remaining state transitions can still queue
    drv_deliver_wk through ieee80211_sta_block_awake(), so retain the second
    drain at the start of __cleanup_single_sta(). That drain also covers
    insertion failures, which reach cleanup without setting sta->dead.
    
    Fixes: d34ba2168a3c ("mac80211: don't delay station destruction")
    Cc: [email protected]
    Assisted-by: LLM sparse smatch coccinelle kasan
    Signed-off-by: Zhao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: handle empty FILS association request payload [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Sat Sep 19 16:48:12 2026 +0800

    wifi: mac80211: handle empty FILS association request payload
    
    commit 5bfd4b0b40b79781d900cb2f7da0685070f53c67 upstream.
    
    fils_encrypt_assoc_req() accepts a (Re)Association Request frame whose
    last element is the FILS Session element.  crypt_len is then zero and
    aes_siv_encrypt() is called with an empty plaintext.
    
    kmemdup() returns ZERO_SIZE_PTR for a zero-length allocation, so the
    unconditional sg_init_one() puts an invalid page into the scatterlist.
    With CONFIG_DEBUG_SG this triggers a kernel BUG in sg_set_buf();
    without the debug check the bogus page is handed to the crypto backend.
    
    AES-SIV is defined for empty plaintext and the S2V result is then the
    complete output, so handle this case before the CTR step, which has
    nothing to encrypt.
    
    Fixes: 39404feee691 ("mac80211: FILS AEAD protection for station mode association frames")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Link: https://patch.msgid.link/325c048982d637a3af80d74ac5b36e9369b93f1e.1789751126.git.xuyuqiabc@gmail.com
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: keep fallback association elements alive [+ + +]
Author: Zhao Li <[email protected]>
Date:   Tue Oct 6 18:00:56 2026 -0400

    wifi: mac80211: keep fallback association elements alive
    
    [ Upstream commit a10a2f80476d166fd81c361ec0319493671b694e ]
    
    Associating to a non-transmitted MBSSID profile reads freed memory while
    determining the operating channel and applying HT capabilities.
    
    When an association response omits WMM, HT, or VHT information,
    ieee80211_assoc_config_link() parses the cached BSS IEs and copies the
    missing element pointers out of that fallback parse. For a
    non-transmitted MBSSID profile those pointers refer to merged-profile
    storage owned by the parse object, and the fallback block frees that
    object at its end. The copied pointers are used afterwards to determine
    the operating channel, configure bandwidth, and apply HT capabilities.
    
    Keep the fallback parse result alive until association setup finishes.
    
    Fixes: 5023b14cf4df ("mac80211: support profile split between elements")
    Cc: [email protected]
    Assisted-by: LLM sparse kasan
    [reorder variable declaration]
    Signed-off-by: Zhao Li <[email protected]>
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: Applied the changes to ieee80211_assoc_success() instead of ieee80211_assoc_config_link(). ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: keep paired old chanctx alive [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Tue Oct 6 18:55:31 2026 -0400

    wifi: mac80211: keep paired old chanctx alive
    
    [ Upstream commit 3412e9a800786d1dec4a58367db1cba275e7ef11 ]
    
    An in-place replacement keeps reciprocal replace_ctx pointers between
    the old WILL_BE_REPLACED chanctx and the new REPLACES_OTHER chanctx.
    However, the early free paths only consider assigned and reserved link
    users when deciding whether to free the old chanctx.
    
    That lets the old chanctx be freed too early while the replacement
    partner still points back to it, either when the last assigned link is
    released or when that link successfully reassigns to another existing
    context. Later unreserve and switch-finalization paths can then follow a
    stale replace_ctx pointer.
    
    Keep a paired old chanctx alive until the replacement pair has been torn
    down. Apply the same check to both __ieee80211_link_release_channel()
    and ieee80211_link_use_reserved_reassign(). If the replacement is later
    abandoned, ieee80211_link_unreserve_chanctx() already tears down the
    pairing before freeing the old chanctx once no users remain.
    
    Fixes: 5bcae31d9cb1 ("mac80211: implement multi-vif in-place reservations")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Link: https://patch.msgid.link/b9b582b0db3814f641648b8886bb50f9d68f93ac.1785730815.git.zhilinz@nebusec.ai
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: adapted link-based channel handling to VIF-based functions and fields. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: minstrel_ht: validate fixed rate index [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Sat Sep 19 16:46:20 2026 +0800

    wifi: mac80211: minstrel_ht: validate fixed rate index
    
    commit 15fb9e3cea55fbc378261ce35a32b0f8828f0000 upstream.
    
    The fixed_rate_idx debugfs file is a plain u32 attribute, so any value
    can be written to it.  minstrel_ht_update_stats() then copies the value
    into mi->max_tp_rate[] and mi->max_prob_rate, and
    minstrel_ht_set_rate() uses MI_RATE_GROUP()/MI_RATE_IDX() to index
    minstrel_mcs_groups[] (42 entries) and mi->groups[].rates[] (10 entries)
    with it.
    
    Writing e.g. 65535 selects group 4095 and rate index 15, far outside
    both arrays.  The out-of-bounds entries are dereferenced and updated as
    struct minstrel_rate_stats (retry counts, etc.), so the invalid index
    corrupts adjacent kernel memory.  With CONFIG_UBSAN_BOUNDS the access is
    reported as an array-index-out-of-bounds in minstrel_ht_set_rate().
    
    Only a valid group/rate pair, or U32_MAX to disable fixed rate
    processing, can be used safely, so reject any other value when the
    debugfs file is written.
    
    The file is only reachable through a root-only debugfs mount, so this is
    not a privilege boundary.  The out-of-bounds access is still a bug that
    must not be reachable through a writable debugfs attribute.
    
    Fixes: 24f7580e852b ("minstrel_ht: fixed rate mode through debugfs")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Link: https://patch.msgid.link/288e6f6d30dc82ff40da502755e6666982f6b735.1789798000.git.xuyuqiabc@gmail.com
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: release mesh path quota on failed additions [+ + +]
Author: Zhao Li <[email protected]>
Date:   Wed Sep 16 19:36:48 2026 +0800

    wifi: mac80211: release mesh path quota on failed additions
    
    commit 7325a44474f20c1393a1c114c6811abce6ddfaf4 upstream.
    
    Repeated failed or duplicate mesh path additions can exhaust
    MESH_MAX_MPATHS while the path table holds fewer paths, which stops new
    paths to reachable destinations from being created.
    
    mesh_path_add() reserves a slot before allocating and inserting a path.
    If allocation fails, the function returns without releasing the slot. If
    the rhashtable insertion reports an error or an existing destination, the
    function discards its candidate but retains the reservation. No new path
    is installed in any of these cases.
    
    Release the reservation whenever the candidate is not installed.
    
    Fixes: ae76eef027f7 ("mac80211: return new mpath from mesh_path_add()")
    Fixes: 60854fd94573 ("mac80211: mesh: convert path table to rhashtable")
    Cc: [email protected]
    Assisted-by: LLM sparse kasan
    Signed-off-by: Zhao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: set info->band for 802.3 encap offload frames [+ + +]
Author: Felix Fietkau <[email protected]>
Date:   Wed Oct 7 02:11:48 2026 -0400

    wifi: mac80211: set info->band for 802.3 encap offload frames
    
    [ Upstream commit 4febc02cd02f021f2b6d0768332be643ef14a12d ]
    
    Unlike the 802.11 TX paths, ieee80211_8023_xmit() does not set
    info->band from the channel context on non-MLD interfaces. It stays at
    0, so ieee80211_get_tx_rates() uses the wrong band for these frames.
    
    Set it the same way as ieee80211_build_hdr(): drop the frame if there is
    no channel context, and leave the band at 0 on MLD interfaces.
    
    Reported-by: Andrea Pesaresi <[email protected]>
    Fixes: 50ff477a8639 ("mac80211: add 802.11 encapsulation offloading support")
    Cc: [email protected]
    Signed-off-by: Felix Fietkau <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: Changed vif.bss_conf.chanctx_conf access to vif.chanctx_conf. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: shut down RX BA session timer on teardown [+ + +]
Author: Zhao Li <[email protected]>
Date:   Tue Oct 6 18:18:48 2026 -0400

    wifi: mac80211: shut down RX BA session timer on teardown
    
    [ Upstream commit e588e83e5c7a0f6d7a77dbbb58927c8c8cfd598e ]
    
    Tearing down an RX BA session can leave the session timer queued on a
    freed tid_rx. Later timer-wheel processing and the timer callback itself
    then run against freed memory.
    
    An RX BAR handler can dereference tid_rx under RCU before teardown
    unpublishes it and stay in its read-side critical section while teardown
    deletes the session timer. The stale handler can then rearm the timer
    after timer_delete_sync() returns and before the RCU callback frees
    tid_rx.
    
    Use timer_shutdown_sync() so rearm attempts become ineffective once
    teardown starts. Keep reorder_timer unchanged: teardown marks the session
    removed under reorder_lock and its release path checks that state before
    rearming. session_timer has no equivalent guard because
    ieee80211_rx_h_ctrl() rearms it before taking reorder_lock.
    
    Fixes: a87f736d942c ("mac80211: use RCU for RX aggregation")
    Cc: [email protected] # 5.15+
    Assisted-by: LLM sparse kasan
    Signed-off-by: Zhao Li <[email protected]>
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: adapted the timer replacement to the existing del_timer_sync() call ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: p54: validate firmware record lengths [+ + +]
Author: Heyang Tan <[email protected]>
Date:   Fri Sep 18 16:33:49 2026 +0800

    wifi: p54: validate firmware record lengths
    
    commit db7b86bd97b380ece8fa39cfdd7502a9fd35e56f upstream.
    
    The p54 firmware parser accesses component ID and component version
    records without checking that their lengths cover the fields being read.
    A malformed record can therefore make the parser read past the record.
    
    Validate the component ID and component version record lengths before
    accessing their data. The descriptor record is also checked against the
    shortest descriptor length found in the supported firmware images.
    
    Reject descriptor values that underflow the RX offset or produce an empty
    RX range before updating the driver state.
    
    Assisted-by: LLM Codex
    Signed-off-by: Heyang Tan <[email protected]>
    Tested-by: Christian Lamparter <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: rtl8xxxu: fix use-after-free from rx_urb_wq on stop [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 16:50:52 2026 -0400

    wifi: rtl8xxxu: fix use-after-free from rx_urb_wq on stop
    
    [ Upstream commit 6c080026ecc17eecb103f8927c64ea73a74bb818 ]
    
    rtl8xxxu arms rx_urb_wq from the RX completion path:
    rtl8xxxu_rx_complete() hands the URB to rtl8xxxu_queue_rx_urb(), which
    queues it on rx_urb_pending_list and, once the list grows past
    RTL8XXXU_RX_URB_PENDING_WATER, schedules rx_urb_wq.  The worker
    rtl8xxxu_rx_urb_work() drains rx_urb_pending_list, recovers priv through
    container_of, and resubmits each URB through rtl8xxxu_submit_rx_urb(),
    which anchors it on rx_anchor and dereferences priv->udev.
    
    rtl8xxxu_stop() cancels the sibling work items (c2hcmd_work, ra_watchdog,
    update_beacon_work) but never cancels rx_urb_wq, so a worker armed during
    the last burst of RX traffic can run rtl8xxxu_rx_urb_work() after
    rtl8xxxu_disconnect() has called ieee80211_free_hw(), which frees priv,
    producing a use-after-free.  The window opens under active RX traffic
    (pending count above the watermark) followed by a disconnect.
    
    There are two teardown races to close:
    
      * rtl8xxxu_queue_rx_urb() decided whether to enqueue under rx_urb_lock
        but called schedule_work() after dropping the lock.  A completion
        that observed shutdown == false and released the lock could then call
        schedule_work() after rtl8xxxu_stop() had set shutdown and
        cancel_work_sync() had already returned, arming the worker to run
        after the teardown.  Move schedule_work() under the same !shutdown
        branch so the arming decision is atomic with the shutdown check.
    
      * rtl8xxxu_rx_urb_work() anchors every URB it drained back onto
        rx_anchor through rtl8xxxu_submit_rx_urb().  A worker still running
        when usb_kill_anchored_urbs(&priv->rx_anchor) returned would submit a
        URB that escaped the kill.  In rtl8xxxu_stop(), call
        cancel_work_sync(&priv->rx_urb_wq) before the kill so the worker is
        drained first.
    
    After priv->shutdown is set under rx_urb_lock, completions can no longer
    queue rx_urb_wq. cancel_work_sync() then drains the last queued or running
    worker, and the following usb_kill_anchored_urbs() kills the URBs it may
    have submitted.
    
    rtl8xxxu_disconnect() is covered because ieee80211_unregister_hw()
    guarantees .stop() runs for a live interface before ieee80211_free_hw()
    frees priv.  The probe error path needs no cancel: rx_urb_wq is
    INIT_WORK()'d there but cannot have been scheduled, since no URB is
    submitted before ieee80211_register_hw() succeeds.
    
    This bug was found by static analysis.
    
    Fixes: 26f1fad29ad9 ("New driver: rtl8xxxu (mac80211)")
    Cc: [email protected]
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Ping-Ke Shih <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wcn36xx: fix heap overflow from oversized firmware HAL response [+ + +]
Author: Tristan Madani <[email protected]>
Date:   Tue Apr 21 13:50:16 2026 +0000

    wifi: wcn36xx: fix heap overflow from oversized firmware HAL response
    
    commit 88a240d86d3d64521f9194abe185ac71cc74d0bd upstream.
    
    The firmware response dispatcher copies all synchronous HAL responses
    into the 4096-byte hal_buf without validating the response length. A
    response exceeding WCN36XX_HAL_BUF_SIZE causes a heap buffer overflow
    with firmware-controlled content.
    
    Add a bounds check on the response length.
    
    Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware")
    Signed-off-by: Tristan Madani <[email protected]>
    Reviewed-by: Loic Poulain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jeff Johnson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: wcn36xx: Fix potential use-after-free in TX ack timer teardown [+ + +]
Author: Fan Wu <[email protected]>
Date:   Tue Sep 22 14:51:13 2026 -0400

    wifi: wcn36xx: Fix potential use-after-free in TX ack timer teardown
    
    [ Upstream commit d9be5e75530772fc31637070d51e5717d6aeaa2a ]
    
    wcn36xx_dxe_deinit() tears down the TX ack timer with timer_delete(),
    which only dequeues the timer and does not wait for a callback that is
    already executing; the preceding free_irq() calls synchronize the
    interrupt handlers only. The callback, wcn36xx_dxe_tx_timer(), can
    therefore be running past the teardown and use the wcn freed along
    with the ieee80211_hw in wcn36xx_remove(): it takes wcn->dxe_lock,
    reads wcn->tx_ack_skb and passes wcn->hw to
    ieee80211_tx_status_irqsafe().
    
    Fix this by using timer_shutdown_sync(), which waits for a running
    callback and also prevents the timer from being rearmed again. The
    timer is set up again by wcn36xx_dxe_init() on the next start, so the
    start/stop cycle is unaffected.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: fdf21cc37149 ("wcn36xx: Add TX ack support")
    Cc: [email protected]
    Assisted-by: LLM
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Reviewed-by: Loic Poulain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jeff Johnson <[email protected]>
    [ Adapted the patch to replace del_timer() instead of timer_delete(). ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wl12xx: Drop if with an always false condition [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Sun Oct 4 22:09:56 2026 -0400

    wifi: wl12xx: Drop if with an always false condition
    
    [ Upstream commit 69ddcea564437ce4b0d5143f37a9154fcef8d3d2 ]
    
    The remove callback is only called after probe completed successfully.
    In this case platform_set_drvdata() was called with a non-NULL argument
    (in wlcore_probe()) and so wl is never NULL.
    
    This is a preparation for making platform remove callbacks return void.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Kalle Valo <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Stable-dep-of: a8b8881d0c1a ("wifi: wlcore: Fix runtime PM leak in wlcore_remove()")
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wlcore: Convert to platform remove callback returning void [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Sun Oct 4 22:09:57 2026 -0400

    wifi: wlcore: Convert to platform remove callback returning void
    
    [ Upstream commit f00928012886a07ca6817ea70eb4856ce280ce05 ]
    
    The .remove() callback for a platform driver returns an int which makes
    many driver authors wrongly assume it's possible to do error handling by
    returning an error code.  However the value returned is (mostly) ignored
    and this typically results in resource leaks. To improve here there is a
    quest to make the remove callback return void. In the first step of this
    quest all drivers are converted to .remove_new() which already returns
    void.
    
    wlcore_remove() returned zero unconditionally. With that converted to
    return void instead, the wl12xx and wl18xx driver can be converted to
    .remove_new trivially.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Kalle Valo <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Stable-dep-of: a8b8881d0c1a ("wifi: wlcore: Fix runtime PM leak in wlcore_remove()")
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wlcore: Fix runtime PM leak in wlcore_remove() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Sun Oct 4 22:09:58 2026 -0400

    wifi: wlcore: Fix runtime PM leak in wlcore_remove()
    
    [ Upstream commit a8b8881d0c1aff544fae190469d86db7b07f43a9 ]
    
    pm_runtime_get_sync() keeps the runtime PM usage counter elevated even
    when it returns an error, so the reference taken at the beginning of
    wlcore_remove() has to be dropped on every exit path. When the device
    was not initialized the function returned early without doing so,
    leaking the reference.
    
    Release it with pm_runtime_put_noidle() as done on the other early error
    paths of this driver.
    
    Fixes: fa2648a34e73f ("wlcore: Add support for runtime PM")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
wireguard: noise: reject response consumption after intermediate initiation [+ + +]
Author: Jason A. Donenfeld <[email protected]>
Date:   Thu Oct 8 14:59:16 2026 +0200

    wireguard: noise: reject response consumption after intermediate initiation
    
    commit d0305f8d90029556260c6824b61c493c424eba9e upstream.
    
    Two threads begin processing the identical response message, received
    twice. The first thread, A, runs. While it's running, the second one,
    B, gets partway through, and during that slow calculation, or even while
    blocking on down_write(), A completes and then also a handshake
    initiation that's already been queued up runs in thread C, which itself
    takes that same down_write(). The handshake initiation creation
    succeeds, and sets the state back to waiting-for-response, and calls
    up_write(), at which point thread B resumes, because either its finished
    its calculations or was finally allowed to acquire down_write(). Thread
    B then copies the state back to the peer, and begins a new session,
    using that state, which is the same session as the one made in thread A.
    
    Thread A                        Thread B                        Thread C
    
    down_read()
     sA = handshake->state
     memcpy(cA, handshake->crypto)
    up_read()
    if (sA != 1)
     goto fail
    slow_crypto(cA)
                                    down_read()
                                     sB = handshake->state
                                     memcpy(cB, handshake->crypto)
                                    up_read()
                                    if (sB != 1)
                                     goto fail
                                    slow_crypto(cB)
    down_write()
     if (sA != handshake->state)
      goto fail
     memcpy(handshake->crypto, cA)
     handshake->state = 2
    up_write()
    down_write()
     if (handshake->state != 2)
      goto fail
     derive_session(handshake->crypto)
    up_write()
                                                                    down_write()
                                                                     slow_crypto(handshake->crypto)
                                                                     handshake->state = 1
                                                                    up_write()
                                    down_write()
                                     if (sB != handshake->state)
                                       goto fail
                                     memcpy(handshake->crypto, cB)
                                     handshake->state = 2
                                    up_write()
                                    down_write()
                                     if (handshake->state != 2)
                                      goto fail
                                     derive_session(handshake->crypto)
                                    up_write()
    
    This seems basically impossible to hit in a meaningful way in practice,
    but ensure that it absolutely cannot happen by comparing the ephemeral
    private key that's on the stack with the latest one that the peer's
    handshake state has.
    
    Cc: [email protected]
    Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
    Reported-by: Jérémy Jean <[email protected]>
    Signed-off-by: Jason A. Donenfeld <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
workqueue: Fix NULL current_pwq deref in chained work check [+ + +]
Author: Pavankumar Kondeti <[email protected]>
Date:   Mon Sep 28 09:18:56 2026 +0530

    workqueue: Fix NULL current_pwq deref in chained work check
    
    commit 980db94e3eeefdd8a1c46f86412c33a7f7806f51 upstream.
    
    current_wq_worker() only tells us that %current is a kworker. It does
    not guarantee that the worker is currently executing a work item, as
    worker->current_pwq is populated only while process_one_work() is running
    the work function.
    
    is_chained_work() can be reached while queueing on a draining or
    destroying workqueue. If a kworker outside work-item execution reaches
    that path, current_wq_worker() returns a worker but worker->current_pwq is
    NULL, and the chained-work test can fault before it emits the intended
    warning.
    
    Guard the chained-work test with worker->current_pwq. A kworker without
    current_pwq is not executing work on the target workqueue, so the helper
    should return false and let the draining/destroying warning fire.
    
    Fixes: 8d03ecfe4718 ("workqueue: reimplement is_chained_work() using current_wq_worker()")
    Cc: [email protected]
    Signed-off-by: Pavankumar Kondeti <[email protected]>
    Signed-off-by: Tejun Heo <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
xen/netfront: don't leak the skb when xennet_fill_frags() fails [+ + +]
Author: Josef Bacik <[email protected]>
Date:   Wed Oct 7 17:57:32 2026 +0000

    xen/netfront: don't leak the skb when xennet_fill_frags() fails
    
    commit 93ccaf1c26e2133396173b76a071e59024daa622 upstream.
    
    When a response chain has more slots than fit in the skb's frags,
    xennet_fill_frags() returns an error and xennet_poll() jumps to its
    error path.  That path moves what's left on tmpq to errq to be freed,
    but the skb being filled was already dequeued from tmpq, so it's never
    freed.  Each chain that overflows leaks the skb and the pages attached
    to it as frags, and the backend decides how many slots it sends.
    
    Put the skb back on tmpq before taking the error path, like the
    xennet_set_skb_gso() failure just above it does.
    
    Fixes: ad4f15dc2c70 ("xen/netfront: don't bug in case of too many frags")
    Cc: [email protected]
    Signed-off-by: Josef Bacik <[email protected]>
    Reviewed-by: Juergen Gross <[email protected]>
    Link: https://patch.msgid.link/20261007-b4-xen-netfront-fill-frags-leak-v1-1-a8a01ff9cd52@toxicpanda.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xen/netfront: drop RX packets with a short Ethernet header [+ + +]
Author: Josef Bacik <[email protected]>
Date:   Wed Oct 7 17:55:40 2026 +0000

    xen/netfront: drop RX packets with a short Ethernet header
    
    commit 089e58805c452e52179482b1025a8e309a57f801 upstream.
    
    handle_incoming_queue() pulls pull_to bytes into the head before
    calling eth_type_trans().  pull_to is the length of the first RX slot,
    capped at RX_COPY_THRESHOLD, and that length comes from the backend.
    Nothing checks it against ETH_HLEN.
    
    If the first slot is shorter than ETH_HLEN and more slots follow, the
    head ends up shorter than an Ethernet header while skb->len is longer,
    and eth_type_trans() BUG()s in __skb_pull().  If the whole packet is
    shorter than ETH_HLEN, eth_type_trans() reads the header past the end
    of the data instead.
    
    Pull at least ETH_HLEN, and drop the packet if that fails, which also
    drops packets too short to hold an Ethernet header.  This also checks
    the return value of the pull, which was ignored.
    
    Fixes: 0d160211965b ("xen: add virtual network device driver")
    Cc: [email protected]
    Signed-off-by: Josef Bacik <[email protected]>
    Link: https://patch.msgid.link/20261007-b4-xen-netfront-short-head-v1-1-12d7113a7e4e@toxicpanda.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
xfrm: prevent policy_hthresh.work from racing with netns teardown [+ + +]
Author: Tahera Fahimi <[email protected]>
Date:   Thu Oct 15 16:06:34 2026 -0700

    xfrm: prevent policy_hthresh.work from racing with netns teardown
    
    An XFRM_MSG_NEWSPDINFO request can queue the per-net work item
    policy_hthresh.work onto the system workqueue. xfrm_hash_rebuild()
    retrieves the enclosing struct net from the work item, so the callback
    can dereference freed memory if it runs after net namespace teardown.
    
    Mainline commit 29fe3a61bcdc ("xfrm: prevent policy_hthresh.work
    from racing with netns teardown") fixes this issue using
    disable_work_sync(). That API is not available in Linux 5.15, so the
    mainline change cannot be directly backported.
    
    Provide the same guarantee with an XFRM-local work_disabled flag. Protect
    the flag and schedule_work() with the existing policy_hthresh seqlock so
    teardown can atomically stop new queueing attempts. Then use
    cancel_work_sync() to synchronize work that was queued before the flag was
    set. This ensures policy_hthresh.work cannot outlive its struct net.
    
    Fixes: 880a6fab8f6b ("xfrm: configure policy hash table thresholds by netlink")
    Assisted-by: GitHub-Copilot:GPT-5.6 Sol
    Signed-off-by: Tahera Fahimi <[email protected]>
    Reviewed-by: Allen Pais <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
xfs: aborting inodes on shutdown may need buffer lock [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:53 2026 +0530

    xfs: aborting inodes on shutdown may need buffer lock
    
    [ Upstream commit d2d7c0473586d2f22e85d615275f34cf19f94447 ]
    
    Most buffer io list operations are run with the bp->b_lock held, but
    xfs_iflush_abort() can be called without the buffer lock being held
    resulting in inodes being removed from the buffer list while other
    list operations are occurring. This causes problems with corrupted
    bp->b_io_list inode lists during filesystem shutdown, leading to
    traversals that never end, double removals from the AIL, etc.
    
    Fix this by passing the buffer to xfs_iflush_abort() if we have
    it locked. If the inode is attached to the buffer, we're going to
    have to remove it from the buffer list and we'd have to get the
    buffer off the inode log item to do that anyway.
    
    If we don't have a buffer passed in (e.g. from xfs_reclaim_inode())
    then we can determine if the inode has a log item and if it is
    attached to a buffer before we do anything else. If it does have an
    attached buffer, we can lock it safely (because the inode has a
    reference to it) and then perform the inode abort.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Stable-dep-of: 09234a632be4 ("xfs: xfs_ifree_cluster vs xfs_iflush_shutdown_abort deadlock")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: buffer pins need to hold a buffer reference [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:55 2026 +0530

    xfs: buffer pins need to hold a buffer reference
    
    [ Upstream commit 89a4bf0dc3857569a77061d3d5ea2ac85f7e13c6 ]
    
    When a buffer is unpinned by xfs_buf_item_unpin(), we need to access
    the buffer after we've dropped the buffer log item reference count.
    This opens a window where we can have two racing unpins for the
    buffer item (e.g. shutdown checkpoint context callback processing
    racing with journal IO iclog completion processing) and both attempt
    to access the buffer after dropping the BLI reference count.  If we
    are unlucky, the "BLI freed" context wins the race and frees the
    buffer before the "BLI still active" case checks the buffer pin
    count.
    
    This results in a use after free that can only be triggered
    in active filesystem shutdown situations.
    
    To fix this, we need to ensure that buffer existence extends beyond
    the BLI reference count checks and until the unpin processing is
    complete. This implies that a buffer pin operation must also take a
    buffer reference to ensure that the buffer cannot be freed until the
    buffer unpin processing is complete.
    
    Reported-by: yangerkun <[email protected]>
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Dave Chinner <[email protected]>
    Signed-off-by: Leah Rumancik <[email protected]>
    Acked-by: Chandan Babu R <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    (cherry picked from commit 81274891036602355e72eabbb5184490f354b506)
    Stable-dep-of: 816c330b605c ("xfs: factor out stale buffer item completion")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: catch stale AGF/AGF metadata [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:57 2026 +0530

    xfs: catch stale AGF/AGF metadata
    
    [ Upstream commit db6a2274162de615ff74b927d38942fe3134d298 ]
    
    There is a race condition that can trigger in dmflakey fstests that
    can result in asserts in xfs_ialloc_read_agi() and
    xfs_alloc_read_agf() firing. The asserts look like this:
    
     XFS: Assertion failed: pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks), file: fs/xfs/libxfs/xfs_alloc.c, line: 3440
    .....
     Call Trace:
      <TASK>
      xfs_alloc_read_agf+0x2ad/0x3a0
      xfs_alloc_fix_freelist+0x280/0x720
      xfs_alloc_vextent_prepare_ag+0x42/0x120
      xfs_alloc_vextent_iterate_ags+0x67/0x260
      xfs_alloc_vextent_start_ag+0xe4/0x1c0
      xfs_bmapi_allocate+0x6fe/0xc90
      xfs_bmapi_convert_delalloc+0x338/0x560
      xfs_map_blocks+0x354/0x580
      iomap_writepages+0x52b/0xa70
      xfs_vm_writepages+0xd7/0x100
      do_writepages+0xe1/0x2c0
      __writeback_single_inode+0x44/0x340
      writeback_sb_inodes+0x2d0/0x570
      __writeback_inodes_wb+0x9c/0xf0
      wb_writeback+0x139/0x2d0
      wb_workfn+0x23e/0x4c0
      process_scheduled_works+0x1d4/0x400
      worker_thread+0x234/0x2e0
      kthread+0x147/0x170
      ret_from_fork+0x3e/0x50
      ret_from_fork_asm+0x1a/0x30
    
    I've seen the AGI variant from scrub running on the filesysetm
    after unmount failed due to systemd interference:
    
     XFS: Assertion failed: pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || xfs_is_shutdown(pag->pag_mount), file: fs/xfs/libxfs/xfs_ialloc.c, line: 2804
    .....
     Call Trace:
      <TASK>
      xfs_ialloc_read_agi+0xee/0x150
      xchk_perag_drain_and_lock+0x7d/0x240
      xchk_ag_init+0x34/0x90
      xchk_inode_xref+0x7b/0x220
      xchk_inode+0x14d/0x180
      xfs_scrub_metadata+0x2e2/0x510
      xfs_ioc_scrub_metadata+0x62/0xb0
      xfs_file_ioctl+0x446/0xbf0
      __se_sys_ioctl+0x6f/0xc0
      __x64_sys_ioctl+0x1d/0x30
      x64_sys_call+0x1879/0x2ee0
      do_syscall_64+0x68/0x130
      ? exc_page_fault+0x62/0xc0
      entry_SYSCALL_64_after_hwframe+0x76/0x7e
    
    Essentially, it is the same problem. When _flakey_drop_and_remount()
    loads the drop-writes table, it makes all writes silently fail. Writes
    are reported to the fs as completed successfully, but they are not
    issued to the backing store. The filesystem sees the successful
    write completion and marks the metadata buffer clean and removes it
    from the AIL.
    
    If this happens at the same time as memory pressure is occuring,
    the now-clean AGF and/or AGI buffers can be reclaimed from memory.
    
    Shortly afterwards, but before _flakey_drop_and_remount() runs
    unmount, background writeback is kicked and it tries to allocate
    blocks for the dirty pages in memory. This then tries to access the
    AGF buffer we just turfed out of memory. It's not found, so it gets
    read in from disk.
    
    This is all fine, except for the fact that the last writeback of the
    AGF did not actually reach disk. The AGF on disk is stale compared
    to the in-memory state held by the perag, and so they don't match
    and the assert fires.
    
    Then other operations on that inode hang because the task was killed
    whilst holding inode locks. e.g:
    
     Workqueue: xfs-conv/dm-12 xfs_end_io
     Call Trace:
      <TASK>
      __schedule+0x650/0xb10
      schedule+0x6d/0xf0
      schedule_preempt_disabled+0x15/0x30
      rwsem_down_write_slowpath+0x31a/0x5f0
      down_write+0x43/0x60
      xfs_ilock+0x1a8/0x210
      xfs_trans_alloc_inode+0x9c/0x240
      xfs_iomap_write_unwritten+0xe3/0x300
      xfs_end_ioend+0x90/0x130
      xfs_end_io+0xce/0x100
      process_scheduled_works+0x1d4/0x400
      worker_thread+0x234/0x2e0
      kthread+0x147/0x170
      ret_from_fork+0x3e/0x50
      ret_from_fork_asm+0x1a/0x30
      </TASK>
    
    and it's all down hill from there.
    
    Memory pressure is one way to trigger this, another is to run "echo
    3 > /proc/sys/vm/drop_caches" randomly while tests are running.
    
    Regardless of how it is triggered, this effectively takes down the
    system once umount hangs because it's holding a sb->s_umount lock
    exclusive and now every sync(1) call gets stuck on it.
    
    Fix this by replacing the asserts with a corruption detection check
    and a shutdown.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    
    6.12:
    
    Fixed conflict due to the following missing commit:
            e9c4d8bfb26c ("xfs: factor out a generic xfs_group structure")
    
    6.6:
    
    Fixed conflict due to the following missing commit:
            e45ea3645178 ("xfs: split the agf_roots and agf_levels arrays")
    
    5.15:
    
    Fixed conflict due to the following missing commits:
            6f643c57d57c ("xfs: implement ->notify_failure() for XFS")
            [Continuous range: a95fee40e3d4^..08d3e84feeb8]
            08d3e84feeb8 ("xfs: pass perag to xfs_alloc_read_agf()")
            76b47e528e3a ("xfs: kill xfs_alloc_pagf_init()")
            99b13c7f0bd3 ("xfs: pass perag to xfs_ialloc_read_agi()")
            a95fee40e3d4 ("xfs: kill xfs_ialloc_pagi_init()")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf [+ + +]
Author: Yun Zhou <[email protected]>
Date:   Thu Oct 22 15:10:31 2026 -0400

    xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf
    
    [ Upstream commit 41a28c865d1d5843f8cb9e0af17a8f4d9e2961ff ]
    
    xfs_sync_sb_buf() holds sb/rtsb buffer locks across a synchronous
    xfs_trans_commit(), which flushes the CIL push workqueue internally.
    If shutdown occurs during the CIL push, xfs_buf_item_unpin() needs to
    lock these buffers to fail them, causing a deadlock:
    
      setlabel:          holds buf lock -> flush_workqueue(xfs-cil)
      CIL push worker:   xfs_buf_item_unpin -> xfs_buf_lock(same buf)
    
    Remove the xfs_trans_bhold() calls so that commit releases the buffer
    locks normally.  After the sync commit, re-acquire the buffers via
    mp->m_sb_bp / mp->m_rtsb_bp for the on-disk writeback.
    
    Fixes: f7664b31975b ("xfs: implement online get/set fs label")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=837bcd54843dd6262f2f
    Cc: [email protected]
    Signed-off-by: Yun Zhou <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    [ sashal: Omitted realtime superblock handling because xfs_sync_sb_buf() only handles the main superblock. ]
    Signed-off-by: Sasha Levin <[email protected]>

xfs: factor out stale buffer item completion [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:59 2026 +0530

    xfs: factor out stale buffer item completion
    
    [ Upstream commit 816c330b605c3f4813c0dc0ab5af5cce17ff06b3 ]
    
    The stale buffer item completion handling is currently only done
    from BLI unpinning. We need to perform this function from where-ever
    the last reference to the BLI is dropped, so first we need to
    factor this code out into a helper.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: fix super block buf log item UAF during force shutdown [+ + +]
Author: Guo Xuenan <[email protected]>
Date:   Tue Oct 13 15:08:54 2026 +0530

    xfs: fix super block buf log item UAF during force shutdown
    
    [ Upstream commit 575689fc0ffa6c4bb4e72fd18e31a6525a6124e0 ]
    
    xfs log io error will trigger xlog shut down, and end_io worker call
    xlog_state_shutdown_callbacks to unpin and release the buf log item.
    The race condition is that when there are some thread doing transaction
    commit and happened not to be intercepted by xlog_is_shutdown, then,
    these log item will be insert into CIL, when unpin and release these
    buf log item, UAF will occur. BTW, add delay before `xlog_cil_commit`
    can increase recurrence probability.
    
    The following call graph actually encountered this bad situation.
    fsstress                    io end worker kworker/0:1H-216
                                xlog_ioend_work
                                  ->xlog_force_shutdown
                                    ->xlog_state_shutdown_callbacks
                                      ->xlog_cil_process_committed
                                        ->xlog_cil_committed
                                          ->xfs_trans_committed_bulk
    ->xfs_trans_apply_sb_deltas             ->li_ops->iop_unpin(lip, 1);
      ->xfs_trans_getsb
        ->_xfs_trans_bjoin
          ->xfs_buf_item_init
            ->if (bip) { return 0;} //relog
    ->xlog_cil_commit
      ->xlog_cil_insert_items //insert into CIL
                                               ->xfs_buf_ioend_fail(bp);
                                                 ->xfs_buf_ioend
                                                   ->xfs_buf_item_done
                                                     ->xfs_buf_item_relse
                                                       ->xfs_buf_item_free
    
    when cil push worker gather percpu cil and insert super block buf log item
    into ctx->log_items then uaf occurs.
    
    ==================================================================
    BUG: KASAN: use-after-free in xlog_cil_push_work+0x1c8f/0x22f0
    Write of size 8 at addr ffff88801800f3f0 by task kworker/u4:4/105
    
    CPU: 0 PID: 105 Comm: kworker/u4:4 Tainted: G W
    6.1.0-rc1-00001-g274115149b42 #136
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
    1.13.0-1ubuntu1.1 04/01/2014
    Workqueue: xfs-cil/sda xlog_cil_push_work
    Call Trace:
     <TASK>
     dump_stack_lvl+0x4d/0x66
     print_report+0x171/0x4a6
     kasan_report+0xb3/0x130
     xlog_cil_push_work+0x1c8f/0x22f0
     process_one_work+0x6f9/0xf70
     worker_thread+0x578/0xf30
     kthread+0x28c/0x330
     ret_from_fork+0x1f/0x30
     </TASK>
    
    Allocated by task 2145:
     kasan_save_stack+0x1e/0x40
     kasan_set_track+0x21/0x30
     __kasan_slab_alloc+0x54/0x60
     kmem_cache_alloc+0x14a/0x510
     xfs_buf_item_init+0x160/0x6d0
     _xfs_trans_bjoin+0x7f/0x2e0
     xfs_trans_getsb+0xb6/0x3f0
     xfs_trans_apply_sb_deltas+0x1f/0x8c0
     __xfs_trans_commit+0xa25/0xe10
     xfs_symlink+0xe23/0x1660
     xfs_vn_symlink+0x157/0x280
     vfs_symlink+0x491/0x790
     do_symlinkat+0x128/0x220
     __x64_sys_symlink+0x7a/0x90
     do_syscall_64+0x35/0x80
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    Freed by task 216:
     kasan_save_stack+0x1e/0x40
     kasan_set_track+0x21/0x30
     kasan_save_free_info+0x2a/0x40
     __kasan_slab_free+0x105/0x1a0
     kmem_cache_free+0xb6/0x460
     xfs_buf_ioend+0x1e9/0x11f0
     xfs_buf_item_unpin+0x3d6/0x840
     xfs_trans_committed_bulk+0x4c2/0x7c0
     xlog_cil_committed+0xab6/0xfb0
     xlog_cil_process_committed+0x117/0x1e0
     xlog_state_shutdown_callbacks+0x208/0x440
     xlog_force_shutdown+0x1b3/0x3a0
     xlog_ioend_work+0xef/0x1d0
     process_one_work+0x6f9/0xf70
     worker_thread+0x578/0xf30
     kthread+0x28c/0x330
     ret_from_fork+0x1f/0x30
    
    The buggy address belongs to the object at ffff88801800f388
     which belongs to the cache xfs_buf_item of size 272
    The buggy address is located 104 bytes inside of
     272-byte region [ffff88801800f388, ffff88801800f498)
    
    The buggy address belongs to the physical page:
    page:ffffea0000600380 refcount:1 mapcount:0 mapping:0000000000000000
    index:0xffff88801800f208 pfn:0x1800e
    head:ffffea0000600380 order:1 compound_mapcount:0 compound_pincount:0
    flags: 0x1fffff80010200(slab|head|node=0|zone=1|lastcpupid=0x1fffff)
    raw: 001fffff80010200 ffffea0000699788 ffff88801319db50 ffff88800fb50640
    raw: ffff88801800f208 000000000015000a 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected
    
    Memory state around the buggy address:
     ffff88801800f280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff88801800f300: fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc fc
    >ffff88801800f380: fc fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                                                                 ^
     ffff88801800f400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff88801800f480: fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc fc
    ==================================================================
    Disabling lock debugging due to kernel taint
    
    Signed-off-by: Guo Xuenan <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Leah Rumancik <[email protected]>
    Acked-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    (cherry picked from commit 0d889ae85fcf0cf9bc6e998fca2ec760e08e0b46)
    Stable-dep-of: d2fe5c4c8d25 ("xfs: rearrange code in xfs_buf_item.c")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: fix unmount hang with unflushable inodes stuck in the AIL [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:00 2026 +0530

    xfs: fix unmount hang with unflushable inodes stuck in the AIL
    
    [ Upstream commit 7b5f775be14ac1532c049022feadcfe44769566d ]
    
    Unmount of a shutdown filesystem can hang with stale inode cluster
    buffers in the AIL like so:
    
    [95964.140623] Call Trace:
    [95964.144641]  __schedule+0x699/0xb70
    [95964.154003]  schedule+0x64/0xd0
    [95964.156851]  xfs_ail_push_all_sync+0x9b/0xf0
    [95964.164816]  xfs_unmount_flush_inodes+0x41/0x70
    [95964.168698]  xfs_unmountfs+0x7f/0x170
    [95964.171846]  xfs_fs_put_super+0x3b/0x90
    [95964.175216]  generic_shutdown_super+0x77/0x160
    [95964.178060]  kill_block_super+0x1b/0x40
    [95964.180553]  xfs_kill_sb+0x12/0x30
    [95964.182796]  deactivate_locked_super+0x38/0x100
    [95964.185735]  deactivate_super+0x41/0x50
    [95964.188245]  cleanup_mnt+0x9f/0x160
    [95964.190519]  __cleanup_mnt+0x12/0x20
    [95964.192899]  task_work_run+0x89/0xb0
    [95964.195221]  resume_user_mode_work+0x4f/0x60
    [95964.197931]  syscall_exit_to_user_mode+0x76/0xb0
    [95964.201003]  do_syscall_64+0x74/0x130
    
    $ pstree -N mnt |grep umount
                 |-check-parallel---nsexec---run_test.sh---753---umount
    
    It always seems to be generic/753 that triggers this, and repeating
    a quick group test run triggers it every 10-15 iterations. Hence it
    generally triggers once up every 30-40 minutes of test time. just
    running generic/753 by itself or concurrently with a limited group
    of tests doesn't reproduce this issue at all.
    
    Tracing on a hung system shows the AIL repeating every 50ms a log
    force followed by an attempt to push pinned, aborted inodes from the
    AIL (trimmed for brevity):
    
     xfs_log_force:   lsn 0x1c caller xfsaild+0x18e
     xfs_log_force:   lsn 0x0 caller xlog_cil_flush+0xbd
     xfs_log_force:   lsn 0x1c caller xfs_log_force+0x77
     xfs_ail_pinned:  lip 0xffff88826014afa0 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88814000a708 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88810b850c80 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88810b850af0 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff888165cf0a28 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88810b850bb8 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     ....
    
    The inode log items are marked as aborted, which means that either:
    
    a) a transaction commit has occurred, seen an error or shutdown, and
    called xfs_trans_free_items() to abort the items. This should happen
    before any pinning of log items occurs.
    
    or
    
    b) a dirty transaction has been cancelled. This should also happen
    before any pinning of log items occurs.
    
    or
    
    c) AIL insertion at journal IO completion is marked as aborted. In
    this case, the log item is pinned by the CIL until journal IO
    completes and hence needs to be unpinned. This is then done after
    the ->iop_committed() callback is run, so the pin count should be
    balanced correctly.
    
    Yet none of these seemed to be occurring. Further tracing indicated
    this:
    
    d) Shutdown during CIL pushing resulting in log item completion
    being called from checkpoint abort processing. Items are unpinned
    and released without serialisation against each other, journal IO
    completion or transaction commit completion.
    
    In this case, we may still have a transaction commit in flight that
    holds a reference to a xfs_buf_log_item (BLI) after CIL insertion.
    e.g. a synchronous transaction will flush the CIL before the
    transaction is torn down.  The concurrent CIL push then aborts
    insertion it and drops the commit/AIL reference to the BLI. This can
    leave the transaction commit context with the last reference to the
    BLI which is dropped here:
    
    xfs_trans_free_items()
      ->iop_release
        xfs_buf_item_release
          xfs_buf_item_put
            if (XFS_LI_ABORTED)
              xfs_trans_ail_delete
            xfs_buf_item_relse()
    
    Unlike the journal completion ->iop_unpin path, this path does not
    run stale buffer completion process when it drops the last
    reference, hence leaving the stale inodes attached to the buffer
    sitting the AIL. There are no other references to those inodes, so
    there is no other mechanism to remove them from the AIL. Hence
    unmount hangs.
    
    The buffer lock context for stale buffers is passed to the last BLI
    reference. This is normally the last BLI unpin on journal IO
    completion. The unpin then processes the stale buffer completion and
    releases the buffer lock.  However, if the final unpin from journal
    IO completion (or CIL push abort) does not hold the last reference
    to the BLI, there -must- still be a transaction context that
    references the BLI, and so that context must perform the stale
    buffer completion processing before the buffer is unlocked and the
    BLI torn down.
    
    The fix for this is to rework the xfs_buf_item_relse() path to run
    stale buffer completion processing if it drops the last reference to
    the BLI. We still hold the buffer locked, so the buffer owner and
    lock context is the same as if we passed the BLI and buffer to the
    ->iop_unpin() context to finish stale process on journal commit.
    
    However, we have to be careful here. In a shutdown state, we can be
    freeing dirty BLIs from xfs_buf_item_put() via xfs_trans_brelse()
    and xfs_trans_bdetach().  The existing code handles this case by
    considering shutdown state as "aborted", but in doing so
    largely masks the failure to clean up stale BLI state from the
    xfs_buf_item_relse() path. i.e  regardless of the shutdown state and
    whether the item is in the AIL, we must finish the stale buffer
    cleanup if we are are dropping the last BLI reference from the
    ->iop_relse path in transaction commit context.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: log items should have a xlog pointer, not a mount [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:52 2026 +0530

    xfs: log items should have a xlog pointer, not a mount
    
    [ Upstream commit d86142dd7c4e10e50bdb3679b405d748214b2c28 ]
    
    Log items belong to the log, not the xfs_mount. Convert the mount
    pointer in the log item to a xlog pointer in preparation for
    upcoming log centric changes to the log items.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Chandan Babu R <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: rearrange code in xfs_buf_item.c [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:58 2026 +0530

    xfs: rearrange code in xfs_buf_item.c
    
    [ Upstream commit d2fe5c4c8d25999862d615f616aea7befdd62799 ]
    
    The code to initialise, release and free items is all the way down
    the bottom of the file. Upcoming fixes need to these functions
    earlier in the file, so move them to the top.
    
    There is one code change in this move - the parameter to
    xfs_buf_item_relse() is changed from the xfs_buf to the
    xfs_buf_log_item - the thing that the function is releasing.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    
    6.6:
    
    Fixed conflict due to the following missing commits:
            [Continuous range: 10634530f7ba^..d4c75a1b40cd]
            d4c75a1b40cd ("xfs: convert remaining kmem_free() to kfree()")
            49292576136f ("xfs: convert kmem_free() for kvmalloc users to kvfree()")
            afdc115559c5 ("xfs: move kmem_to_page()")
            f078d4ea8276 ("xfs: convert kmem_alloc() to kmalloc()")
            10634530f7ba ("xfs: convert kmem_zalloc() to kzalloc()")
    
    Removed ASSERT in favour of existing atomic_read-and-return in
    xfs_buf_item_relse() due to the following missing commit:
            3762113b597f ("xfs: don't lose solo superblock counter update transactions")
    
    5.15:
    
    Fixed conflict due to the following missing commit:
            182696fb021f ("xfs: rename _zone variables to _cache")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: xfs_ifree_cluster vs xfs_iflush_shutdown_abort deadlock [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:08:56 2026 +0530

    xfs: xfs_ifree_cluster vs xfs_iflush_shutdown_abort deadlock
    
    [ Upstream commit 09234a632be42573d9743ac5ff6773622d233ad0 ]
    
    Lock order of xfs_ifree_cluster() is cluster buffer -> try ILOCK
    -> IFLUSHING, except for the last inode in the cluster that is
    triggering the free. In that case, the lock order is ILOCK ->
    cluster buffer -> IFLUSHING.
    
    xfs_iflush_cluster() uses cluster buffer -> try ILOCK -> IFLUSHING,
    so this can safely run concurrently with xfs_ifree_cluster().
    
    xfs_inode_item_precommit() uses ILOCK -> cluster buffer, but this
    cannot race with xfs_ifree_cluster() so being in a different order
    will not trigger a deadlock.
    
    xfs_reclaim_inode() during a filesystem shutdown uses ILOCK ->
    IFLUSHING -> cluster buffer via xfs_iflush_shutdown_abort(), and
    this deadlocks against xfs_ifree_cluster() like so:
    
     sysrq: Show Blocked State
     task:kworker/10:37   state:D stack:12560 pid:276182 tgid:276182 ppid:2      flags:0x00004000
     Workqueue: xfs-inodegc/dm-3 xfs_inodegc_worker
     Call Trace:
      <TASK>
      __schedule+0x650/0xb10
      schedule+0x6d/0xf0
      schedule_timeout+0x8b/0x180
      schedule_timeout_uninterruptible+0x1e/0x30
      xfs_ifree+0x326/0x730
      xfs_inactive_ifree+0xcb/0x230
      xfs_inactive+0x2c8/0x380
      xfs_inodegc_worker+0xaa/0x180
      process_scheduled_works+0x1d4/0x400
      worker_thread+0x234/0x2e0
      kthread+0x147/0x170
      ret_from_fork+0x3e/0x50
      ret_from_fork_asm+0x1a/0x30
      </TASK>
     task:fsync-tester    state:D stack:12160 pid:2255943 tgid:2255943 ppid:3988702 flags:0x00004006
     Call Trace:
      <TASK>
      __schedule+0x650/0xb10
      schedule+0x6d/0xf0
      schedule_timeout+0x31/0x180
      __down_common+0xbe/0x1f0
      __down+0x1d/0x30
      down+0x48/0x50
      xfs_buf_lock+0x3d/0xe0
      xfs_iflush_shutdown_abort+0x51/0x1e0
      xfs_icwalk_ag+0x386/0x690
      xfs_reclaim_inodes_nr+0x114/0x160
      xfs_fs_free_cached_objects+0x19/0x20
      super_cache_scan+0x17b/0x1a0
      do_shrink_slab+0x180/0x350
      shrink_slab+0xf8/0x430
      drop_slab+0x97/0xf0
      drop_caches_sysctl_handler+0x59/0xc0
      proc_sys_call_handler+0x189/0x280
      proc_sys_write+0x13/0x20
      vfs_write+0x33d/0x3f0
      ksys_write+0x7c/0xf0
      __x64_sys_write+0x1b/0x30
      x64_sys_call+0x271d/0x2ee0
      do_syscall_64+0x68/0x130
      entry_SYSCALL_64_after_hwframe+0x76/0x7e
    
    We can't change the lock order of xfs_ifree_cluster() - XFS_ISTALE
    and XFS_IFLUSHING are serialised through to journal IO completion
    by the cluster buffer lock being held.
    
    There's quite a few asserts in the code that check that XFS_ISTALE
    does not occur out of sync with buffer locking (e.g. in
    xfs_iflush_cluster). There's also a dependency on the inode log item
    being removed from the buffer before XFS_IFLUSHING is cleared, also
    with asserts that trigger on this.
    
    Further, we don't have a requirement for the inode to be locked when
    completing or aborting inode flushing because all the inode state
    updates are serialised by holding the cluster buffer lock across the
    IO to completion.
    
    We can't check for XFS_IRECLAIM in xfs_ifree_mark_inode_stale() and
    skip the inode, because there is no guarantee that the inode will be
    reclaimed. Hence it *must* be marked XFS_ISTALE regardless of
    whether reclaim is preparing to free that inode. Similarly, we can't
    check for IFLUSHING before locking the inode because that would
    result in dirty inodes not being marked with ISTALE in the event of
    racing with XFS_IRECLAIM.
    
    Hence we have to address this issue from the xfs_reclaim_inode()
    side. It is clear that we cannot hold the inode locked here when
    calling xfs_iflush_shutdown_abort() because it is the inode->buffer
    lock order that causes the deadlock against xfs_ifree_cluster().
    
    Hence we need to drop the ILOCK before aborting the inode in the
    shutdown case. Once we've aborted the inode, we can grab the ILOCK
    again and then immediately reclaim it as it is now guaranteed to be
    clean.
    
    Note that dropping the ILOCK in xfs_reclaim_inode() means that it
    can now be locked by xfs_ifree_mark_inode_stale() and seen whilst in
    this state. This is safe because we have left the XFS_IFLUSHING flag
    on the inode and so xfs_ifree_mark_inode_stale() will simply set
    XFS_ISTALE and move to the next inode. An ASSERT check in this path
    needs to be tweaked to take into account this new shutdown
    interaction.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
zram: fix out-of-bounds access in read_block_state() [+ + +]
Author: Longlong Xia <[email protected]>
Date:   Fri Sep 4 14:44:59 2026 -0400

    zram: fix out-of-bounds access in read_block_state()
    
    [ Upstream commit 391f057f44a51cc9418da5cba78b014324174264 ]
    
    read_block_state() calculates nr_pages before taking dev_lock.  If the
    device is reset and reinitialized with a smaller disksize before lock
    acquisition, nr_pages still describes the old table.  The subsequent loop
    can then call slot_lock() past the end of the newly allocated table.
    
    Read disksize after acquiring dev_lock and checking that the device is
    initialized.  The read lock then keeps the table and its bound stable for
    the duration of the scan.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: c0265342bff4 ("zram: introduce zram memory tracking")
    Assisted-by: Codex:gpt-5.6-sol
    Signed-off-by: Longlong Xia <[email protected]>
    Reviewed-by: Sergey Senozhatsky <[email protected]>
    Cc: Jens Axboe <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

zram: fixup read_block_state() [+ + +]
Author: Sergey Senozhatsky <[email protected]>
Date:   Fri Sep 4 14:44:58 2026 -0400

    zram: fixup read_block_state()
    
    [ Upstream commit 8b05d2d8af817c6a1e23032df51e7ad83030d543 ]
    
    ac_time is now in seconds, do not use ktime_to_timespec64()
    
    [[email protected]: remove now-unused local `ts']
    [[email protected]: fix build]
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Sergey Senozhatsky <[email protected]>
    Reported-by: Chris Mason <[email protected]>
    Closes: https://lkml.kernel.org/r/[email protected]
    Cc: Brian Geffon <[email protected]>
    Cc: David Stevens <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: Richard Chang <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    
    [ Stable tree note: The ac_time conversion described above is not present
      here, so retain the ktime_t conversion and microsecond output.  Move the
      timespec64 temporary into the scan loop instead, allowing the follow-up
      bounds fix to move nr_pages initialization under init_lock cleanly. ]
    
    Stable-dep-of: 391f057f44a5 ("zram: fix out-of-bounds access in read_block_state()")
    Signed-off-by: Sasha Levin <[email protected]>