Changelog in Linux kernel 5.15.218

 
ALSA: dummy: Check card index validity at probe [+ + +]
Author: Takashi Iwai <[email protected]>
Date:   Thu Aug 6 12:04:31 2026 +0200

    ALSA: dummy: Check card index validity at probe
    
    commit 02442d5fe8ee365a084b055d4fa81a0c1abfc3fd upstream.
    
    snd_dummy_probe() blindly trusts that the given devptr->id value is
    within the proper card index range.  It's OK for the devices the
    driver itself creates at the module probe time, but if the device is
    bound manually via sysfs interface, this could be -1 as "none", and
    this leads to OOB access for index[] and other parameters.
    
    Add a sanity check for the card index and warn/correct it if it's a
    value out of the range.
    
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/[email protected]
    Cc: <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ASoC: codecs: lpass-tx-macro: Fix enum kcontrol accesses [+ + +]
Author: Dawid Wróbel <[email protected]>
Date:   Mon Aug 24 19:43:57 2026 -0400

    ASoC: codecs: lpass-tx-macro: Fix enum kcontrol accesses
    
    [ Upstream commit 1ba381759e45d5d0442452cfa5c42e836191a568 ]
    
    The "DEC0 MODE" to "DEC7 MODE" controls are enumerated, but
    tx_macro_dec_mode_get() and tx_macro_dec_mode_put() access their
    value through ucontrol->value.integer.value[0] (a long) instead of
    ucontrol->value.enumerated.item[0] (an unsigned int).
    
    This same pattern was fixed in the sibling drivers by
    commit bcfe5f76cc40 ("ASoC: codecs: rx-macro: fix accessing array
    out of bounds for enum type") and
    commit 0ea5eff7c606 ("ASoC: codecs: va-macro: fix accessing array
    out of bounds for enum type"), but tx-macro was missed.
    
    On 64-bit kernels built with CONFIG_SND_CTL_DEBUG, the elem value
    sanity check catches the 4 bytes written past the enumerated item
    and every read of these controls fails with -EINVAL:
    
      snd-sm8250 sound: control 2:0:0:DEC0 MODE:0: access overflow
    
    Fixes: c39667ddcfc5 ("ASoC: codecs: lpass-tx-macro: add support for lpass tx macro")
    Assisted-by: Claude:claude-fable-5
    Cc: [email protected]
    Signed-off-by: Dawid Wróbel <[email protected]>
    Reviewed-by: Srinivas Kandagatla <[email protected]>
    Link: https://patch.msgid.link/20260730-worktree-lpass-tx-macro-enum-fix-v2-1-6d091c736116@dawidwrobel.com
    Signed-off-by: Mark Brown <[email protected]>
    [ kept `snd_soc_kcontrol_component()` context line instead of upstream's renamed `snd_kcontrol_chip()` ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Bluetooth: RFCOMM: take rfcomm_mutex for the deferred setup accept [+ + +]
Author: Ali Ahmet Memis <[email protected]>
Date:   Fri Aug 7 02:03:44 2026 +0000

    Bluetooth: RFCOMM: take rfcomm_mutex for the deferred setup accept
    
    commit 43a556b2fd43f2df6dded59c2e26560a27874c24 upstream.
    
    rfcomm_sock_recvmsg() completes a deferred setup by calling
    rfcomm_dlc_accept() without holding any RFCOMM lock:
    
            if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
                    rfcomm_dlc_accept(d);
                    return 0;
            }
    
    and rfcomm_dlc_accept() dereferences the session on its first line:
    
            struct sock *sk = d->session->sock->sk;
    
    Every other path that touches d->session runs under rfcomm_mutex:
    rfcomm_dlc_open(), rfcomm_dlc_close(), rfcomm_dlc_exists(),
    rfcomm_dlc_send_rpn(), and the RFCOMM thread through
    rfcomm_process_sessions(). rfcomm_connect_ind() is even documented as
    "called under rfcomm_lock()". This call site is the only one that skips
    it.
    
    The RFCOMM_DEFER_SETUP bit looks like it serialises the accept against
    teardown, since __rfcomm_dlc_close() returns early when it wins the
    test_and_clear. But rfcomm_recv_disc() forces the state first:
    
            d->state = BT_CLOSED;
            __rfcomm_dlc_close(d, err);
    
    and the early return only covers BT_CONNECT, BT_CONFIG, BT_OPEN and
    BT_CONNECT2. With the state already BT_CLOSED that switch does not
    match, the bit is never consulted, and __rfcomm_dlc_close() falls
    through to rfcomm_dlc_unlink(), which sets d->session = NULL.
    
    So a remote DISC on a deferred dlc clears the session while leaving
    RFCOMM_DEFER_SETUP set. The next recvmsg() then passes the
    test_and_clear and dereferences a NULL session. No timing window is
    needed: once the DISC has been processed, the dereference is
    unconditional.
    
    Give rfcomm_dlc_accept() the same shape as rfcomm_dlc_open() and
    rfcomm_dlc_close(): an exported wrapper that takes rfcomm_mutex and
    re-checks the session, around a __rfcomm_dlc_accept() that the two
    in-core callers, which already hold the mutex, keep using.
    
    Reproduced on a KASAN + PROVE_LOCKING kernel with a BR/EDR peer emulated
    over /dev/vhci: the peer brings up an ACL link, opens L2CAP on the
    RFCOMM PSM, starts a session, opens a dlc on a channel bound with
    BT_DEFER_SETUP, and sends DISC after the socket is accepted. recv() on
    the accepted socket then hits:
    
      Oops: general protection fault
      KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017]
      RIP: 0010:rfcomm_dlc_accept+0x54/0x350
      Call Trace:
        rfcomm_sock_recvmsg+0x1cd/0x230
        sock_recvmsg+0x166/0x1c0
        __sys_recvfrom+0x20d/0x300
    
    0x10 is the offset of sock in struct rfcomm_session. With this patch the
    same run completes with recv() returning 0 and no report, and lockdep
    stays quiet, confirming rfcomm_mutex is still taken before lock_sock on
    this path as it is on the thread side.
    
    Fixes: bb23c0ab8246 ("Bluetooth: Add support for deferring RFCOMM connection setup")
    Cc: [email protected]
    Signed-off-by: Ali Ahmet Memis <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
can: isotp: fix timer drain order, wakeup handling and tx_gen ordering [+ + +]
Author: Oliver Hartkopp <[email protected]>
Date:   Tue Aug 25 14:27:13 2026 +0200

    can: isotp: fix timer drain order, wakeup handling and tx_gen ordering
    
    commit 050f010f920da17c1044a4f174766ad553e770b6 upstream.
    
    This patch is a follow-up to commit cf070fe33bfb ("can: isotp: serialize
    TX state transitions under so->rx_lock") which addresses following
    sashiko-bot findings:
    
    - isotp_sendmsg(): drain so->txfrtimer first so a stale callback can't
      re-arm echotimer after the claim
    
    - isotp_release(): wake so->wait after forcing ISOTP_SHUTDOWN so a
      sleeping sendmsg() claim isn't stranded
    
    - isotp_sendmsg(): have both wait_event_interruptible() calls in
      isotp_sendmsg() also wake on ISOTP_SHUTDOWN and do not return claim to
      IDLE to avoid corrupting a concurrent isotp_release() process.
    
    - isotp_sendmsg(): handle potential claim of a new transfer when
      the wait_event_interruptible() call returns in CAN_ISOTP_WAIT_TX_DONE
      mode. Don't touch timers and states of the new transfer if a new thread
      incremented so->tx_gen before getting the lock at err_event_drop.
    
    - isotp_sendmsg(): handle a stuck can_send() and omit timer and state
      changes if a new transfer was claimed. wait_tx_done() returns the error
      recorded in so->tx_result[], tagged with the caller's own generation.
    
    - isotp_tx_timeout(): on a claimed timeout, record the ECOMM error for
      the timed-out transfer's own generation in so->tx_result[]; sk->sk_err
      is raised unconditionally, same as every other error path here.
    
    - isotp_tx_gen_done()/isotp_tx_timeout(): always read tx.state (acquire)
      before tx_gen - the reverse order let a weakly ordered CPU pair a fresh
      tx.state with a stale tx_gen/tx_result slot.
    
    - isotp_sendmsg(): wait_tx_done: drain sk_err via sock_error() once we
      have read the result from so->tx_result[], so an already-reported error
      doesn't stay latched for a later poll()/SO_ERROR.
    
    Also align the remaining lock-free so->tx.state/rx.state/cfecho accesses
    and use skb->hash as unique loopback echo frame indicator.
    
    Fixes: cf070fe33bfb ("can: isotp: serialize TX state transitions under so->rx_lock")
    Signed-off-by: Oliver Hartkopp <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Marc Kleine-Budde <[email protected]>
    Signed-off-by: Oliver Hartkopp <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

can: use skb hash instead of private variable in headroom [+ + +]
Author: Oliver Hartkopp <[email protected]>
Date:   Tue Aug 25 14:27:12 2026 +0200

    can: use skb hash instead of private variable in headroom
    
    commit d4fb6514ff8ed6912a71294e6b66a5d59ee88007 upstream.
    
    The can_skb_priv::skbcnt variable is used to identify CAN skbs in the RX
    path analogue to the skb->hash.
    
    As the skb hash is not filled in CAN skbs move the private skbcnt value to
    skb->hash and set skb->sw_hash accordingly. The skb->hash is a value used
    for RPS to identify skbs. Use it as intended.
    
    Signed-off-by: Marc Kleine-Budde <[email protected]>
    Signed-off-by: Oliver Hartkopp <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Oliver Hartkopp <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/amdgpu: check ASPM on the dGPU host link [+ + +]
Author: Yang Wang <[email protected]>
Date:   Wed Aug 5 20:39:18 2026 +0800

    drm/amdgpu: check ASPM on the dGPU host link
    
    commit 2a9c5154a5650c09ad44ff5e1dff74754e15a3c6 upstream.
    
    dGPUs with an internal PCIe switch expose graphics functions below the
    switch downstream port. The automatic ASPM check uses the display
    endpoint and evaluates the internal link instead of the host link.
    
    Use the switch upstream port for the check and report the selected
    link.
    
    Fixes: 0ab5d711ec74 ("drm/amd: Refactor `amdgpu_aspm` to be evaluated per device")
    Signed-off-by: Yang Wang <[email protected]>
    Reviewed-by: Hawking Zhang <[email protected]>
    Reviewed-by: Kenneth Feng <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 4e0d6f2876e704fff707b18c40dbd383aea4a1c9)
    Cc: [email protected]
    [ Dropped the upstream APU and `amdgpu_device_aspm_support_quirk(adev)` context lines, keeping 6.1's old-signature quirk helper untouched. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ext4: clear error before retrying inode xattr space fallback [+ + +]
Author: Guanghui Yang <[email protected]>
Date:   Wed Jul 8 12:57:19 2026 +0000

    ext4: clear error before retrying inode xattr space fallback
    
    commit 409a7f12a0933ff2c617fa814c76cef0bd1d457a upstream.
    
    When ext4_xattr_make_inode_space() returns -ENOSPC,
    ext4_expand_extra_isize_ea() can retry the expansion with
    s_min_extra_isize.  If that retry succeeds by finding enough ibody free
    space, control jumps directly to the shift label.
    
    The previous -ENOSPC is still stored in error in that path, so the
    function can update i_extra_isize but still return -ENOSPC to the
    caller.  Clear error before retrying so a successful fallback expansion
    returns success.
    
    Reproduced with an ext4 image using 1 KiB blocks, project quota support,
    256-byte inodes, and min_extra_isize/want_extra_isize set to 32.
    FS_IOC_FSSETXATTR failures dropped from 802 to 86 after the fix.
    
    Fixes: 69f3a3039b0d ("ext4: introduce ITAIL helper")
    Cc: [email protected]
    Signed-off-by: Guanghui Yang <[email protected]>
    Reviewed-by: Jan Kara <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Theodore Ts'o <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ext4: stop retrying saturated xattr cache entries [+ + +]
Author: Matthias Goergens <[email protected]>
Date:   Sun Aug 2 14:59:41 2026 +0800

    ext4: stop retrying saturated xattr cache entries
    
    commit 54b6bd40898de7906acb2bccc9a96d1b8e6b4323 upstream.
    
    ext4_xattr_block_set() retries when a cache entry selected for reuse
    has a saturated reference count after taking the buffer lock. The retry
    returns to the mbcache lookup without making that entry ineligible, so
    it can select the same unusable entry indefinitely. A task spinning
    there can hold the parent directory's i_rwsem and leave concurrent
    rmdir callers blocked.
    
    Normally a reusable entry has a reference count below
    EXT4_XATTR_REFCOUNT_MAX because the count and MBE_REUSABLE_B are
    updated under the same buffer lock. A corrupted filesystem can violate
    that invariant. The syzbot reproducer reports allocator and xattr
    corruption before triggering this retry loop.
    
    Check the untrusted on-disk count before incrementing it, avoiding
    overflow, and clear MBE_REUSABLE_B when it is already saturated. The
    next lookup then skips the entry that was just proven unusable. This
    mirrors the normal transition at EXT4_XATTR_REFCOUNT_MAX; the release
    path marks the entry reusable again on the exact 1024-to-1023
    transition.
    
    Using the same QEMU harness and guest parameters, current unpatched
    Linux hung in 6 of 8 420-second trials with the do_rmdir signature;
    representative NMI backtraces caught the owner spinning in
    ext4_xattr_block_set(). The patched kernel completed 28 of 28 trials
    without a hung-task report; the final twelve trials exercised the
    reviewed overflow-safe form of the change. syzbot's patch testing also
    completed without reproducing the hang.
    
    Reported-and-tested-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=e68dbebd9617a9250e8d
    Fixes: 65f8b80053a1 ("ext4: fix race when reusing xattr blocks")
    Cc: [email protected]
    Signed-off-by: Matthias Goergens <[email protected]>
    Reviewed-by: Jan Kara <[email protected]>
    Reported-by: [email protected]
    Tested-by: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Theodore Ts'o <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
gpio: ml-ioh: use raw_spinlock_t for the register lock [+ + +]
Author: Junjie Cao <[email protected]>
Date:   Fri Jul 31 11:27:47 2026 +0800

    gpio: ml-ioh: use raw_spinlock_t for the register lock
    
    commit 600411ea1f2443fdf5b1af9b6480f616d7aff9d0 upstream.
    
    ioh_irq_type() is registered as the irq_chip .irq_set_type callback and
    takes chip->spinlock with spin_lock_irqsave().  This callback is reached
    from __setup_irq() -> __irq_set_trigger() -> chip->irq_set_type() while
    the caller holds desc->lock, a raw_spinlock_t, with hardirqs disabled.
    That context is not sleepable, but on PREEMPT_RT a regular spinlock_t is
    an rtmutex-backed sleeping lock, so acquiring it there is invalid.
    ioh_irq_enable() and ioh_irq_disable() take the same lock from the
    .irq_enable/.irq_disable callbacks, which are likewise invoked with
    desc->lock held.
    
    Convert the register lock to raw_spinlock_t.  The same lock also
    serializes the GPIO direction/value callbacks and the suspend/resume
    register save/restore, and those critical sections only perform short
    sequences of MMIO register accesses (ioread32()/iowrite32()); the
    .irq_set_type callback additionally emits a dev_warn() on an unsupported
    type.  None of these are sleepable operations, so keeping this register
    lock non-sleeping is appropriate for the irqchip callbacks and does not
    change the GPIO-side locking contract.
    
    This is the same fix as commit a02b8950d619 ("gpio: pch: use
    raw_spinlock_t for the register lock"); this driver shares the same
    structure as gpio-pch.
    
    Fixes: 54be566317b6 ("gpio-ml-ioh: Support interrupt function")
    Cc: [email protected]
    Reviewed-by: Linus Walleij <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Junjie Cao <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
HID: core: fix number/pointer type confusion on long items [+ + +]
Author: Jann Horn <[email protected]>
Date:   Fri Jul 3 20:30:02 2026 +0200

    HID: core: fix number/pointer type confusion on long items
    
    commit 28abce951343fcec26e397610868efa4e1395c3f upstream.
    
    When fetch_item() is called by hid_scan_report() on an item with
    HID_ITEM_TAG_LONG, it stores a pointer to the item data in
    item->data.longdata instead of storing a value directly in
    item->data.{u8/u16/u32}.
    
    When item_udata() or item_sdata() encounters such an item, it incorrectly
    assumes that the item is in short format, and therefore returns the lower
    part of a kernel pointer reinterpreted as a number.
    
    When a HID device is connected whose descriptor contains a
    HID_GLOBAL_ITEM_TAG_REPORT_SIZE encoded in long format with size=4, this
    causes the lower half of a kernel pointer to be printed into dmesg as a
    number, like this:
    
        hid (null): invalid report_size 107953555
    
    To fix it, let item_udata() and item_sdata() verify that the item is in
    short format.
    
    Note that this bug only affects hid_scan_report(), while the main parsing
    pass hid_parse_collections() will always bail out when encountering a long
    item.
    
    Sidenote: There are currently no users of data.longdata; maybe we should
    just remove any parsing of long-format descriptors as a follow-up.
    
    Fixes: 3dc8fc083dbf ("HID: Use hid_parser for pre-scanning the report descriptors")
    Cc: [email protected]
    Signed-off-by: Jann Horn <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: core: fix OOB read of field->usage in hid_set_field() [+ + +]
Author: Baul Lee <[email protected]>
Date:   Sun Jul 26 15:50:24 2026 +0900

    HID: core: fix OOB read of field->usage in hid_set_field()
    
    commit a13cdb19fcb223ed41bdab3bab42b98dba87e90b upstream.
    
    hid_set_field() hands field->usage + offset to hid_dump_input() before
    the guard that bounds offset:
    
            hid_dump_input(field->report->device, field->usage + offset, value);
    
            if (offset >= field->report_count) {
                    hid_err(...);
                    return -1;
            }
    
    Under CONFIG_DEBUG_FS hid_dump_input() dereferences that pointer, with
    buf = hid_resolv_usage(usage->hid, NULL).  The usage[] array is
    allocated inline with the hid_field in hid_register_field() and holds
    field->maxusage entries, so an offset past it reads off the end of the
    kvzalloc()ed allocation and into a neighbouring object.  Had the guard
    run first, offset < report_count <= maxusage would already have confined
    the pointer to the array.
    
    A caller supplies such an offset today.  picolcd_fb_send_tile()
    validates only report->maxfield before issuing
    hid_set_field(report->field[0], 11 + i, ...) for i = 0..31, so its
    offsets are fixed at 11..42 and are never checked against the bound
    field.  When the device registers that field with fewer usages, the
    framebuffer deferred-io work drives the read on every tile.  KASAN
    reports a 4-byte slab-out-of-bounds read in hid_dump_input() below
    hid_set_field(), and the same boot logs "offset (1) exceeds
    report_count (1)" from the guard that runs only afterwards.
    
    Move the hid_dump_input() call below the guard.  Because
    field->maxusage >= field->report_count, the guard then establishes that
    field->usage + offset lies inside the array before it is dereferenced,
    for every caller and without changing behaviour on the valid path.
    
    Discovered by XBOW, triaged by Baul Lee <[email protected]>
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Federico Kirschbaum <[email protected]>
    Reported-by: Baul Lee <[email protected]>
    Cc: [email protected]
    Signed-off-by: Baul Lee <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: hyperv: validate initial device info bounds [+ + +]
Author: Michael Bommarito <[email protected]>
Date:   Thu Jul 9 22:28:53 2026 -0400

    HID: hyperv: validate initial device info bounds
    
    commit 934b7778aa7b7c8f6bb073d2a73ba3674885bae0 upstream.
    
    The Hyper-V synthetic HID host supplies SYNTH_HID_INITIAL_DEVICE_INFO
    messages that contain a HID descriptor followed by the report descriptor
    bytes. mousevsc_on_receive_device_info() trusts bLength and
    wDescriptorLength without checking that the received packet contains both
    byte ranges.
    
    A malformed host or backend message can therefore make the guest read
    past the received VMBus packet while copying the report descriptor. Pass
    the received initial-device-info size into the parser and reject
    descriptor lengths that exceed the packet.
    
    Impact: A malicious Hyper-V host or backend can crash a guest by sending
    a short initial device-info message with an oversized HID report
    descriptor length.
    
    Fixes: b95f5bcb811e ("HID: Move the hid-hyperv driver out of staging")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5-5-xhigh
    Signed-off-by: Michael Bommarito <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: magicmouse: do not keep a stale msc->input if no input is claimed [+ + +]
Author: Jose Villaseñor Montfort <[email protected]>
Date:   Tue Jul 28 22:15:57 2026 -0600

    HID: magicmouse: do not keep a stale msc->input if no input is claimed
    
    commit 0af3b89705688af01aa06025b84fa7a1e06ba6cc upstream.
    
    magicmouse_input_mapping() caches the first hid_input's input_dev in
    msc->input while the report descriptor is parsed, and the rest of the
    driver treats a non-NULL msc->input as proof that an input device was
    registered.
    
    That does not hold on the hid-input error path. If hidinput_connect()
    fails -- for instance because input_register_device() returns an error --
    it unwinds through hidinput_disconnect(), which frees every input_dev it
    created, including the one cached in msc->input.
    
    The failure does not abort the probe. hid_connect() only skips the claim:
    
            if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
                                    connect_mask & HID_CONNECT_HIDINPUT_FORCE))
                    hdev->claimed |= HID_CLAIMED_INPUT;
    
    and the "device has no listeners" bailout below it does not fire for this
    driver, which sets ->raw_event; on the USB Magic Mouse 2 / Magic Trackpad
    2 paths hidraw and hiddev are claimed as well. hid_hw_start() therefore
    returns 0 and magicmouse_probe() continues with msc->input pointing at
    freed memory. Being non-NULL, it passes the "input not registered" check
    in probe and the NULL checks in ->raw_event and ->event, so the next
    input report dereferences freed memory.
    
    Clear msc->input when the HID core did not claim an input device, so the
    existing NULL checks cover this case as well.
    
    Fixes: f1a9a149abc8 ("HID: magicmouse: fix race between input_register() and probe()")
    Link: https://lore.kernel.org/linux-input/[email protected]/
    Cc: [email protected]
    Signed-off-by: Jose Villaseñor Montfort <[email protected]>
    Reviewed-by: Alec Hall <[email protected]>
    Tested-by: Alec Hall <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: magicmouse: Prevent out-of-bounds (OOB) read during DOUBLE_REPORT_ID [+ + +]
Author: Lee Jones <[email protected]>
Date:   Thu Apr 16 14:16:54 2026 +0100

    HID: magicmouse: Prevent out-of-bounds (OOB) read during DOUBLE_REPORT_ID
    
    commit d93ba918a185aca2594da63e92fdc5495b559c0f upstream.
    
    It is currently possible for a malicious or misconfigured USB device to
    cause an out-of-bounds (OOB) read when submitting reports using
    DOUBLE_REPORT_ID by specifying a large report length and providing a
    smaller one.
    
    Let's prevent that by comparing the specified report length with the
    actual size of the data read in from userspace.  If the actual data
    length ends up being smaller than specified, we'll politely warn the
    user and prevent any further processing.
    
    Signed-off-by: Lee Jones <[email protected]>
    Reviewed-by: Günther Noack <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: sensor: custom: Fix use-after-free in enable_sensor [+ + +]
Author: Haoxiang Li <[email protected]>
Date:   Tue Jul 7 15:15:44 2026 +0800

    HID: sensor: custom: Fix use-after-free in enable_sensor
    
    commit ad8fb82b04422f49530d2aa2753cc81d1c60102c upstream.
    
    enable_sensor_store() can call set_power_report_state(), which
    dereferences sensor_inst->power_state and sensor_inst->report_state.
    These pointers refer to entries in sensor_inst->fields.
    
    Create the field attributes before exposing the enable_sensor sysfs
    attribute, so enable_sensor cannot be accessed before the state it
    depends on has been initialized.
    
    On remove, delete enable_sensor before freeing the field attributes,
    so a concurrent sysfs write cannot dereference freed memory through
    power_state or report_state.
    
    Reported-by: Sashiko AI Review <[email protected]>
    Link: https://sashiko.dev/#/patchset/[email protected]?part=1
    Fixes: 4a7de0519df5 ("HID: sensor: Custom and Generic sensor support")
    Cc: [email protected]
    Signed-off-by: Haoxiang Li <[email protected]>
    Acked-by: Srinivas Pandruvada <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
inet: frags: publish queues before arming timer [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Fri Aug 21 23:50:21 2026 -0400

    inet: frags: publish queues before arming timer
    
    [ Upstream commit 653d7ddf6cba867777a3d14c4f83ace008c5ad13 ]
    
    inet_frag_create() arms the fragment queue timer before inserting the
    queue into the fqdir rhashtable. If the namespace fragment timeout is
    zero or negative, the timer can run before the queue is published.
    
    The timer callback then marks the queue complete, tries to remove a node
    that is not in the hash table yet, and drops the anticipated hash
    reference. Creation can subsequently publish the completed queue without
    restoring that reference, leaving a stale hash node after the caller drops
    the remaining reference.
    
    Publish the queue first and arm the timer while holding the queue lock.
    This makes timer expiry wait until the queue is visible in the hash table,
    so inet_frag_kill() can remove the node and balance the hash reference.
    
    Fixes: 648700f76b03 ("inet: frags: use rhashtables for reassembly units")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Signed-off-by: Ren Wei <[email protected]>
    Link: https://patch.msgid.link/bf66785e7c0c139d7a1900e2f01faeeab344b960.1784948849.git.zhilinz@nebusec.ai
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Input: atkbd - skip deactivate for HONOR FMB-P's internal keyboard [+ + +]
Author: Cryolitia PukNgae <[email protected]>
Date:   Mon Aug 24 11:53:19 2026 -0400

    Input: atkbd - skip deactivate for HONOR FMB-P's internal keyboard
    
    [ Upstream commit 2aaf33c6e1e82561d7dce2345298a985a2483266 ]
    
    After commit 9cf6e24c9fbf17e52de9fff07f12be7565ea6d61 ("Input: atkbd -
    do not skip atkbd_deactivate() when skipping ATKBD_CMD_GETID"), HONOR
    FMB-P, aka HONOR MagicBook Pro 14 2025's internal keyboard stops
    working. Adding the atkbd_deactivate_fixup quirk fixes it.
    
    DMI: HONOR FMB-P/FMB-P-PCB, BIOS 1.13 05/08/2025
    
    Fixes: 9cf6e24c9fbf17e52de9fff07f12be7565ea6d61 ("Input: atkbd - do not skip atkbd_deactivate() when skipping ATKBD_CMD_GETID")
    Reported-by: Mikura Kyouka <[email protected]>
    Reported-by: foad.elkhattabi <[email protected]>
    Signed-off-by: Cryolitia PukNgae <[email protected]>
    Reviewed-by: Hans de Goede <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Stable-dep-of: 410c44b10967 ("Input: atkbd - skip deactivate for HONOR ZQC-P")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: atkbd - skip deactivate for HONOR ZQC-P [+ + +]
Author: Donglin Lyu <[email protected]>
Date:   Mon Aug 24 11:53:20 2026 -0400

    Input: atkbd - skip deactivate for HONOR ZQC-P
    
    [ Upstream commit 410c44b1096789d0c40fbee706520e981dba7bc1 ]
    
    The internal keyboard on the HONOR ZQC-P (HONOR MagicBook Pro 14 2026)
    does not work after boot.
    
    Using the kernel command line 'i8042.dumbkbd=1' makes the keyboard
    functional, but the CapsLock LED does not work. Adding the
    'atkbd_deactivate_fixup' quirk fixes the keyboard and CapsLock LED
    natively without requiring boot parameters.
    
    DMI: HONOR ZQC-P/ZQC-P-PCB, BIOS 1.09 03/19/2026
    
    Fixes: 9cf6e24c9fbf ("Input: atkbd - do not skip atkbd_deactivate() when skipping ATKBD_CMD_GETID")
    Signed-off-by: Donglin Lyu <[email protected]>
    Tested-by: Ruslan Shevchenko <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    [dtor: keep all HONOR entries together]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
iomap: adjust read range correctly for non-block-aligned positions [+ + +]
Author: Joanne Koong <[email protected]>
Date:   Thu Aug 20 19:03:07 2026 +0200

    iomap: adjust read range correctly for non-block-aligned positions
    
    [ Upstream commit 7aa6bc3e8766990824f66ca76c19596ce10daf3e ]
    
    iomap_adjust_read_range() assumes that the position and length passed in
    are block-aligned. This is not always the case however, as shown in the
    syzbot generated case for erofs. This causes too many bytes to be
    skipped for uptodate blocks, which results in returning the incorrect
    position and length to read in. If all the blocks are uptodate, this
    underflows length and returns a position beyond the folio.
    
    Fix the calculation to also take into account the block offset when
    calculating how many bytes can be skipped for uptodate blocks.
    
    Signed-off-by: Joanne Koong <[email protected]>
    Tested-by: [email protected]
    Reviewed-by: Brian Foster <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Christian Brauner <[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]>

 
ipv4: reject undersized MTUs in ip_do_fragment() [+ + +]
Author: Yong Wang <[email protected]>
Date:   Fri Aug 14 01:35:26 2026 +0800

    ipv4: reject undersized MTUs in ip_do_fragment()
    
    commit c0726f0caf8c6b3208552949e17d23634a2f3129 upstream.
    
    ip_do_fragment() subtracts the IPv4 header length from the effective
    MTU and passes the resulting payload MTU to ip_frag_next().
    
    If the effective MTU is smaller than hlen + 8, ip_frag_next() rounds
    the fragment payload length down to zero. The fragmentation state then
    never makes forward progress: state->left, state->ptr and state->offset
    stay unchanged while ip_do_fragment() keeps allocating and transmitting
    header-only fragments until the softlockup detector fires.
    
    This is reproducible with a route installed using "mtu lock 20", but it
    is also reproducible without route MTU lock, for example by forwarding a
    packet to a device whose MTU is 20.
    
    Fix it in ip_do_fragment() by rejecting mtu < hlen + 8 with -EMSGSIZE,
    matching the existing IPv6 fragmentation check.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Yong Wang <[email protected]>
    Signed-off-by: Ren Wei <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/8809ef6314b98913681b0b370a05a85c2b6cd579.1786599079.git.edragain@163.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ipv6: fix use-after-free in ip6_finish_output2() [+ + +]
Author: Luxiao Xu <[email protected]>
Date:   Wed Aug 12 20:54:38 2026 +0800

    ipv6: fix use-after-free in ip6_finish_output2()
    
    commit d0d48d999b0eee6bb176ef4e39d9be868fa80f7e upstream.
    
    ip6_finish_output2() caches a pointer to the IPv6 destination
    address (daddr) before invoking lwtunnel_xmit().  The LWT-BPF
    transmit path or other encapsulation operations within
    lwtunnel_xmit() can reallocate the skb head, freeing the memory
    that daddr points to.  When lwtunnel_xmit() returns
    LWTUNNEL_XMIT_CONTINUE, the function continues to use the stale
    daddr pointer to compute the nexthop and to look up or create the
    neighbour entry.  This results in a use-after-free read, which can
    leak sensitive kernel data, pollute the neighbour table with
    arbitrary values, misdirect traffic, or crash the system.
    
    Fix this by re-fetching the IPv6 header and the destination
    address pointer after lwtunnel_xmit() returns
    LWTUNNEL_XMIT_CONTINUE, ensuring that the subsequent nexthop
    computation and neighbour lookup operate on valid memory.
    
    Fixes: e415ed3a4b8b ("ipv6: use skb_expand_head in ip6_finish_output2")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Luxiao Xu <[email protected]>
    Signed-off-by: Ren Wei <[email protected]>
    Reviewed-by: Vadim Fedorenko <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/4aa3f53bc44e79572c6dd2340ec7b68ef1a3d87d.1786516730.git.rakukuip@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
KVM: Rename mmu_notifier_* to mmu_invalidate_* [+ + +]
Author: Chao Peng <[email protected]>
Date:   Sun Aug 23 22:07:48 2026 +0900

    KVM: Rename mmu_notifier_* to mmu_invalidate_*
    
    [ Upstream commit 20ec3ebd707c77fb9b11b37193449193d4649f33 ]
    
    The motivation of this renaming is to make these variables and related
    helper functions less mmu_notifier bound and can also be used for non
    mmu_notifier based page invalidation. mmu_invalidate_* was chosen to
    better describe the purpose of 'invalidating' a page that those
    variables are used for.
    
      - mmu_notifier_seq/range_start/range_end are renamed to
        mmu_invalidate_seq/range_start/range_end.
    
      - mmu_notifier_retry{_hva} helper functions are renamed to
        mmu_invalidate_retry{_hva}.
    
      - mmu_notifier_count is renamed to mmu_invalidate_in_progress to
        avoid confusion with mn_active_invalidate_count.
    
      - While here, also update kvm_inc/dec_notifier_count() to
        kvm_mmu_invalidate_begin/end() to match the change for
        mmu_notifier_count.
    
    No functional change intended.
    
    Signed-off-by: Chao Peng <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Stable-dep-of: 2abd5287f083 ("KVM: x86: Check for invalid/obsolete root *after* making MMU pages available")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86/mmu: Directly "destroy" PTE list when recycling rmaps [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Sun Aug 23 22:07:45 2026 +0900

    KVM: x86/mmu: Directly "destroy" PTE list when recycling rmaps
    
    [ Upstream commit a42989e7fbb0186d9fee05b29e0ea9cb639d0bd3 ]
    
    Use pte_list_destroy() directly when recycling rmaps instead of bouncing
    through kvm_unmap_rmapp() and kvm_zap_rmapp().  Calling kvm_unmap_rmapp()
    is unnecessary and odd as it requires passing dummy parameters; passing
    NULL for @slot when __rmap_add() already has a valid slot is especially
    weird and confusing.
    
    No functional change intended.
    
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Stable-dep-of: 2abd5287f083 ("KVM: x86: Check for invalid/obsolete root *after* making MMU pages available")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86/mmu: Document the "rules" for using host_pfn_mapping_level() [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Sun Aug 23 22:07:47 2026 +0900

    KVM: x86/mmu: Document the "rules" for using host_pfn_mapping_level()
    
    [ Upstream commit 65e3b446bcceaac7448cb25a2a5bf4adbcf25fe6 ]
    
    Add a comment to document how host_pfn_mapping_level() can be used safely,
    as the line between safe and dangerous is quite thin.  E.g. if KVM were
    to ever support in-place promotion to create huge pages, consuming the
    level is safe if the caller holds mmu_lock and checks that there's an
    existing _leaf_ SPTE, but unsafe if the caller only checks that there's a
    non-leaf SPTE.
    
    Opportunistically tweak the existing comments to explicitly document why
    KVM needs to use READ_ONCE().
    
    No functional change intended.
    
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Stable-dep-of: 2abd5287f083 ("KVM: x86: Check for invalid/obsolete root *after* making MMU pages available")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86/mmu: Rename __direct_map() to direct_map() [+ + +]
Author: David Matlack <[email protected]>
Date:   Sun Aug 23 22:07:50 2026 +0900

    KVM: x86/mmu: Rename __direct_map() to direct_map()
    
    [ Upstream commit 6c882ef4fc7bd99b67ad152e75428b669281c521 ]
    
    Rename __direct_map() to direct_map() since the leading underscores are
    unnecessary. This also makes the page fault handler names more
    consistent: kvm_tdp_mmu_page_fault() calls kvm_tdp_mmu_map() and
    direct_page_fault() calls direct_map().
    
    Opportunistically make some trivial cleanups to comments that had to be
    modified anyway since they mentioned __direct_map(). Specifically, use
    "()" when referring to functions, and include kvm_tdp_mmu_map() among
    the various callers of disallowed_hugepage_adjust().
    
    No functional change intended.
    
    Signed-off-by: David Matlack <[email protected]>
    Reviewed-by: Isaku Yamahata <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Stable-dep-of: 2abd5287f083 ("KVM: x86: Check for invalid/obsolete root *after* making MMU pages available")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86/mmu: Rename pte_list_{destroy,remove}() to show they zap SPTEs [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Sun Aug 23 22:07:46 2026 +0900

    KVM: x86/mmu: Rename pte_list_{destroy,remove}() to show they zap SPTEs
    
    [ Upstream commit 9202aee816c84d69179f94193c5dd321bb0e8530 ]
    
    Rename pte_list_remove() and pte_list_destroy() to kvm_zap_one_rmap_spte()
    and kvm_zap_all_rmap_sptes() respectively to document that (a) they zap
    SPTEs and (b) to better document how they differ (remove vs. destroy does
    not exactly scream "one vs. all").
    
    No functional change intended.
    
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Stable-dep-of: 2abd5287f083 ("KVM: x86: Check for invalid/obsolete root *after* making MMU pages available")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86/mmu: Retry page fault if root is invalidated by memslot update [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Sun Aug 23 22:07:44 2026 +0900

    KVM: x86/mmu: Retry page fault if root is invalidated by memslot update
    
    [ Upstream commit a955cad84cdaffa282b3cf8f5ce69e9e5655e585 ]
    
    Bail from the page fault handler if the root shadow page was obsoleted by
    a memslot update.  Do the check _after_ acuiring mmu_lock, as the TDP MMU
    doesn't rely on the memslot/MMU generation, and instead relies on the
    root being explicit marked invalid by kvm_mmu_zap_all_fast(), which takes
    mmu_lock for write.
    
    For the TDP MMU, inserting a SPTE into an obsolete root can leak a SP if
    kvm_tdp_mmu_zap_invalidated_roots() has already zapped the SP, i.e. has
    moved past the gfn associated with the SP.
    
    For other MMUs, the resulting behavior is far more convoluted, though
    unlikely to be truly problematic.  Installing SPs/SPTEs into the obsolete
    root isn't directly problematic, as the obsolete root will be unloaded
    and dropped before the vCPU re-enters the guest.  But because the legacy
    MMU tracks shadow pages by their role, any SP created by the fault can
    can be reused in the new post-reload root.  Again, that _shouldn't_ be
    problematic as any leaf child SPTEs will be created for the current/valid
    memslot generation, and kvm_mmu_get_page() will not reuse child SPs from
    the old generation as they will be flagged as obsolete.  But, given that
    continuing with the fault is pointess (the root will be unloaded), apply
    the check to all MMUs.
    
    Fixes: b7cccd397f31 ("KVM: x86/mmu: Fast invalidation for TDP MMU")
    Cc: [email protected]
    Cc: Ben Gardon <[email protected]>
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    [backport note: is_page_fault_stale() adapted to take individual parameters
     instead of struct kvm_page_fault, since 4326e57ef40a ("KVM: MMU: change
     direct_page_fault() arguments to kvm_page_fault") is not in 5.15.y;
     required by the following backport of 2abd5287f083 and by 0cb2af2ea66a
     to be backported separately]
    Assisted-by: Claude:claude-sonnet-4.6
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86/mmu: Split out TDP MMU page fault handling [+ + +]
Author: David Matlack <[email protected]>
Date:   Sun Aug 23 22:07:49 2026 +0900

    KVM: x86/mmu: Split out TDP MMU page fault handling
    
    [ Upstream commit 9aa8ab43b38146029de807a8ff2696f51e15b226 ]
    
    Split out the page fault handling for the TDP MMU to a separate
    function.  This creates some duplicate code, but makes the TDP MMU fault
    handler simpler to read by eliminating branches and will enable future
    cleanups by allowing the TDP MMU and non-TDP MMU fault paths to diverge.
    
    Only compile in the TDP MMU fault handler for 64-bit builds since
    kvm_tdp_mmu_map() does not exist in 32-bit builds.
    
    No functional change intended.
    
    Signed-off-by: David Matlack <[email protected]>
    Reviewed-by: Isaku Yamahata <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Stable-dep-of: 2abd5287f083 ("KVM: x86: Check for invalid/obsolete root *after* making MMU pages available")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86: Check for invalid/obsolete root *after* making MMU pages available [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Sun Aug 23 22:07:51 2026 +0900

    KVM: x86: Check for invalid/obsolete root *after* making MMU pages available
    
    [ Upstream commit 2abd5287f08319fa35764566b15c6e22cb1068db ]
    
    Check for a "stale" page fault, i.e. for an invalid and/or obsolete root,
    after making MMU pages available for the shadow MMU.  If reclaiming shadow
    pages zaps an in-use root, i.e. marks it invalid, then KVM will attempt to
    map memory into an invalid root.  On its own, populating an invalid root is
    "fine", but because child shadow pages inherit their parent's role, any
    children created during the map/fetch will be created as invalid pages,
    thus violating KVM's invariant that invalid pages are never on the list of
    active MMU pages.
    
    Note, the underlying flaw has existed since KVM first started tracking
    invalid roots in 2008 (commit 2e53d63acba7, "KVM: MMU: ignore zapped root
    pagetables"), but the true badness only came along in 2020 (Linux 5.9)
    with the invariant that invalid shadow pages can't be on the list of
    active pages.
    
    Note #2, inheriting role.invalid when creating child shadow pages is also
    far from ideal; that flaw will be addressed separately.
    
    Reported-by: Hyunwoo Kim <[email protected]>
    Fixes: f95eec9bed76 ("KVM: x86/mmu: Don't put invalid SPs back on the list of active pages")
    Cc: [email protected]
    Signed-off-by: Sean Christopherson <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    [backport note: upstream passes struct kvm_page_fault to is_page_fault_stale();
     here individual parameters are used, as is_page_fault_stale() was
     backported with that interface in the preceding commit]
    Signed-off-by: Kenta Akagi <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: x86: Retry page fault if MMU reload is pending and root has no sp [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Thu Dec 9 06:05:46 2021 +0000

    KVM: x86: Retry page fault if MMU reload is pending and root has no sp
    
    [ Upstream commit 18c841e1f4112d3fb742aca3429e84117fcb1e1c ]
    
    Play nice with a NULL shadow page when checking for an obsolete root in
    the page fault handler by flagging the page fault as stale if there's no
    shadow page associated with the root and KVM_REQ_MMU_RELOAD is pending.
    Invalidating memslots, which is the only case where _all_ roots need to
    be reloaded, requests all vCPUs to reload their MMUs while holding
    mmu_lock for lock.
    
    The "special" roots, e.g. pae_root when KVM uses PAE paging, are not
    backed by a shadow page.  Running with TDP disabled or with nested NPT
    explodes spectaculary due to dereferencing a NULL shadow page pointer.
    
    Skip the KVM_REQ_MMU_RELOAD check if there is a valid shadow page for the
    root.  Zapping shadow pages in response to guest activity, e.g. when the
    guest frees a PGD, can trigger KVM_REQ_MMU_RELOAD even if the current
    vCPU isn't using the affected root.  I.e. KVM_REQ_MMU_RELOAD can be seen
    with a completely valid root shadow page.  This is a bit of a moot point
    as KVM currently unloads all roots on KVM_REQ_MMU_RELOAD, but that will
    be cleaned up in the future.
    
    Fixes: a955cad84cda ("KVM: x86/mmu: Retry page fault if root is invalidated by memslot update")
    Cc: [email protected]
    Cc: Maxim Levitsky <[email protected]>
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-Id: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
libceph: fix OOB read in decode_watchers() via missing bounds check [+ + +]
Author: Pavitra Jha <[email protected]>
Date:   Wed Jul 8 01:39:41 2026 -0400

    libceph: fix OOB read in decode_watchers() via missing bounds check
    
    commit 00ead17c7de137a692edee59f2772e6af687e8eb upstream.
    
    ceph_start_decoding() validates that struct_len bytes remain in the
    buffer after the encoding header, but accepts struct_len=0 as valid:
    ceph_decode_need(p, end, 0, bad) always passes. When a malicious or
    compromised OSD sends an obj_list_watch_response_t reply with
    struct_len=0, ceph_start_decoding() returns success with p == end,
    leaving zero bytes guaranteed for subsequent reads.
    
    The immediately following ceph_decode_32(p) in decode_watchers() has
    no preceding bounds check. With p == end this is a 4-byte read past
    the validated buffer boundary. The garbage value is then passed
    directly to kzalloc_objs() as the watcher count.
    
    The sibling function decode_watcher() already uses the safe variants
    (ceph_decode_copy_safe, ceph_decode_64_safe, ceph_decode_skip_32)
    after its own ceph_start_decoding() call. decode_watchers() is the
    only site that uses the bare variant, confirming an oversight.
    
    Fix by replacing ceph_decode_32(p) with ceph_decode_32_safe(p, end,
    *num_watchers, bad), consistent with the established pattern.
    
    Attacker model: a malicious or compromised OSD in a multi-tenant Ceph
    deployment (e.g. cloud) can trigger this against any kernel client
    that calls CEPH_OSD_OP_LIST_WATCHERS, without any further privileges
    beyond OSD session establishment.
    
    [ idryomov: trim changelog ]
    
    Cc: [email protected]
    Fixes: a4ed38d7a180 ("libceph: support for CEPH_OSD_OP_LIST_WATCHERS")
    Signed-off-by: Pavitra Jha <[email protected]>
    Reviewed-by: Viacheslav Dubeyko <[email protected]>
    Signed-off-by: Ilya Dryomov <[email protected]>
    [ kept the tree's `kcalloc()` context line instead of upstream's `kzalloc_objs()` ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Linux: Linux 5.15.218 [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Thu Aug 27 14:28:23 2026 +0200

    Linux 5.15.218
    
    Link: https://lore.kernel.org/r/[email protected]
    Tested-by: Florian Fainelli <[email protected]>
    Tested-by: Shuah Khan <[email protected]>
    Tested-by: Ron Economos <[email protected]>
    Tested-by: Barry K. Nathan <[email protected]>
    Tested-by: Brett A C Sheffield <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
misc: fastrpc: Remove buffer from list prior to unmap operation [+ + +]
Author: Ekansh Gupta <[email protected]>
Date:   Thu Aug 20 15:36:26 2026 -0400

    misc: fastrpc: Remove buffer from list prior to unmap operation
    
    [ Upstream commit 6102ceb4eab845743ee57acd3863fbd06e93c927 ]
    
    fastrpc_req_munmap_impl() is called to unmap any buffer. The buffer is
    getting removed from the list after it is unmapped from DSP. This can
    create potential race conditions if multiple threads invoke unmap
    concurrently, where one thread may remove the entry from the list while
    another thread's unmap operation is still ongoing.
    
    Fix this by removing the buffer entry from the list before calling the
    unmap operation. If the unmap fails, the entry is re-added to the list
    so that userspace can retry the unmap, or alternatively, the buffer
    will be cleaned up during device release when the DSP process is torn
    down and all DSP-side mappings are freed along with remaining buffers
    in the list.
    
    Fixes: 2419e55e532de ("misc: fastrpc: add mmap/unmap support")
    Cc: [email protected]
    Reviewed-by: Dmitry Baryshkov <[email protected]>
    Signed-off-by: Ekansh Gupta <[email protected]>
    Signed-off-by: Jianping Li <[email protected]>
    Signed-off-by: Srinivas Kandagatla <[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]>

misc: fastrpc: Rework fastrpc_req_munmap [+ + +]
Author: Abel Vesa <[email protected]>
Date:   Thu Aug 20 15:36:25 2026 -0400

    misc: fastrpc: Rework fastrpc_req_munmap
    
    [ Upstream commit 72fa6f7820c4cf96c5f7aabc4e54bdf52d1e2ac2 ]
    
    Move the lookup of the munmap request to the fastrpc_req_munmap and pass
    on only the buf to the lower level fastrpc_req_munmap_impl. That way
    we can use the lower level fastrpc_req_munmap_impl on error path in
    fastrpc_req_mmap to free the buf without searching for the munmap
    request it belongs to.
    
    Co-developed-by: Srinivas Kandagatla <[email protected]>
    Signed-off-by: Abel Vesa <[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: 6102ceb4eab8 ("misc: fastrpc: Remove buffer from list prior to unmap operation")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

misc: fastrpc: separate fastrpc device from channel context [+ + +]
Author: Srinivas Kandagatla <[email protected]>
Date:   Thu Aug 20 15:36:24 2026 -0400

    misc: fastrpc: separate fastrpc device from channel context
    
    [ Upstream commit 965602eabb57d086466ad749e81941e3dd66b595 ]
    
    Currently fastrpc misc device instance is within channel context struct
    with a kref. So we have 2 structs with refcount, both of them managing the
    same channel context structure.
    
    Separate fastrpc device from channel context and by adding a dedicated
    fastrpc_device structure, this should clean the structures a bit and also help
    when adding secure device node support.
    
    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: 6102ceb4eab8 ("misc: fastrpc: Remove buffer from list prior to unmap operation")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
mm/huge_memory: fix huge_zero_pfn race [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Thu Aug 20 10:55:12 2026 -0400

    mm/huge_memory: fix huge_zero_pfn race
    
    [ Upstream commit 33192a26cddea7a7e4ca66e5c3eebd36fa8be2bb ]
    
    Patch series "mm/huge_memory: fix huge_zero_pfn race", v2.
    
    There is a subtle race in the reference-counted huge_zero_folio
    implementation.
    
    The fast path atomic logic fails to account for the fact that the shrinker
    (which drops the final huge_zero_refcount pin) can overwrite huge_zero_pfn
    with the ~0UL sentinel value in shrink_huge_zero_folio_scan() after a
    racing get_huge_zero_folio() installed a valid value there.
    
    This results in huge_zero_folio being correctly set but huge_zero_pfn
    being set incorrectly and thus is_huge_zero_pfn() and consequently
    is_huge_zero_pmd() will misidentify the huge zero folio as being an
    ordinary THP folio.
    
    This can result in the huge zero folio being split and otherwise treated
    incorrectly.
    
    The solution to this is very subtle as there is an atomic fast path, and
    thus ordering in weakly ordered architectures has to be treated very
    carefully.
    
    The first commit fixes the issue by introducing a spinlock around
    huge_zero_[pfn, folio, refcount] write, with careful consideration paid to
    load/store ordering in the fast path.  It is placed first and kept as
    small as possible so that it can be backported on its own.
    
    The second commit is a pure cleanup which reworks the
    CONFIG_PERSISTENT_HUGE_ZERO_FOLIO logic to better separate the persistent
    logic from the dynamically allocated one.
    
    This patch (of 2):
    
    If !CONFIG_PERSISTENT_HUGE_ZERO_FOLIO, the huge_zero_folio is refcounted
    by huge_zero_refcount and returned by mm_get_huge_zero_folio().
    
    When the caller is done with the huge zero page, its reference count is
    decremented.  Only a shrinker can set the reference count to zero.
    
    A race can unfortunately occur between a shrinker decrementing the
    reference count to zero and a concurrent page fault.
    
    This is because shrink_huge_zero_folio_scan() might, if very unlucky, be
    preempted between setting huge_zero_refcount to zero and writing an
    invalid value.
    
    During this time get_huge_zero_folio() could write to huge_zero_pfn before
    shrink_huge_zero_folio_scan() resumes.
    
    In this event the huge zero folio will be persistently misidentified
    causing the THP code path to be entered inappropriately for the huge zero
    folio:
    
                    CPU 0                                   CPU 1
    =======================================|=================================
    shrink_huge_zero_folio_scan()          |
       atomic_cmpxchg() sets refcount to 0 |
       xchg() sets huge_zero_folio to NULL | get_huge_zero_folio()
                     |                     |    atomic_inc_not_zero() -> zero
          preempted for a long time        |    Allocate new huge zero folio
                     |                     |    Write valid huge_zero_folio
                     v                     |    Write valid huge_zero_pfn
      Overwrite huge_zero_pfn with ~0UL   <--- Invalid overwrite!
    
    This results in is_huge_zero_pfn() and is_huge_zero_pmd() incorrectly
    returning false for a huge zero page which could result in issues like the
    huge zero folio being incorrectly split.
    
    Note that the issue is with huge_zero_pfn not huge_zero_folio, as
    get_huge_zero_folio() uses cmpxchg() gated on huge_zero_folio being NULL
    with a retry loop and shrink_huge_zero_folio_scan() uses xchg() to set
    huge_zero_folio.
    
    Fix the issue by introducing a spinlock, huge_zero_lock, to prevent
    concurrent write of huge_zero_folio, huge_zero_pfn and huge_zero_refcount.
    
    There needs to be significant care taken here to ensure correctness:
    
    The fast path in get_huge_zero_folio() uses atomic_inc_not_zero(), which
    is outside of the critical section, and means huge zero allocation is
    gated on zero huge_zero_refcount.
    
    The fast path doesn't use huge_zero_lock, so the critical section is
    irrelevant to it.
    
    So invariants are required - huge_zero_refcount MUST:
    
    * Only be set in the huge_zero_lock critical section to ensure
      serialisation of huge_zero_pfn, huge_zero_folio and huge_zero_refcount
      writes.
    
    * Be set non-zero only AFTER huge_zero_[pfn, folio] are set to valid values
      so installation of the huge zero folio on read page fault ensures
      concurrent is_huge_zero_*() calls correctly identify the huge zero folio.
    
    * Be set zero only BEFORE huge_zero_[pfn, folio] are set to NULL and ~0UL
      respectively, and atomically.
    
    Establish these by:
    
    * Only setting huge_zero_refcount to zero or an absolute value in the
      huge_zero_lock critical section in get_huge_zero_folio() and
      shrink_huge_zero_folio_scan(), and always updating atomically there
      and elsewhere.
    
    * Using atomic_set_release(&huge_zero_refcount) in get_huge_zero_folio()
      after huge_zero_[pfn, folio] are set. This is paired with
      atomic_inc_not_zero() to ensure atomic_inc_not_zero() only observes a
      non-zero value if huge_zero_[pfn, folio] are set.
    
    * Using atomic_cmpxchg() in shrink_huge_zero_folio_scan() (as before) to
      ensure that it is set zero only when equal to 1 and set atomically.
    
    * atomic_cmpxchg() being fully ordered ensures this is done prior to
      huge_zero_[folio, pfn] being set to NULL and ~0UL respectively.
    
    Eliminate the retry loop in get_huge_zero_folio() as the atomic_cmpxchg()
    in shrink_huge_zero_folio_scan() is now performed under the lock, and
    replace with an equally locked atomic_inc() to set the reference count
    should the caller be raced on huge zero folio installation.
    
    folio_put() naturally implies a full memory barrier so its ordering is
    maintained correctly.
    
    The huge zero folio also cannot be released except when the shrinker does
    so as it is non-LRU and non-rmappable.
    
    Note that only the huge zero shrinker (via shrink_huge_zero_folio_scan())
    can actually set huge_zero_refcount to zero, which is the count of mm's
    which have at least one huge zero folio installed plus one shrinker pin.
    
    Additionally convert a BUG_ON() to a VM_WARN_ON_ONCE().
    
    Link: https://lore.kernel.org/[email protected]
    Link: https://lore.kernel.org/[email protected]
    Fixes: 3b77e8c8cde5 ("mm/thp: make is_huge_zero_pmd() safe and quicker")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Reported-by: Hengbin Zhang <[email protected]>
    Closes: https://lore.kernel.org/linux-mm/[email protected]/
    Suggested-by: David Hildenbrand (Arm) <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Cc: Baolin Wang <[email protected]>
    Cc: Barry Song <[email protected]>
    Cc: Dev Jain <[email protected]>
    Cc: Hannes Reinecke <[email protected]>
    Cc: Hugh Dickins <[email protected]>
    Cc: Kiryl Shutsemau <[email protected]>
    Cc: Lance Yang <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Nico Pache <[email protected]>
    Cc: Pankaj Raghav <[email protected]>
    Cc: Ryan Roberts <[email protected]>
    Cc: Yang Shi <[email protected]>
    Cc: Zi Yan <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ Expanded `scoped_guard(spinlock, &huge_zero_lock)` into explicit `spin_lock()`/`spin_unlock()` pairs and converted folio APIs to page APIs. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
mptcp: avoid combining some incoming suboptions [+ + +]
Author: Matthieu Baerts (NGI0) <[email protected]>
Date:   Mon Aug 24 14:10:05 2026 -0400

    mptcp: avoid combining some incoming suboptions
    
    [ Upstream commit b6ee361524641f57b2e2363f7737f20e17f67827 ]
    
    Some MPTCP suboptions are mutually exclusive according to the RFC8684,
    but also because in different places, the code doesn't expect some
    combinations to be present. That's specially true for suboptions that
    would be present twice, but with different attributes.
    
    The new restrictions are the same as the ones applied on the output
    side, with mptcp_write_options. The same rules can be reused with a
    small fix: an MP_FASTCLOSE can be used with a DSS when the sender picks
    this option [1], which is not the case on Linux. Here are the rules:
    
      Which options can be used together?
    
      X: mutually exclusive
      O: often used together
      C: can be used together in some cases
      P: could be used together but we prefer not to (optimisations)
    
      | Opt: | MPC  | MPJ  | DSS  | ADD  |  RM  | PRIO | FAIL |  FC  |
      |------|------|------|------|------|------|------|------|------|
      | MPC  |------|------|------|------|------|------|------|------|
      | MPJ  |  X   |------|------|------|------|------|------|------|
      | DSS  |  X   |  X   |------|------|------|------|------|------|
      | ADD  |  X   |  X   |  P   |------|------|------|------|------|
      | RM   |  C   |  C   |  C   |  P   |------|------|------|------|
      | PRIO |  X   |  C   |  C   |  C   |  C   |------|------|------|
      | FAIL |  X   |  X   |  C   |  X   |  X   |  X   |------|------|
      | FC   |  X   |  X   |  P   |  X   |  X   |  X   |  X   |------|
      | RST  |  X   |  X   |  X   |  X   |  X   |  X   |  O   |  O   |
      |------|------|------|------|------|------|------|------|------|
    
    The only difference is with the 'P': another stack could send and
    ADD_ADDR with other suboptions (DSS, RM_ADDR), and this should be
    allowed.
    
    A few points of attention:
    
     - In theory, an MP_CAPABLE could be used with a RM_ADDR, but there is
       no reason to add it with a SYN. Note that even with a 4th ACK, it
       doesn't seem to be useful, except when IDs are known in advance via
       another channel. Better not to break that.
    
     - Now, combining both an MP_CAPABLE and an MP_JOIN will no longer
       result to a reject of the two options, but only the second suboption
       is ignored. That seems OK to do that for this unexpected error. At
       least now all inconsistent combinations are handled the same way.
       This could change later in next. This also means the explicit checks
       for having both MPC + MPJ in subflow.c will now be unreachable.
       That's fine, they will be removed in a follow-up patch.
    
     - In case of conflicting combinations, the extra suboption(s) is/are
       ignored: having such combinations either means the remote peer is
       buggy, or is evil. The simplest action is then taken in this case:
       stop processing the current suboption.
    
     - In mp_opt->suboptions, there is also a bit reserved to the checksum,
       which can be used in an MP_CAPABLE and a DSS. Each time a DSS option
       can be used in parallel with another option, the checksum can be set,
       so the verification is combined into a new OPTIONS_MPTCP_DSS macro.
    
     - An MP_CAPABLE ACK can carry a Data-Level Length, and an optional
       Checksum: they are the same as the ones found in a DSS, because a DSS
       cannot be used in parallel to an MP_CAPABLE. Similarly, even if there
       is room, a DSS cannot be used with an MP_JOIN.
    
    Fixes: eda7acddf808 ("mptcp: Handle MPTCP TCP options")
    Cc: [email protected]
    Link: https://www.rfc-editor.org/rfc/rfc8684.html#section-3.5-5.1 [1]
    Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-2-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ used `!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)` instead of missing `subopt` variable and `OPTIONS_MPTCP_MPC` instead of `OPTION_MPTCP_MPC_ACK` ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mptcp: pm: ADD_ADDR rtx: allow ID 0 [+ + +]
Author: Matthieu Baerts (NGI0) <[email protected]>
Date:   Tue Aug 25 07:24:28 2026 -0400

    mptcp: pm: ADD_ADDR rtx: allow ID 0
    
    [ Upstream commit 03f324f3f1f7619a47b9c91282cb12775ab0a2f1 ]
    
    ADD_ADDR can be sent for the ID 0, which corresponds to the local
    address and port linked to the initial subflow.
    
    Indeed, this address could be removed, and re-added later on, e.g. what
    is done in the "delete re-add signal" MPTCP Join selftests. So no reason
    to ignore it.
    
    Fixes: 00cfd77b9063 ("mptcp: retransmit ADD_ADDR when timeout")
    Cc: [email protected]
    Reviewed-by: Mat Martineau <[email protected]>
    Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: a7aad5b69d3b ("mptcp: pm: fix data race in add_addr timer callback")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mptcp: pm: ADD_ADDR rtx: always decrease sk refcount [+ + +]
Author: Matthieu Baerts (NGI0) <[email protected]>
Date:   Tue Aug 25 07:24:29 2026 -0400

    mptcp: pm: ADD_ADDR rtx: always decrease sk refcount
    
    [ Upstream commit 9634cb35af17019baec21ca648516ce376fa10e6 ]
    
    When an ADD_ADDR is retransmitted, the sk is held in sk_reset_timer().
    It should then be released in all cases at the end.
    
    Some (unlikely) checks were returning directly instead of calling
    sock_put() to decrease the refcount. Jump to a new 'exit' label to call
    __sock_put() (which will become sock_put() in the next commit) to fix
    this potential leak.
    
    While at it, drop the '!msk' check which cannot happen because it is
    never reset, and explicitly mark the remaining one as "unlikely".
    
    Fixes: 00cfd77b9063 ("mptcp: retransmit ADD_ADDR when timeout")
    Cc: [email protected]
    Reviewed-by: Mat Martineau <[email protected]>
    Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: a7aad5b69d3b ("mptcp: pm: fix data race in add_addr timer callback")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mptcp: pm: ADD_ADDR rtx: free sk if last [+ + +]
Author: Matthieu Baerts (NGI0) <[email protected]>
Date:   Tue Aug 25 07:24:30 2026 -0400

    mptcp: pm: ADD_ADDR rtx: free sk if last
    
    [ Upstream commit b7b9a461569734d33d3259d58d2507adfac107ed ]
    
    When an ADD_ADDR is retransmitted, the sk is held in sk_reset_timer(),
    and released at the end.
    
    If at that moment, it was the last reference being held, the sk would
    not be freed. sock_put() should then be called instead of __sock_put().
    
    But that's not enough: if it is the last reference, sock_put() will call
    sk_free(), which will end up calling sk_stop_timer_sync() on the same
    timer, and waiting indefinitely to finish. So it is needed to mark that
    the timer is done at the end of the timer handler when it has not been
    rescheduled, not to call sk_stop_timer_sync() on "itself".
    
    Fixes: 00cfd77b9063 ("mptcp: retransmit ADD_ADDR when timeout")
    Cc: [email protected]
    Reviewed-by: Mat Martineau <[email protected]>
    Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: a7aad5b69d3b ("mptcp: pm: fix data race in add_addr timer callback")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mptcp: pm: fix data race in add_addr timer callback [+ + +]
Author: Qing Luo <[email protected]>
Date:   Tue Aug 25 07:24:31 2026 -0400

    mptcp: pm: fix data race in add_addr timer callback
    
    [ Upstream commit a7aad5b69d3bdaec20a3ed9284e184502450c0cd ]
    
    The timer callback reads entry->retrans_times outside pm.lock to decide
    whether to call mptcp_pm_subflow_established(). Since
    mptcp_pm_announced_del_timer() can concurrently set retrans_times =
    ADD_ADDR_RETRANS_MAX under pm.lock, a race condition exists.
    
    I discovered this issue while studying the code. AI tools helped me to
    verify the issue can potentially happen under race conditions.
    
    Use a local 'retransmit' flag set inside pm.lock to capture whether
    retransmission is still possible when the lock is taken. This allows to
    call mptcp_pm_subflow_established() accordingly, and not depending on
    the situation that can be different when checked outside the pm.lock.
    
    Fixes: 348d5c1dec60 ("mptcp: move to next addr when timeout")
    Cc: [email protected]
    Signed-off-by: Qing Luo <[email protected]>
    Reviewed-by: Matthieu Baerts (NGI0) <[email protected]>
    Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-4-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ applied hunk to mptcp_pm_add_timer() in net/mptcp/pm_netlink.c instead of pm.c, dropping the absent adaptive-timeout shift line ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net/sched: reject overly deep qdisc hierarchies [+ + +]
Author: Zijie Huang <[email protected]>
Date:   Fri Aug 21 10:50:10 2026 -0400

    net/sched: reject overly deep qdisc hierarchies
    
    [ Upstream commit dedd34b0f2310e28c5f6d4875cfbf4b7ed821c01 ]
    
    Deep qdisc hierarchies can lead to excessive recursion in qdisc tree
    walkers and exhaust the kernel stack. The existing loop check does not
    cover the create-and-graft path, so a hierarchy can still be extended by
    creating a new child qdisc below an already deep parent.
    
    Store the hierarchy depth in struct Qdisc and update it when qdiscs are
    grafted. Reject new child qdiscs once the parent is already at the maximum
    allowed depth.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Suggested-by: Jamal Hadi Salim <[email protected]>
    Reported-by: Vega <[email protected]>
    Assisted-by: Codex:gpt-5.4
    Signed-off-by: Zijie Huang <[email protected]>
    Signed-off-by: Ren Wei <[email protected]>
    Reviewed-by: Victor Nogueira <[email protected]>
    Link: https://patch.msgid.link/1e9ab39597423fd5d13cfaaf52279b8ee3d9fc3c.1785434373.git.milkory@outlook.com
    Acked-by: Jamal Hadi Salim <[email protected]>
    Signed-off-by: Paolo Abeni <[email protected]>
    [ Dropped the `extack` argument from the `notify_and_destroy()` context line to match 5.15's 6-parameter version. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nfc: digital: clamp SENSF_RES length to the destination buffer [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Wed Jun 3 16:13:55 2026 +0200

    nfc: digital: clamp SENSF_RES length to the destination buffer
    
    commit 344a56d7c8e0f3cbaff0bcb1bcd95a1a1db24b16 upstream.
    
    digital_in_recv_sensf_res() memcpy()s resp->len bytes from a remote
    NFC-F device response into the NFC_SENSF_RES_MAXSIZE-byte target.sensf_res
    field without an upper-bound check. A nearby malicious NFC-F device can
    send an oversized SENSF_RES response to overflow the stack-local struct
    nfc_target.
    
    Clamp resp->len to NFC_SENSF_RES_MAXSIZE before the copy.
    
    Found by 0sec automated security-research tooling (https://0sec.ai).
    
    Fixes: 8c0695e4998d ("NFC Digital: Add NFC-F technology support")
    Cc: [email protected]
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Reviewed-by: Alexander Lobakin <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: fdp: bound the device-reported read length and fix an skb leak [+ + +]
Author: Bryam Vargas <[email protected]>
Date:   Tue Jun 16 23:33:35 2026 -0500

    nfc: fdp: bound the device-reported read length and fix an skb leak
    
    commit 7ad21dcfeb5181af0c3ee2608808c0c0a5283aa1 upstream.
    
    fdp_nci_i2c_read() takes the next packet length from two device-supplied
    bytes and never validates it. The value is a u16 used as the
    i2c_master_recv() count into a 261-byte on-stack buffer: a malicious,
    counterfeit or malfunctioning controller (or an i2c bus interposer) can
    drive it far past the buffer for a stack out-of-bounds write that
    clobbers the canary and return address, or below the minimum frame size
    (directly, or by truncating the computed sum) so the header/LRC strip
    and the next length read run past a short receive. Reject a length
    outside [FDP_NCI_I2C_MIN_PAYLOAD, FDP_NCI_I2C_MAX_PAYLOAD], as a
    corrupted packet already is, and force resynchronization.
    
    The same loop allocates one data skb per iteration and assumes a length
    packet followed by a data packet; a device that sends two data packets
    in one call leaks the first skb when the second allocation overwrites
    it. Free a previously allocated skb before allocating the next.
    
    Fixes: a06347c04c13 ("NFC: Add Intel Fields Peak NFC solution driver")
    Cc: [email protected]
    Suggested-by: Simon Horman <[email protected]>
    Signed-off-by: Bryam Vargas <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: llcp: bound the connect_sn TLV walk to the skb [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Thu Jul 9 15:12:29 2026 +0200

    nfc: llcp: bound the connect_sn TLV walk to the skb
    
    commit 55c68ac93e7dacc0f5f608b9c39dd4ff48cf28e8 upstream.
    
    Commit 27256cdb290e ("nfc: llcp: bound SNL TLV parsing to the skb and
    add length checks") fixed the unbounded TLV walk in nfc_llcp_recv_snl(),
    and commit d8bd2dedbde5 ("nfc: llcp: fix OOB read and u8 offset wrap in
    TLV parsers") subsequently bounded nfc_llcp_parse_gb_tlv() and
    nfc_llcp_parse_connection_tlv(). One sibling parser sharing the same
    pattern remains unbounded: nfc_llcp_connect_sn().
    
    nfc_llcp_connect_sn() walks a TLV list, reading a two-byte header
    (type, length) followed by length bytes of value, without checking that
    the two header bytes or the declared length stay within the buffer. It
    returns a pointer to a service name of up to 255 bytes that may point
    past the end of the skb; it is subsequently consumed by memcmp() in
    nfc_llcp_sock_from_sn(). In addition tlv_array_len was computed as
    "skb->len - LLCP_HEADER_SIZE" in size_t, so a CONNECT/CC frame shorter
    than the LLCP header underflows to a huge length and the walk runs far
    past the buffer.
    
    nfc_llcp_connect_sn() is reachable from nfc_llcp_recv_connect() and
    nfc_llcp_recv_cc(), i.e. from received CONNECT and CC PDUs. A nearby
    NFC device can reach this without authentication; LLCP link activation
    happens automatically after NFC-DEP, and the nfc_llcp_rx_skb()
    dispatcher applies no minimum-length guard.
    
    Walk the TLV list by pointer, bounded by skb_tail_pointer(skb), and
    validate each declared length before use, matching the approach already
    used for nfc_llcp_recv_snl(). Starting the walk at
    &skb->data[LLCP_HEADER_SIZE] against the tail pointer also removes the
    size_t underflow for short frames.
    
    Found by 0sec automated security-research tooling (https://0sec.ai).
    
    Fixes: d646960f7986 ("NFC: Initial LLCP support")
    Cc: [email protected]
    Assisted-by: 0sec:claude-opus-4-8
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: llcp: fix OOB read and u8 offset wrap in TLV parsers [+ + +]
Author: Muhammad Bilal <[email protected]>
Date:   Mon Jun 22 18:18:02 2026 +0500

    nfc: llcp: fix OOB read and u8 offset wrap in TLV parsers
    
    commit 78b20c8eeacd2e44a2d8a4cb5316d3c521d90911 upstream.
    
    nfc_llcp_parse_gb_tlv() and nfc_llcp_parse_connection_tlv() contain
    three related bugs in their TLV parsing loops:
    
    1. 'offset' is declared u8 but tlv_array_len is u16. When TLV data
       advances offset past 255 it silently wraps to zero, causing
       infinite loops or double-processing of buffer data.
    
    2. Before reading tlv[0] (type) and tlv[1] (length) there is no
       check that offset+2 <= tlv_array_len. A truncated TLV causes
       an OOB read of one byte past the buffer end.
    
    3. After reading the length field, the value bytes are accessed
       without checking offset+2+length <= tlv_array_len. A crafted
       length=0xFF on a short buffer causes up to 255 bytes of OOB
       read past the buffer end.
    
    Both functions are reachable without authentication via
    nfc_llcp_set_remote_gb() which feeds remote LLCP general bytes
    directly into nfc_llcp_parse_gb_tlv() with no additional
    validation.
    
    Fix all three issues by widening offset from u8 to u16 and adding
    bounds checks for both the TLV header and value field before each
    access.
    
    Fixes: 3df40eb3a2ea ("nfc: constify several pointers to u8, char and sk_buff")
    Cc: [email protected]
    Signed-off-by: Muhammad Bilal <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: llcp: reject PDUs shorter than the LLCP header [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Tue Jul 14 18:46:31 2026 +0200

    nfc: llcp: reject PDUs shorter than the LLCP header
    
    commit 95674f506c6376d6722a23144c9acd26609771ed upstream.
    
    Every LLCP PDU begins with a two-byte header (DSAP/SSAP + PTYPE), but the
    receive path never checked that a frame is at least LLCP_HEADER_SIZE bytes
    before parsing it.
    
    nfc_llcp_rx_skb() reads the header via nfc_llcp_ptype()/nfc_llcp_dsap()/
    nfc_llcp_ssap(), which dereference pdu->data[0] and pdu->data[1], and a
    CONNECT or CC PDU then computes
    
            tlv_array_len = skb->len - LLCP_HEADER_SIZE;
    
    as a size_t and hands it to the TLV walk. When the frame is shorter than
    the header the subtraction wraps to a huge value and the walk runs far
    past the buffer, an out-of-bounds read.
    
    A nearby NFC device can reach this without authentication; LLCP link
    activation happens automatically after NFC-DEP.
    
    Guard the common receive choke point __nfc_llcp_recv(), shared by both the
    target (nfc_llcp_data_received()) and initiator (nfc_llcp_recv()) paths, so
    a short skb is dropped before the rx_work worker parses it. Use
    pskb_may_pull() rather than a skb->len test so the two header bytes are
    guaranteed to sit in the skb linear area even for a non-linear skb,
    matching how the sibling NCI and HCI receive paths validate their headers.
    
    Reproduced with a KFENCE out-of-bounds read via /dev/virtual_nci on
    linux-next.
    
    Found by 0sec automated security-research tooling (https://0sec.ai).
    
    Fixes: d646960f7986 ("NFC: Initial LLCP support")
    Cc: [email protected]
    Suggested-by: David Laight <[email protected]>
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Reviewed-by: Vadim Fedorenko <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: microread: validate target discovery payload lengths [+ + +]
Author: Pengpeng Hou <[email protected]>
Date:   Thu Jul 23 10:37:20 2026 +0800

    nfc: microread: validate target discovery payload lengths
    
    commit 25519469972ef57c3edb1805dabd6c5612b90211 upstream.
    
    microread_target_discovered() parses target discovery payloads from
    skb->data according to the HCI gate. The fixed field offsets and UID
    copies were checked only against the destination nfc_target buffers, not
    against the actual skb length.
    
    Validate that each gate-specific payload contains the fixed fields and
    UID bytes before reading or copying them.
    
    Fixes: cfad1ba87150 ("NFC: Initial support for Inside Secure microread")
    Cc: [email protected]
    Signed-off-by: Pengpeng Hou <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: nci: fix out-of-bounds write in nci_target_auto_activated() [+ + +]
Author: Samuel Page <[email protected]>
Date:   Mon Jun 22 16:52:43 2026 +0200

    nfc: nci: fix out-of-bounds write in nci_target_auto_activated()
    
    commit ac200079db50af81e6b04d058b33ec92901d8edd upstream.
    
    nci_target_auto_activated() appends a target to the fixed-size array
    ndev->targets[NCI_MAX_DISCOVERED_TARGETS] and increments ndev->n_targets
    without first checking the array is full; unlike its sibling
    nci_add_new_target(), which bails out when n_targets already equals
    NCI_MAX_DISCOVERED_TARGETS.
    
    ndev->n_targets is only cleared by nci_clear_target_list(), so an NFCC
    that repeatedly re-runs discovery (RF_DISCOVER_RSP, which re-enters
    NCI_DISCOVERY without clearing the target list) and reports an
    auto-activated target (RF_INTF_ACTIVATED_NTF) drives n_targets past the
    limit. The append then writes a struct nfc_target past the end of the
    array (a slab out-of-bounds write), and nfc_targets_found() goes on to
    walk the array with the inflated count:
    
      BUG: KASAN: slab-out-of-bounds in nci_add_new_protocol+0x94/0x2ac [nci]
      Write of size 2 at addr ffff0000c7299a18 by task kworker/u8:0/12
      Workqueue: nfc0_nci_rx_wq nci_rx_work [nci]
      Call trace:
       nci_add_new_protocol+0x94/0x2ac [nci]
       nci_ntf_packet+0xddc/0x11a0 [nci]
       nci_rx_work+0x15c/0x1e0 [nci]
       process_one_work+0x2dc/0x500
       worker_thread+0x240/0x460
       kthread+0x1c0/0x1d0
       ret_from_fork+0x10/0x20
    
      The buggy address belongs to the cache kmalloc-2k of size 2048
      The buggy address is located 1024 bytes to the right of
      allocated 1560-byte region [ffff0000c7299000, ffff0000c7299618)
    
    Guard nci_target_auto_activated() with the same check used by
    nci_add_new_target().
    
    Fixes: 019c4fbaa790 ("NFC: Add NCI multiple targets support")
    Cc: [email protected]
    Assisted-by: Bynario AI
    Signed-off-by: Samuel Page <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: nci: fix uninit-value in the RF discover/activated NTF handlers [+ + +]
Author: Samuel Page <[email protected]>
Date:   Fri Jun 26 10:03:01 2026 +0100

    nfc: nci: fix uninit-value in the RF discover/activated NTF handlers
    
    commit 8cbe06c1e699c0a165dae5093a2550e65f914818 upstream.
    
    nci_rf_discover_ntf_packet() and nci_rf_intf_activated_ntf_packet() each
    parse a notification into an on-stack struct (nci_rf_discover_ntf /
    nci_rf_intf_activated_ntf) that is not initialised. The RF
    technology-specific parameters are only extracted when
    rf_tech_specific_params_len is non-zero, so a notification that reports a
    zero length leaves the rf_tech_specific_params union uninitialised - and
    both handlers then pass it to nci_add_new_protocol(), which reads it:
    
     - discover:  nci_add_new_target() -> nci_add_new_protocol();
     - activated: nci_target_auto_activated() -> nci_add_new_protocol().
    
    nci_add_new_protocol() uses nfca_poll->nfcid1_len as both a branch
    condition and a memcpy() length and copies nfcid1/sens_res/sel_res into
    ndev->targets, which is later exposed to user space via NFC_CMD_GET_TARGET.
    
      BUG: KMSAN: uninit-value in nci_add_new_protocol+0x624/0x6c0
       nci_add_new_protocol+0x624/0x6c0
       nci_ntf_packet+0x25b2/0x3c30
       nci_rx_work+0x318/0x5d0
       process_scheduled_works+0x84b/0x17a0
       worker_thread+0xc10/0x11b0
       kthread+0x376/0x500
      Local variable ntf.i created at:
       nci_ntf_packet+0xbc2/0x3c30
    
    Zero-initialise both on-stack notifications so the union reads back as
    zero when no technology-specific parameters are present.
    
    Fixes: 019c4fbaa790 ("NFC: Add NCI multiple targets support")
    Fixes: e8c0dacd9836 ("NFC: Update names and structs to NCI spec 1.0 d18")
    Link: https://lore.kernel.org/netdev/[email protected]/
    Cc: [email protected]
    Assisted-by: Bynario AI
    Signed-off-by: Samuel Page <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: nci: free destination parameters when closing a connection [+ + +]
Author: Linmao Li <[email protected]>
Date:   Tue Jul 21 10:35:18 2026 +0800

    nfc: nci: free destination parameters when closing a connection
    
    commit 2e65bafdfd3a8bba972b3d17b6a57816557530fc upstream.
    
    When a connection is closed, nci_core_conn_close_rsp_packet() frees
    conn_info but not conn_info->dest_params, which is a separate devm
    allocation. Each connect/close cycle leaks one dest_params until the
    NFC device is removed. Free dest_params along with conn_info.
    
    Fixes: 9b8d1a4cf2aa ("nfc: nci: Add an additional parameter to identify a connection id")
    Cc: [email protected]
    Signed-off-by: Linmao Li <[email protected]>
    Reviewed-by: Vadim Fedorenko <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: pn533: purge fragmented skbs during cleanup [+ + +]
Author: Xu Rao <[email protected]>
Date:   Mon Jul 20 10:14:44 2026 +0800

    nfc: pn533: purge fragmented skbs during cleanup
    
    commit 5718fc62198c38c2de5316020a90506f9e75e0bb upstream.
    
    pn53x_common_clean() purges resp_q before freeing the common PN533 state,
    but it leaves fragment_skb untouched.  The fragmentation helpers queue
    transmit fragments there while sending large initiator or target-mode
    frames, and those skbs remain owned by the driver until they are sent or
    discarded.
    
    If the device is removed while fragments are still queued, the common
    cleanup path frees the PN533 state without releasing the queued fragment
    skbs, leaking them.
    
    Purge fragment_skb during cleanup alongside resp_q.
    
    Fixes: 963a82e07d4e ("NFC: pn533: Split large Tx frames in chunks")
    Cc: [email protected]
    Signed-off-by: Xu Rao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

nfc: st21nfca: validate ATR_REQ length against the received frame [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Sat Jul 11 09:13:01 2026 +0200

    nfc: st21nfca: validate ATR_REQ length against the received frame
    
    commit 5cdcca5d62a66eda6b774110a44cba67bc1a8d1d upstream.
    
    st21nfca_tm_recv_atr_req() checks that the received ATR_REQ frame is at
    least ST21NFCA_ATR_REQ_MIN_SIZE and that the self-declared atr_req->length
    is at least sizeof(struct st21nfca_atr_req), but never checks that
    atr_req->length does not exceed the actual received length (skb->len).
    
    st21nfca_tm_send_atr_res() then trusts the declared length:
    
            gb_len = atr_req->length - sizeof(struct st21nfca_atr_req);
            ...
            memcpy(atr_res->gbi, atr_req->gbi, gb_len);
    
    so an RF peer that sends a short frame but sets atr_req->length larger
    than the frame makes gb_len exceed the general bytes actually present,
    and the memcpy reads out of bounds past the received skb. Those bytes are
    placed in the ATR_RES and sent back to the peer (kernel-memory disclosure
    to a proximity attacker); a larger declared length is an out-of-bounds
    read (DoS).
    
    Reject frames whose declared length exceeds the received length. The
    adjacent nfc_tm_activated() path in the same function already derives its
    general-bytes length from skb->len rather than the declared field.
    
    Found by 0sec (https://0sec.ai) using automated source analysis; the
    missing bound is evident from source. Compile-tested.
    
    Fixes: 1892bf844ea0 ("NFC: st21nfca: Adding P2P support to st21nfca in Initiator & Target mode")
    Cc: [email protected]
    Assisted-by: 0sec:claude-opus-4-8
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: David Heidelberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
NTB: ntb_netdev: Preserve RX queue depth on allocation failure [+ + +]
Author: Koichiro Den <[email protected]>
Date:   Fri Aug 21 00:32:25 2026 -0400

    NTB: ntb_netdev: Preserve RX queue depth on allocation failure
    
    [ Upstream commit d2121faf133ac3bf9531b53a7e21273649a08517 ]
    
    ntb_netdev_rx_handler() hands the received skb to the network stack
    before allocating its replacement. If the allocation fails, nothing is
    reposted. Every failure therefore takes one buffer out of the RX queue
    while the interface remains up, and enough failures eventually stall
    reception.
    
    A retry path could refill the queue later, but ntb_netdev has none.
    Allocate the replacement first instead. If that fails, drop the packet
    and repost the same skb. This keeps the queue full and lets packet
    delivery resume as soon as memory is available again.
    
    Fixes: 548c237c0a99 ("net: Add support for NTB virtual ethernet device")
    Cc: [email protected]
    Signed-off-by: Koichiro Den <[email protected]>
    Reviewed-by: Dave Jiang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    [ kept HEAD's `struct net_device *ndev = qp_data;` declaration instead of the per-queue context variables, adding only `new_skb` to the existing `skb` declaration ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
null_blk: fix UBSAN shift-out-of-bounds when zone_size is 0 or overflows [+ + +]
Author: Rik van Riel <[email protected]>
Date:   Sat Aug 8 11:42:39 2026 -0400

    null_blk: fix UBSAN shift-out-of-bounds when zone_size is 0 or overflows
    
    commit 95491fb05105b61050cb623a5e0227eb26aa3525 upstream.
    
    null_zone_no() does sect >> ilog2(dev->zone_size_sects). When
    zone_size_sects is 0, ilog2(0) returns -1, producing shift exponent -1
    which UBSAN reports as shift-out-of-bounds.
    
      UBSAN: shift-out-of-bounds in drivers/block/null_blk/zoned.c:21:14
      shift exponent -1 is negative
      Call Trace:
       null_zone_no drivers/block/null_blk/zoned.c:21 [inline]
       null_process_zoned_cmd+0xf76/0xf80 drivers/block/null_blk/zoned.c:728
       null_handle_cmd drivers/block/null_blk/main.c:1455 [inline]
       null_queue_rq+0x8bc/0xe70 drivers/block/null_blk/main.c:1703
       __blk_mq_issue_directly block/blk-mq.c:2694 [inline]
       blk_mq_try_issue_directly+0x3f4/0x880 block/blk-mq.c:2754
       blk_mq_submit_bio+0x20c0/0x2a40 block/blk-mq.c:3208
       submit_bio_noacct_nocheck+0x2f4/0xa40 block/blk-core.c:790
       block_read_full_folio+0x7a6/0x810 fs/buffer.c:2463
       filemap_read_folio+0x12c/0x3a0 mm/filemap.c:2510
       read_part_sector+0xb6/0x2b0 block/partitions/core.c:724
       adfspart_check_ICS+0xb1/0x960 block/partitions/acorn.c:357
       check_partition block/partitions/core.c:143 [inline]
       blk_add_partitions block/partitions/core.c:591 [inline]
       bdev_disk_changed+0x851/0x17a0 block/partitions/core.c:695
       blkdev_get_whole+0x372/0x510 block/bdev.c:751
       add_disk_final block/genhd.c:412 [inline]
       add_disk_fwnode+0x24b/0x3a0 block/genhd.c:606
       null_add_dev+0x130b/0x1d70 drivers/block/null_blk/main.c:2052
       nullb_device_power_store+0x240/0x380 drivers/block/null_blk/main.c:501
       configfs_write_iter+0x337/0x430 fs/configfs/file.c:229
    
    Syzkaller triggers this by creating a zoned null_blk device via
    configfs. The Call Trace shows configfs_write_iter in configfs/file.c
    handling a write to power file, which calls nullb_device_power_store in
    main.c, which calls null_add_dev in main.c, which calls add_disk in
    genhd.c, which triggers partition scan via bdev_disk_changed in
    partitions/core.c.
    
    A zoned null_blk device with zone_size 0 should not be legal. Existing
    code tries to reject it via is_power_of_2() check in zoned.c and
    !zone_size check in main.c, but syzkaller can still reach
    null_zone_no() with zone_size_sects 0 via two paths:
    
    1. Direct 0 via configfs: zone_size attribute store in main.c has
    NULLB_DEVICE_ATTR(zone_size, ulong, NULL) with no validation callback,
    so echo 0 > zone_size succeeds before power store. If zoned is false
    at power store time, the !zone_size check in main.c is skipped, and
    later zoned set true leaves zone_size 0.
    
    2. Large value overflow: mb_to_sects() in zoned.c does
    (sector_t)mb * SZ_1M >> SECTOR_SHIFT which is mb * 2048. If mb is
    1UL << 53 (9PB), mb * 2048 overflows 64-bit to 0. The value is
    power-of-two so is_power_of_2() passes, but mb_to_sects() returns 0.
    
    Check for zero zone_size explicitly in null_init_zoned_dev() in
    zoned.c, returning -EINVAL with "must be non-zero power-of-two".
    Check for zero zone_size_sects after mb_to_sects() conversion,
    returning -EINVAL for overflow case. Keep defensive check in
    null_zone_no() returning 0 for zero sectors to avoid shift out-of-bounds
    even if  zero slips through.
    
    This change should be safe because zone_size is set once in
    null_init_zoned_dev() under device lock and never changes after, and 0
    is never valid for a zoned device. Returning -EINVAL at init time fails
    device creation early with clear error, while defensive return 0 in
    null_zone_no() makes zoned command fail via offline zone check.
    No new locking is introduced.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=abd6a8dca0f2b7726060
    Link: https://lore.kernel.org/all/[email protected]/
    Fixes: 8a3cf049af68 ("null_blk: add zoned block device emulation")
    Cc: [email protected]
    Assisted-by: Hermes:muse-spark-1.2 syzkaller
    Signed-off-by: Rik van Riel <[email protected]>
    Reviewed-by: Damien Le Moal <[email protected]>
    Link: https://patch.msgid.link/20260808114239.69167f68@fangorn
    Signed-off-by: Jens Axboe <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nvmet-fc: fix invalid free in LS IOD error path [+ + +]
Author: Jiang HongHui <[email protected]>
Date:   Wed Jul 29 19:02:06 2026 +0800

    nvmet-fc: fix invalid free in LS IOD error path
    
    commit ba98d6796d12258e837ece065d2ecb59d76ce4ff upstream.
    
    nvmet_fc_alloc_ls_iodlist() advances iod while initializing the LS IOD
    array. If an rqstbuf allocation or response buffer DMA mapping fails,
    the unwind loop decrements iod past the start of the array. The final
    kfree(iod) therefore frees an address before the allocated object.
    
    This can be reproduced with nvme-fcloop and failslab by setting
    fail-nth to 6 before creating a target port. KASAN reports:
    
      BUG: KASAN: invalid-free in nvmet_fc_register_targetport
      Free of addr ffff88816cf8ff48 by task nvmet_fail_nth/9552
    
    Free the original allocation base stored in tgtport->iod instead. With
    this fix applied, the same sysfs write with fail-nth=6 returns -ENOMEM
    without any KASAN report.
    
    Fixes: c53432030d86 ("nvme-fabrics: Add target support for FC transport")
    Cc: [email protected]
    Reviewed-by: Maurizio Lombardi <[email protected]>
    Assisted-by: Codex:gpt-5
    Signed-off-by: Jiang HongHui <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nvmet-tcp: Do not WARN on remotely-controlled oversized SGL allocations [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Mon Jul 27 22:03:31 2026 +0200

    nvmet-tcp: Do not WARN on remotely-controlled oversized SGL allocations
    
    commit 737a3b535247226f6e1a7988fd9d6e63e7d6fc71 upstream.
    
    When fuzzing the nvme target code, I tripped a kernel warning in
    nvmet_tcp_map_data() because the length passed into the allocator is
    controlled by the remote initiator.
    
    A remote initiator that sends a command with an SGL claiming a huge
    number, can create a scatterlist and iovec allocation of over 1 million
    entries, which causes the backing kmalloc call to exceed MAX_PAGE_ORDER
    and then the page allocator will trip on a WARN_ON_ONCE_GFP() message:
    
      WARNING: mm/page_alloc.c:5280 __alloc_frozen_pages_noprof
      Workqueue: nvmet_tcp_wq nvmet_tcp_io_work
      ...
      sgl_alloc_order
      nvmet_tcp_map_data
      nvmet_tcp_try_recv_pdu
    
    As it's never good to trip a kernel warning remotely due to many systems
    having panic-on-warn enabled, let's silence it by just add GFP_NOWARN to
    the allocation flags.
    
    Assisted-by: gkh_clanker_2000
    Cc: stable <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ocfs2: fix missing metadata reservation for large xattrs [+ + +]
Author: Ian Bridges <[email protected]>
Date:   Thu Jul 23 23:57:03 2026 -0500

    ocfs2: fix missing metadata reservation for large xattrs
    
    commit 0cdc7dde00ec63ac714271fa8b2918d630b8da1a upstream.
    
    [BUG]
    lsetxattr() panics the kernel when setting a large xattr value on a
    fragmented filesystem where the file already has an external xattr
    block.
    
    [CAUSE]
    ocfs2_calc_xattr_set_need() never reserves metadata blocks for a new
    xattr value's extent tree when the file already has an external xattr
    block. The not_found path leaves meta_add at zero, so meta_ac is NULL
    when ocfs2_xattr_extend_allocation() runs.
    
    A new value root has room for a single extent record. On a fragmented
    filesystem, the allocator cannot satisfy the xattr value in one
    contiguous run, so each non-contiguous run requires its own extent
    record. When the value root's extent list is full and meta_ac is NULL,
    ocfs2_add_clusters_in_btree() returns RESTART_META, and
    ocfs2_xattr_extend_allocation() hits BUG_ON(why == RESTART_META).
    
    [FIX]
    The case where no xattr block exists yet already calls
    ocfs2_extend_meta_needed(&def_xv.xv.xr_list) to reserve value tree
    metadata. Add the same reservation to the case where an xattr block
    already exists, making the two cases consistent.
    
    Replace the BUG_ON with a -ENOSPC return so that if RESTART_META is
    returned despite the reservation, the error propagates to userspace
    instead of panicking the kernel.
    
    Link: https://lore.kernel.org/amLwn3i9tET8yhG7@dev
    Fixes: a78f9f466894 ("ocfs2: make xattr extension work with new local alloc reservation.")
    Signed-off-by: Ian Bridges <[email protected]>
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=e538032956b1157914a3
    Reviewed-by: Joseph Qi <[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]>
    Cc: Heming Zhao <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
packet: synchronize pressure clearing with ring reconfiguration [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Fri Aug 21 12:52:07 2026 -0400

    packet: synchronize pressure clearing with ring reconfiguration
    
    [ Upstream commit 1a35da325cac4d5bcad76a2aa943408a6f1d9000 ]
    
    packet_set_ring() updates the RX ring state under sk_receive_queue.lock,
    but used to publish the tpacket receive mode through po->prot_hook.func
    after releasing that lock. packet_poll() and packet_recvmsg() can then
    run the pressure clearing path after the ring has been cleared while
    still seeing tpacket_rcv, causing __packet_rcv_has_room() to dereference
    stale or NULL ring storage.
    
    Move the existing receive hook assignment into the same
    sk_receive_queue.lock section as the ring state update. Keep the
    assignment otherwise unchanged, including on TX ring reconfiguration, to
    avoid adding behavior changes that are not required for the fix.
    
    Serialize packet_recvmsg() pressure clearing with the same queue lock
    only after PACKET_SOCK_PRESSURE has been observed. If the flag is clear
    and the socket has moved away from tpacket_rcv, packet_set_ring() has
    already detached the socket and waited for synchronize_net(), so no new
    packet input can set the flag again.
    
    packet_poll() already holds sk_receive_queue.lock, so it uses the new
    unlocked helper directly.
    
    Fixes: 2ccdbaa6d55b ("packet: rollover lock contention avoidance")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: Codex:gpt-5.4
    Signed-off-by: Zihan Xi <[email protected]>
    Link: https://patch.msgid.link/f90b5688311fa278d1361ea8c6be0bf25967d591.1785247446.git.zihanx@nebusec.ai
    Signed-off-by: Paolo Abeni <[email protected]>
    [ Replaced `packet_sock_flag(po, PACKET_SOCK_PRESSURE)` with `READ_ONCE(po->pressure)` since the flag conversion isn't in this tree. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

packet: use consistent hard_header_len in non-ring send paths [+ + +]
Author: Qihang Tang <[email protected]>
Date:   Fri Aug 21 10:50:01 2026 -0400

    packet: use consistent hard_header_len in non-ring send paths
    
    [ Upstream commit 03390aa32e669cc4ecd7d34108e2e1afc13d689d ]
    
    packet_snd() reads dev->hard_header_len multiple times while allocating
    and constructing an skb. Device reconfiguration can change this value
    concurrently, for example through bonding device type changes.
    
    For SOCK_RAW, packet_snd() can save a larger value in reserve and later
    allocate headroom using a smaller value. Moving skb->data back by reserve
    then places it before skb->head, and the following copy from userspace can
    attempt an out-of-bounds write.
    
    packet_sendmsg_spkt() has the same issue because it calculates its
    reservation and header offset from separate reads before dropping the RCU
    read lock to allocate the skb.
    
    Add LL_RESERVED_SPACE_EX() for callers that already saved a header length.
    Read hard_header_len once in packet_snd() and use it for allocation and
    construction. In packet_sendmsg_spkt(), preserve the allocation-time value
    through the device lookup retry.
    
    The separate SOCK_DGRAM consistency problem between hard_header_len and
    header_ops->create is not addressed here.
    
    Fixes: b84bbaf7a6c8 ("packet: in packet_snd start writing at link layer allocation")
    Cc: [email protected]
    Signed-off-by: Qihang Tang <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: 21b5953e7494 ("packet: use consistent hard_header_len in TX_RING send path")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

packet: use consistent hard_header_len in TX_RING send path [+ + +]
Author: Qihang Tang <[email protected]>
Date:   Fri Aug 21 10:50:02 2026 -0400

    packet: use consistent hard_header_len in TX_RING send path
    
    [ Upstream commit 21b5953e7494c16a42e6cd8cf110e18d13ae4a6b ]
    
    tpacket_snd() reads dev->hard_header_len independently for skb
    allocation and header construction in tpacket_fill_skb(). Concurrent
    netdevice reconfiguration can therefore make the reserved headroom
    smaller than the amount later pushed, or make copylen - hard_header_len
    negative.
    
    Snapshot hard_header_len once before processing ring frames and use it
    for the frame limit, headroom allocation, copy length, and skb
    construction. Pass the snapshot to tpacket_fill_skb().
    
    The separate SOCK_DGRAM consistency problem between hard_header_len and
    header_ops->create is not addressed here.
    
    Fixes: 69e3c75f4d54 ("net: TX_RING and packet mmap")
    Cc: [email protected]
    Signed-off-by: Qihang Tang <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Applied cleanly after amending the prerequisite that adds `LL_RESERVED_SPACE_EX()`; no target-side adaptation was needed. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems [+ + +]
Author: Steffen Persvold <[email protected]>
Date:   Thu Jul 9 14:24:46 2026 +0200

    PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems
    
    commit 008cb88edb41f3c7c8e0ed763ff9f26719830984 upstream.
    
    On 32-bit systems the config space is too large to ioremap in one go, so
    pci_ecam_create() maps each bus segment separately and relies on the
    ->add_bus callback (pci_ecam_add_bus) to populate the per-bus mapping in
    cfg->winp[]. pci_ecam_map_bus() then uses that mapping as the base for
    every config access.
    
    The generic ECAM ops (pci_generic_ecam_ops) already provide the ->add_bus
    and ->remove_bus callbacks, but the CAM (legacy) ops in pci-host-generic.c
    do not. As a result, on a 32-bit host using "pci-host-cam-generic" the
    per-bus mapping is never set up and the first config read dereferences a
    NULL base, crashing during bus enumeration:
    
     Unable to handle kernel NULL pointer dereference at virtual address 00000800
     Oops [#1]
     CPU: 0 PID: 1 Comm: swapper Not tainted 6.9.7+ #43
     Hardware name: Digilent Nexys-Video-A7 RV32 (DT)
     epc : pci_generic_config_read+0x40/0xb0
      ra : pci_generic_config_read+0x2c/0xb0
     [<c038db9c>] pci_generic_config_read+0x40/0xb0
     [<c038da04>] pci_bus_read_config_dword+0x50/0xb0
     [<c0391e94>] pci_bus_generic_read_dev_vendor_id+0x3c/0x1ec
     [<c039245c>] pci_scan_single_device+0xa4/0x11c
     [<c0392570>] pci_scan_slot+0x9c/0x23c
     [<c039388c>] pci_scan_child_bus_extend+0x58/0x2f4
     [<c0393db0>] pci_scan_root_bus_bridge+0x64/0xe8
     [<c0393e54>] pci_host_probe+0x20/0xc8
     [<c03bc6f4>] pci_host_common_probe+0x144/0x1e4
    
    Fix this by giving the CAM ops the same ->add_bus/->remove_bus callbacks.
    Since pci_ecam_add_bus() and pci_ecam_remove_bus() are static to ecam.c,
    move the CAM ops definition there as pci_generic_cam_ops (mirroring
    pci_generic_ecam_ops) and export it for pci-host-generic.c to reference.
    
    Fixes: 8fe55ef23387 ("PCI: Dynamically map ECAM regions")
    Signed-off-by: Steffen Persvold <[email protected]>
    [mani: removed timestamp from log]
    Signed-off-by: Manivannan Sadhasivam <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
 
perf/core: Fix child_total_time_enabled accounting bug at task exit [+ + +]
Author: Yeoreum Yun <[email protected]>
Date:   Fri Aug 21 00:23:36 2026 -0400

    perf/core: Fix child_total_time_enabled accounting bug at task exit
    
    [ Upstream commit a3c3c66670cee11eb13aa43905904bf29cb92d32 ]
    
    The perf events code fails to account for total_time_enabled of
    inactive events.
    
    Here is a failure case for accounting total_time_enabled for
    CPU PMU events:
    
      sudo ./perf stat -vvv -e armv8_pmuv3_0/event=0x08/ -e armv8_pmuv3_1/event=0x08/ -- stress-ng --pthread=2 -t 2s
      ...
    
      armv8_pmuv3_0/event=0x08/: 1138698008 2289429840 2174835740
      armv8_pmuv3_1/event=0x08/: 1826791390 1950025700 847648440
                                 `          `          `
                                 `          `          > total_time_running with child
                                 `          > total_time_enabled with child
                                 > count with child
    
      Performance counter stats for 'stress-ng --pthread=2 -t 2s':
    
           1,138,698,008      armv8_pmuv3_0/event=0x08/                                               (94.99%)
           1,826,791,390      armv8_pmuv3_1/event=0x08/                                               (43.47%)
    
    The two events above are opened on two different CPU PMUs, for example,
    each event is opened for a cluster in an Arm big.LITTLE system, they
    will never run on the same CPU.  In theory, the total enabled time should
    be same for both events, as two events are opened and closed together.
    
    As the result show, the two events' total enabled time including
    child event is different (2289429840 vs 1950025700).
    
    This is because child events are not accounted properly
    if a event is INACTIVE state when the task exits:
    
      perf_event_exit_event()
       `> perf_remove_from_context()
         `> __perf_remove_from_context()
           `> perf_child_detach()   -> Accumulate child_total_time_enabled
             `> list_del_event()    -> Update child event's time
    
    The problem is the time accumulation happens prior to child event's
    time updating. Thus, it misses to account the last period's time when
    the event exits.
    
    The perf core layer follows the rule that timekeeping is tied to state
    change. To address the issue, make __perf_remove_from_context()
    handle the task exit case by passing 'DETACH_EXIT' to it and
    invoke perf_event_state() for state alongside with accounting the time.
    
    Then, perf_child_detach() populates the time into the parent's time metrics.
    
    After this patch, the bug is fixed:
    
      sudo ./perf stat -vvv -e armv8_pmuv3_0/event=0x08/ -e armv8_pmuv3_1/event=0x08/ -- stress-ng --pthread=2 -t 10s
      ...
      armv8_pmuv3_0/event=0x08/: 15396770398 32157963940 21898169000
      armv8_pmuv3_1/event=0x08/: 22428964974 32157963940 10259794940
    
       Performance counter stats for 'stress-ng --pthread=2 -t 10s':
    
          15,396,770,398      armv8_pmuv3_0/event=0x08/                                               (68.10%)
          22,428,964,974      armv8_pmuv3_1/event=0x08/                                               (31.90%)
    
    [ mingo: Clarified the changelog. ]
    
    Fixes: ef54c1a476aef ("perf: Rework perf_event_exit_event()")
    Suggested-by: Peter Zijlstra <[email protected]>
    Signed-off-by: Yeoreum Yun <[email protected]>
    Signed-off-by: Ingo Molnar <[email protected]>
    Tested-by: Leo Yan <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Stable-dep-of: 42c5ca1f0a28 ("perf/core: Fix group leader use-after-free after sibling detach")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

perf/core: Fix group leader use-after-free after sibling detach [+ + +]
Author: Aditya Chillara <[email protected]>
Date:   Fri Aug 21 00:23:39 2026 -0400

    perf/core: Fix group leader use-after-free after sibling detach
    
    [ Upstream commit 42c5ca1f0a288a52878bd72a5595b08261057438 ]
    
    perf_group_detach() handles leader and sibling detach differently. When the
    group leader is detached, all siblings are promoted to singleton events and
    their group_leader pointer is reset to themselves. When a sibling is
    detached, it is removed from the leader's sibling_list, but its
    group_leader pointer is left pointing at the old leader.
    
    That is harmless when the sibling is being closed and freed immediately, as
    in the DETACH_DEAD path. It is not safe when the sibling is detached but
    kept alive, such as during CPU hotplug with DETACH_GROUP. In that case the
    sibling is removed from the context, while its file descriptor can still
    keep it alive.
    
    A typical failing sequence is:
    
      - A group contains leader L and sibling S.
      - CPU hot-unplug detaches S with DETACH_GROUP, removing it from
        L->sibling_list but leaving S->group_leader == L.
      - L is later closed and freed.
      - A PERF_IOC_FLAG_GROUP ioctl on S follows S->group_leader and
        dereferences the freed leader.
    
    This was reproduced by running the perf event fuzzer, CPU hotplug, and a
    stress workload concurrently:
    
      Unable to handle kernel paging request at virtual address 006b6b6b6b6b6cdb
      CPU: 2 PID: 12489 Comm: perf_fuzzer 6.18.7 PREEMPT
      pc : perf_ioctl+0x34c/0xc68
      x20: ffffff89a3fa2c70 x8 : 6b6b6b6b6b6b6b6b
      Code: 943c4a0e 340047a0 f9404a94 f9411e88 (f940b908)
      Call trace:
      perf_ioctl+0x34c/0xc68 (P)
      __arm64_sys_ioctl+0xa0/0xf4
      invoke_syscall+0x58/0xe4
      el0_svc_common+0xa8/0xdc
      do_el0_svc+0x1c/0x28
      el0_svc+0x40/0xc0
      el0t_64_sync_handler+0x68/0xdc
      el0t_64_sync+0x1c4/0x1c8
    
    The fault happened in perf_ioctl(), where perf_event_for_each() follows
    the stale group_leader pointer and perf_event_for_each_child() then
    dereferences the freed leader's context.
    
    Fix the use-after-free by promoting the detached sibling to a singleton.
    Also fix __event_disable() cgroup accounting and event state change.
    
    Fixes: 8a49542c0554 ("perf_events: Fix races in group composition")
    Assisted-by: PatchWise:gpt-5.5
    Signed-off-by: Aditya Chillara <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Reviewed-by: Dapeng Mi <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    [ adjusted `event_sched_out()` calls to the older three-argument form taking `cpuctx` and kept the existing `event->pending_disable = 1;` in the DETACH_DEAD path ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
perf: Fix cgroup state vs ERROR [+ + +]
Author: Peter Zijlstra <[email protected]>
Date:   Fri Aug 21 00:23:37 2026 -0400

    perf: Fix cgroup state vs ERROR
    
    [ Upstream commit 61988e36dc5457cdff7ae7927e8d9ad1419ee998 ]
    
    While chasing down a missing perf_cgroup_event_disable() elsewhere,
    Leo Yan found that both perf_put_aux_event() and
    perf_remove_sibling_event() were also missing one.
    
    Specifically, the rule is that events that switch to OFF,ERROR need to
    call perf_cgroup_event_disable().
    
    Unify the disable paths to ensure this.
    
    Fixes: ab43762ef010 ("perf: Allow normal events to output AUX data")
    Fixes: 9f0c4fa111dc ("perf/core: Add a new PERF_EV_CAP_SIBLING event capability")
    Reported-by: Leo Yan <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Link: https://lkml.kernel.org/r/[email protected]
    Stable-dep-of: 42c5ca1f0a28 ("perf/core: Fix group leader use-after-free after sibling detach")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

perf: Fix dangling cgroup pointer in cpuctx [+ + +]
Author: Yeoreum Yun <[email protected]>
Date:   Fri Aug 21 00:23:38 2026 -0400

    perf: Fix dangling cgroup pointer in cpuctx
    
    [ Upstream commit 3b7a34aebbdf2a4b7295205bf0c654294283ec82 ]
    
    Commit a3c3c6667("perf/core: Fix child_total_time_enabled accounting
    bug at task exit") moves the event->state update to before
    list_del_event(). This makes the event->state test in list_del_event()
    always false; never calling perf_cgroup_event_disable().
    
    As a result, cpuctx->cgrp won't be cleared properly; causing havoc.
    
    Fixes: a3c3c6667("perf/core: Fix child_total_time_enabled accounting bug at task exit")
    Signed-off-by: Yeoreum Yun <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Tested-by: David Wang <[email protected]>
    Link: https://lore.kernel.org/all/aD2TspKH%[email protected]/
    Stable-dep-of: 42c5ca1f0a28 ("perf/core: Fix group leader use-after-free after sibling detach")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Revert "ALSA: aoa: Use guard() for mutex locks" [+ + +]
Author: Sasha Levin <[email protected]>
Date:   Tue Aug 25 15:50:06 2026 -0400

    Revert "ALSA: aoa: Use guard() for mutex locks"
    
    This reverts commit d956208576ad0dbed1d6145a797144c03e31e9eb.
    
    Commit d956208576ad0 ("ALSA: aoa: Use guard() for mutex locks", upstream
    commit 1cb6ecbb37200) was picked up for 5.15.y only as a Stable-dep-of
    for 5ed060d54915 ("ALSA: aoa: i2sbus: clear stale prepared state").
    
    5.15.y still builds with '-std=gnu89' and '-Wdeclaration-after-statement',
    so the guard() and scoped_guard() helpers cannot be used here at all: the
    CLASS() declaration that guard() expands to is a declaration in the middle
    of a block, and scoped_guard() declares its variable in a for() init
    clause.  With CONFIG_WERROR=y (allmodconfig) this breaks the powerpc
    build:
    
      sound/aoa/core/gpio-pmf.c: In function 'pmf_set_notify':
      ./include/linux/cleanup.h:86:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
      sound/aoa/codecs/tas.c: In function 'tas_switch_clock':
      ./include/linux/cleanup.h:112:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
    
    Revert the cleanup so that sound/aoa goes back to explicit
    mutex_lock()/mutex_unlock() pairs.  As it was a pure refactoring with no
    behaviour change, nothing is lost.
    
    The two fixes that were queued on top of it are kept and re-adapted to
    the explicit locking in sound/aoa/soundbus/i2sbus/pcm.c:
    
     - 2c38191380740 ("ALSA: aoa: i2sbus: clear stale prepared state"):
       i2sbus_pcm_clear_active() now takes and drops i2sdev->lock explicitly,
       and i2sbus_pcm_prepare() sets pi->active only on the success paths,
       which are now reached via 'goto out_unlock' with result == 0.
     - d17c282163b70 ("ALSA: aoa: Skip devices with no codecs in
       i2sbus_resume()"): the list_first_entry() conversion in
       i2sbus_pcm_prepare() is kept.
    
    Signed-off-by: Sasha Levin <[email protected]>

 
rndis_host: add overflow check in rndis_rx_fixup() [+ + +]
Author: Griffin Kroah-Hartman <[email protected]>
Date:   Thu Jul 9 14:24:01 2026 +0200

    rndis_host: add overflow check in rndis_rx_fixup()
    
    commit 965a251f23ff69cfb4486974d4532e9bb551c7fc upstream.
    
    Add an overflow check to ensure that data_offset + data_len + 8 does not
    wrap, which would enable an OOB read of the USB data buffer.
    
    Cc: Andrew Lunn <[email protected]>
    Cc: Shaoxu Liu <[email protected]>
    Signed-off-by: Griffin Kroah-Hartman <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/2026070900-denim-brook-52d4@gregkh
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
s390/vfio_ccw: Cancel existing workqueues [+ + +]
Author: Eric Farman <[email protected]>
Date:   Sun Aug 23 20:12:18 2026 -0400

    s390/vfio_ccw: Cancel existing workqueues
    
    [ Upstream commit 79c60b2c61105368dcc8444eb45847e21734f7c4 ]
    
    The initialization of the io_work and crw_work workqueues begs the
    question of whether they should be un-initialized. Add the corresponding
    cleanup tags in _release_dev to ensure work isn't dispatched after
    the private struct is free'd.
    
    Suggested-by: Matthew Rosato <[email protected]>
    Fixes: e5f84dbaea59 ("vfio: ccw: return I/O results asynchronously")
    Fixes: 3f02cb2fd9d2 ("vfio-ccw: Wire up the CRW irq and CRW region")
    Cc: [email protected]
    Reviewed-by: Matthew Rosato <[email protected]>
    Signed-off-by: Eric Farman <[email protected]>
    Signed-off-by: Christian Borntraeger <[email protected]>
    [ dropped the `vfio_ccw_mdev_release_dev()` hunk since 5.15 lacks the embedded `vfio_device` release callback, keeping only the `close_device()` drain ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

s390/vfio_ccw: Ensure index for read/write regions are within range [+ + +]
Author: Eric Farman <[email protected]>
Date:   Mon Aug 24 10:05:52 2026 -0400

    s390/vfio_ccw: Ensure index for read/write regions are within range
    
    [ Upstream commit 9f5f9a78fedc45bc29d6a0a64e3a3472361afae5 ]
    
    The introduction of the capability chain rightly clamped the
    region indexes to the range of the capabilities itself, but
    neglected to do so for the existing read/write regions which
    should also be enforced.
    
    Fixes: db8e5d17ac03 ("vfio-ccw: add capabilities chain")
    Cc: [email protected]
    Cc: Cornelia Huck <[email protected]>
    Reviewed-by: Matthew Rosato <[email protected]>
    Signed-off-by: Eric Farman <[email protected]>
    Signed-off-by: Christian Borntraeger <[email protected]>
    Stable-dep-of: 16b0798024c0 ("s390/vfio_ccw: Implement a crw lock")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

s390/vfio_ccw: Free all memory if cp_init() fails [+ + +]
Author: Eric Farman <[email protected]>
Date:   Tue Jul 28 05:30:13 2026 +0200

    s390/vfio_ccw: Free all memory if cp_init() fails
    
    [ Upstream commit 74186c2968f8f756ac3226b545b598457c910c75 ]
    
    The routine cp_free() is called to unpin/free any memory once an I/O
    is completed successfully, or if cp_prefetch() fails. But if cp_init()
    fails, and cp->initialized is not enabled, the same routine cannot be
    used to free all the memory.
    
    An attempt to address this exists in ccwchain_handle_ccw(), where a
    single call to ccwchain_free() is made for the currently-processed
    CCW segment. But this will leak other segments (created as a result
    of a Transfer in Channel) that had been allocated as part of the same
    channel program.
    
    Address this by performing the cleanup outside of the recursive
    ccwchain_handle_ccw()/ccwchain_loop_tic() logic.
    
    Fixes: 8b515be512a2 ("vfio-ccw: Fix memory leak and don't call cp_free in cp_init")
    Cc: [email protected]
    Reviewed-by: Farhan Ali <[email protected]>
    Reviewed-by: Matthew Rosato <[email protected]>
    Signed-off-by: Eric Farman <[email protected]>
    Signed-off-by: Christian Borntraeger <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

s390/vfio_ccw: Implement a crw lock [+ + +]
Author: Eric Farman <[email protected]>
Date:   Mon Aug 24 10:05:55 2026 -0400

    s390/vfio_ccw: Implement a crw lock
    
    [ Upstream commit 16b0798024c0e9117e395829ddbbe70981c79d9c ]
    
    Unlike the channel_program struct, which covers synchronous I/O
    submissions and asynchronous interrupts, the CRW region relies
    exclusively on asynchronous events coming from hardware.
    
    Implement a lock to manage the list of those payloads, to ensure
    they are read cohesively.
    
    Fixes: 3f02cb2fd9d2 ("vfio-ccw: Wire up the CRW irq and CRW region")
    Cc: [email protected]
    Reviewed-by: Matthew Rosato <[email protected]>
    Reviewed-by: Farhan Ali <[email protected]>
    Signed-off-by: Eric Farman <[email protected]>
    Signed-off-by: Christian Borntraeger <[email protected]>
    [ relocated crw_lock init and CRW drain from vfio_ccw_ops.c's mdev_init_dev()/mdev_release_dev() into vfio_ccw_drv.c's sch_probe()/sch_remove(), and kept the two-argument eventfd_signal() calls ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

s390/vfio_ccw: Selectively expand io_mutex [+ + +]
Author: Eric Farman <[email protected]>
Date:   Mon Aug 24 10:05:54 2026 -0400

    s390/vfio_ccw: Selectively expand io_mutex
    
    [ Upstream commit 34f4feff3e90bd09308fad0974e97113b23b812a ]
    
    The io_mutex was defined to serialize the io_regions, but then has
    also sort of been associated with the I/O themselves because of
    the close relationship they share.
    
    With the handful of races that are possible, the choices are either to:
     A) expand the scope of io_mutex to close these remaining windows, or
     B) reduce the scope of io_mutex to just io_region, and introduce a new
        lock mechanism for the remaining I/O resources
    
    This patch implements A, since B brings with it a lot more interactions
    that would need to be tracked and kept in a correct hierarchy. It also
    takes advantage of the workqueue element for cp_free() that now gets
    called out of fsm_notoper(), which could be invoked out of an interrupt
    context and thus cannot acquire a mutex itself.
    
    Fixes: 4f76617378ee ("vfio-ccw: protect the I/O region")
    Cc: [email protected]
    Signed-off-by: Eric Farman <[email protected]>
    Reviewed-by: Matthew Rosato <[email protected]>
    Signed-off-by: Christian Borntraeger <[email protected]>
    Stable-dep-of: 16b0798024c0 ("s390/vfio_ccw: Implement a crw lock")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
serial: amba-pl011: synchronize DMA teardown [+ + +]
Author: Fan Wu <[email protected]>
Date:   Fri Aug 21 07:00:11 2026 -0400

    serial: amba-pl011: synchronize DMA teardown
    
    [ Upstream commit 440915499231e9db1c361aa45bb702e8fd3b4a32 ]
    
    dmaengine_terminate_all() does not wait for a running callback, so the TX
    callback can still touch the TX buffer after it is freed. The RX poll
    timer reads the RX buffers without the port lock.
    
    Switch to dmaengine_terminate_sync() and delete the RX timer before
    freeing the buffers.
    
    Fixes: ead76f329f77 ("ARM: 6763/1: pl011: add optional RX DMA to PL011 v2")
    Cc: stable <[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]>
    [ changed upstream's `timer_delete_sync()` deletion to match this tree's `del_timer_sync()` spelling at the old call site ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
xfrm: fix sk_dst_cache double-free in xfrm_user_policy() [+ + +]
Author: Xiang Mei (Microsoft) <[email protected]>
Date:   Sat Jun 27 02:40:23 2026 +0000

    xfrm: fix sk_dst_cache double-free in xfrm_user_policy()
    
    [ Upstream commit c283e9ada7fcb7dd4b10592623086b2e6d2f9925 ]
    
    xfrm_user_policy() clears the socket dst cache with __sk_dst_reset(),
    i.e. the non-atomic __sk_dst_set(sk, NULL): it reads sk_dst_cache with
    rcu_dereference_protected(), stores NULL and dst_release()s the old dst.
    That is only safe if no other thread modifies sk_dst_cache concurrently.
    
    For a connected UDP socket that does not hold: the transmit fast path
    (udp_sendmsg -> sk_dst_check -> sk_dst_reset) resets the cache locklessly
    with an atomic xchg(). A per-socket policy change racing a send can make
    both sides observe the same old dst and each dst_release() it, dropping
    the socket's single reference twice and freeing the xfrm_dst bundle while
    it is still referenced:
    
      BUG: KASAN: slab-use-after-free in dst_release
      Write of size 4 at addr ffff88801897b6c0 by task exploit/155
      Call Trace:
       ...
       dst_release (... ./include/linux/rcuref.h:109)
       xfrm_user_policy (./include/net/sock.h:2239 ./include/net/sock.h:2256 net/xfrm/xfrm_state.c:3053)
       do_ip_setsockopt (net/ipv4/ip_sockglue.c:1347)
       ip_setsockopt (net/ipv4/ip_sockglue.c:1417)
       do_sock_setsockopt (net/socket.c:2368)
       __sys_setsockopt (net/socket.c:2393)
       __x64_sys_setsockopt (net/socket.c:2396)
       do_syscall_64 (arch/x86/entry/syscall_64.c:94)
       entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
    
    Reachable by an unprivileged user via a user+network namespace.
    
    Use the atomic sk_dst_reset() so the cache is cleared and released with a
    single xchg(): whichever side wins releases the dst once, the other sees
    NULL and does nothing. Behaviour is otherwise unchanged.
    
    Fixes: 2b06cdf3e688 ("xfrm: Clear sk_dst_cache when applying per-socket policy.")
    Fixes: be8f8284cd89 ("net: xfrm: allow clearing socket xfrm policies.")
    Reported-by: [email protected]
    Signed-off-by: Xiang Mei (Microsoft) <[email protected]>
    Signed-off-by: Steffen Klassert <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
xfs: bounds-check buffer log item's dirty bitmap [+ + +]
Author: Ibrahim Hashimov <[email protected]>
Date:   Mon Aug 24 07:15:21 2026 -0400

    xfs: bounds-check buffer log item's dirty bitmap
    
    [ Upstream commit 813f8136a2ce1fee266d02a7df73db6e8a541604 ]
    
    xlog_recover_do_reg_buffer() replays each dirty region described by a
    buffer log item's bitmap into the buffer read for that item:
    
            memcpy(xfs_buf_offset(bp, (uint)bit << XFS_BLF_SHIFT),
                    item->ri_buf[i].iov_base,
                    nbits << XFS_BLF_SHIFT);
    
    The destination offset (bit/nbits, from the logged dirty bitmap) and the
    buffer size (from the logged blf_len) are both attacker-controlled and
    otherwise unrelated, yet the only thing bounding the copy is an ASSERT(),
    which compiles away on production kernels. A crafted image logging a
    small blf_len together with a bitmap bit past the end of that buffer
    drives the memcpy() past the buffer's allocation, corrupting adjacent
    kernel heap during mount-time log recovery. This is reachable by anyone
    who can get a crafted image mounted -- the malicious-filesystem threat
    model XFS already guards against elsewhere.
    
    Turn the ASSERT() into a real XFS_IS_CORRUPT() check that aborts recovery
    of the buffer with -EFSCORRUPTED, consistent with the validate-and-fail
    idiom already used in xlog_recover_do_inode_buffer() and
    xfs_dquot_item_recover.c. xlog_recover_do_reg_buffer() therefore becomes
    STATIC int and its three callers propagate the error.
    
    Found and confirmed with KASAN on a CONFIG_XFS_DEBUG=n build: the crafted
    image trips a slab-out-of-bounds write before this change and fails
    recovery cleanly with -EFSCORRUPTED after it.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Signed-off-by: Ibrahim Hashimov <[email protected]>
    Reviewed-by: "Darrick J. Wong" <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    [ adapted `ri_buf[]` field names `iov_base`/`iov_len` to 5.15's `i_addr`/`i_len` and dropped the hunks for the absent `xlog_recover_do_primary_sb_buffer()` and primary-SB branch while keeping the `error = 0` reset ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xfs: validate attr entry pointer before field access [+ + +]
Author: Hongling Zeng <[email protected]>
Date:   Tue Jul 28 15:43:40 2026 +0800

    xfs: validate attr entry pointer before field access
    
    commit b7eea80be25f3334f131d52982b3131aba77b97d upstream.
    
    xfs_attr3_leaf_verify_entry() accesses lentry/rentry fields (namelen,
    valuelen) before checking if the entry pointer itself is within bounds.
    If nameidx is crafted to point near the end of the buffer, these field
    accesses can read out-of-bounds before the bounds check at
    name_end > buf_end is performed.
    
    Add explicit bounds checks for entry pointers before accessing their
    fields. Use offsetof() to check that the start of the flexible array
    member (nameval/name) is within bounds, which ensures all preceding
    fields are safe to access.
    
    Fixes: c84760659dcf2 ("xfs: check attribute leaf block structure")
    Cc: <[email protected]> # v5.5
    Signed-off-by: Hongling Zeng <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>