Changelog in Linux kernel 6.12.106

 
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]>

ALSA: scarlett2: Use a private URB for the notification endpoint [+ + +]
Author: Geoffrey D. Bennett <[email protected]>
Date:   Mon Aug 10 03:36:11 2026 +0930

    ALSA: scarlett2: Use a private URB for the notification endpoint
    
    commit cd17d6ff7b7d2b1dd9bcc80ae7b4a83773f918c6 upstream.
    
    scarlett2_init_notify() used mixer->urb, which
    snd_usb_mixer_status_create() allocates for the UAC2 status interrupt
    endpoint and mixer.c manages. On a device with that endpoint, the
    "already in use" check fires on the status URB and returns 0 for
    success without doing anything. No notification URB is submitted, and
    cmd_done is left zeroed because it is initialised past that check and
    nowhere else. scarlett2_usb_init() then issues SCARLETT2_USB_INIT_1
    and wait_for_completion_timeout() would crash adding to the zeroed
    wait.head.
    
    Use a separate URB in scarlett2_data, as done for FCP, and initialise
    cmd_done in scarlett2_init_private(). mixer.c was also freeing the URB
    in snd_usb_mixer_free() and resubmitting it in
    snd_usb_mixer_activate(), so scarlett2 must now do both: add
    scarlett2_cleanup_urb(), called from private_free and private_suspend,
    and a private_resume callback to re-establish the URB after resume.
    scarlett2_init_notify() is reached from there, and the URB kill path
    in scarlett2_notify() completes cmd_done, leaving a stale count that
    would satisfy the next command's wait before the device ACKs. Use
    reinit_completion() to clear it.
    
    Also free the URB if the transfer buffer allocation fails, and both if
    usb_submit_urb() fails. Move scarlett2_init_notify() up next to
    scarlett2_cleanup_urb() so scarlett2_init_private() can reference it
    without a forward declaration.
    
    Fixes: 1b65088958ca ("ALSA: scarlett2: Implement handling of the ACK notification")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Geoffrey D. Bennett <[email protected]>
    Signed-off-by: Takashi Iwai <[email protected]>
    Link: https://patch.msgid.link/[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 17:55:32 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: hci_aml: validate firmware segment lengths [+ + +]
Author: Laxman Acharya Padhya <[email protected]>
Date:   Thu Jul 30 18:05:28 2026 +0545

    Bluetooth: hci_aml: validate firmware segment lengths
    
    commit 2bf6b9baca9372ea51b6d0f2820dc9bf29a83ef4 upstream.
    
    aml_download_firmware() reads two lengths from the firmware header and
    uses them to build pointers before checking that the header and segment
    data are present. A truncated or inconsistent firmware image can make
    the driver read past firmware->data while constructing TCI commands.
    
    Reject images shorter than the header and ensure that the ICCM and DCCM
    ranges fit within the loaded firmware before downloading either segment.
    
    Fixes: 37bac77e4649 ("Bluetooth: hci_uart: Add support for Amlogic HCI UART")
    Cc: [email protected]
    Signed-off-by: Laxman Acharya Padhya <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: hci_event: fix LE list UAF on reset [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Thu Jul 30 16:32:02 2026 +0800

    Bluetooth: hci_event: fix LE list UAF on reset
    
    commit 33af47e847fe4a28b109673affb5874015d54f5a upstream.
    
    hci_cc_reset() clears the LE accept and resolving lists without taking
    hdev->lock. Other command-complete handlers serialize updates to these
    lists with that lock, and the debugfs readers hold it while walking them.
    
    This permits the reset completion and a debugfs read to interleave as
    follows:
    
      hci_rx_work                 debugfs reader
      -----------                 --------------
                                  lock hdev->lock
                                  fetch current entry
      list_del(entry)
      kfree(entry)
                                  read entry fields
    
    The reader then dereferences a freed list entry and may follow its stale
    next pointer.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in white_list_show+0x15f/0x180
      Read of size 1 at addr ffff8881015dab16 by task poc/95
    
      Call Trace:
       white_list_show+0x15f/0x180
       seq_read_iter+0x3ff/0x1190
       seq_read+0x267/0x3d0
       vfs_read+0x177/0xa20
       ksys_read+0xf7/0x1c0
    
      Allocated by task 91:
       hci_bdaddr_list_add+0x1a6/0x3a0
       hci_cc_le_add_to_accept_list+0xab/0x140
       hci_cmd_complete_evt+0x26c/0x9a0
       hci_event_packet+0x454/0xb20
       hci_rx_work+0x293/0x730
    
      Freed by task 90:
       kfree+0x131/0x3c0
       hci_bdaddr_list_clear+0xd8/0x160
       hci_cc_reset+0x28a/0x370
       hci_cmd_complete_evt+0x26c/0x9a0
       hci_event_packet+0x454/0xb20
       hci_rx_work+0x293/0x730
    
    Take hdev->lock around both list clears. This matches the existing
    mutation and traversal locking convention.
    
    Fixes: a4d5504d5c39 ("Bluetooth: Clear LE white list when resetting controller")
    Fixes: cfdb0c2d095a ("Bluetooth: Store Resolv list size")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: hci_event: validate LE Set CIG Parameters response [+ + +]
Author: Laxman Acharya Padhya <[email protected]>
Date:   Sat Aug 1 23:54:52 2026 +0545

    Bluetooth: hci_event: validate LE Set CIG Parameters response
    
    commit 0acd4eeb4b225b9bebbf9ef96cc10cdd79b94899 upstream.
    
    The Command Complete dispatch validates only the fixed part of the LE Set
    CIG Parameters response. After that part is pulled from the skb,
    hci_cc_le_set_cig_params() trusts num_handles and reads each entry in the
    trailing handle array.
    
    Matching num_handles against the command's num_cis does not guarantee
    that the response contains the advertised handles. A truncated response
    from a malfunctioning controller can therefore make the handler read
    beyond the skb data.
    
    Validate that the remaining skb data contains all advertised handles.
    Include this in the existing response validation so malformed responses
    also follow the established CIG failure handling.
    
    Fixes: 26afbd826ee3 ("Bluetooth: Add initial implementation of CIS connections")
    Cc: [email protected]
    Signed-off-by: Laxman Acharya Padhya <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: ISO: do not force BT_LISTEN after a failed BIG sync [+ + +]
Author: Ali Ahmet Memis <[email protected]>
Date:   Fri Aug 7 00:59:55 2026 +0000

    Bluetooth: ISO: do not force BT_LISTEN after a failed BIG sync
    
    commit 9838a80096ba472d5e03057136a112631aabae6e upstream.
    
    iso_sock_recvmsg() handles the deferred setup of a broadcast sink by
    dropping the socket lock, calling iso_conn_big_sync() and taking the
    lock again:
    
            release_sock(sk);
            iso_conn_big_sync(sk);
            lock_sock(sk);
    
            sk->sk_state = BT_LISTEN;
    
    The state is written unconditionally, but iso_conn_big_sync() returns
    void and has paths that do nothing at all: hci_get_route() may fail, and
    after re-acquiring the socket lock the connection may already be gone,
    in which case it bails out without ever issuing an LE BIG Create Sync.
    
    While the lock is dropped the connection can be torn down, for example
    when the controller reports HCI_EV_LE_PA_SYNC_LOST:
    
            hci_le_pa_sync_lost_evt()
              hci_disconn_cfm() -> iso_disconn_cfm() -> iso_conn_del()
                iso_chan_del()
                  iso_pi(sk)->conn = NULL
                  sk->sk_state = BT_CLOSED
                  sock_set_flag(sk, SOCK_ZAPPED)
    
    iso_conn_big_sync() then finds conn == NULL and returns, but the caller
    still overwrites the BT_CLOSED that iso_chan_del() has just set. The
    socket ends up marked BT_LISTEN with no connection, so recvmsg() reports
    success for a setup that never happened and a later accept() waits for
    BIS connections that can never arrive instead of failing.
    
    A concurrent shutdown() reaches the same write by another route:
    __iso_sock_close() takes the BT_CONNECT2 PA sync path to
    iso_sock_disconn(), which sets BT_DISCONN but leaves conn and
    conn->hcon in place, so iso_conn_big_sync() succeeds and BT_LISTEN is
    written over BT_DISCONN. Both the BT_CONNECT2 and the BT_CONNECTED case
    write the state the same way.
    
    Let iso_conn_big_sync() report whether the BIG sync was started, and
    only move the socket to BT_LISTEN when it was and when the state has not
    changed while the lock was dropped, mirroring what the BT_CONNECT case
    of the same switch already does with iso_connect_cis(). Both conditions
    are needed, the error alone does not cover the shutdown() race.
    
    This corrupts the socket state machine only, it is not a memory safety
    issue. KASAN and lockdep stayed quiet in all of the runs below.
    
    Reproduced with an emulated controller over /dev/vhci on a KASAN +
    PROVE_LOCKING kernel. A PA sync broadcast sink socket is driven to
    BT_CONNECT2 and recvmsg() on it is raced against teardown, with a debug
    delay inside the lock-dropped section to widen the window:
    
     - HCI_EV_LE_PA_SYNC_LOST injected: 64 of 64 rounds left the socket in
       BT_LISTEN with the connection gone, recvmsg() returned 0 and accept()
       on that fd returned EAGAIN, which iso_sock_accept() can only do while
       the socket is BT_LISTEN. With this patch, 0 of 64, recvmsg() returns
       an error and accept() returns EBADFD.
    
     - shutdown() instead of a controller event: 24 of 32 rounds wedged in
       BT_LISTEN, 0 of 32 with this patch. With only the error check in
       place and a short window, one round still wedged while recvmsg()
       returned 0, which is the case the state re-check covers.
    
    An unraced control round behaves the same before and after: recvmsg()
    returns 0, the socket reaches BT_LISTEN and an LE BIG Create Sync is
    issued.
    
    Fixes: 7a17308c1788 ("Bluetooth: iso: Fix circular lock in iso_conn_big_sync")
    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]>

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]>

 
drm/xe: Fix DPT allocation paths. [+ + +]
Author: Maarten Lankhorst <[email protected]>
Date:   Mon Aug 24 12:13:41 2026 -0400

    drm/xe: Fix DPT allocation paths.
    
    [ Upstream commit fc648757908304aedbad74f74bf58192aec383db ]
    
    Remove the fallback for VRAM to system memory, I tested it and that
    doesn't work at all, only a black screen with pipe fault errors were
    observed.
    
    On systems with media GT, extra latency is added when accessing stolen
    memory when the GT is in MC6. Since we additionally aren't counting how
    much memory is used for stolen and we could in theory fill up the
    entire stolen area with DPT's, avoid using stolen and only use the
    default memory region.
    
    Using stolen may also result in random system hangs under load.
    
    Link: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/7513
    Fixes: 775d0adc01a5 ("drm/xe/fbdev: Limit the usage of stolen for LNL+")
    Cc: <[email protected]> # v6.12+
    Reviewed-by: Matthew Auld <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Maarten Lankhorst <[email protected]>
    Acked-by: Matthew Brost <[email protected]> #teams
    (cherry picked from commit a196406a3831291598fe8e73245914f7acffdfe0)
    Signed-off-by: Thomas Hellström <[email protected]>
    [ Replaced `xe_bo_create_pin_map_at_novm()` with `xe_bo_create_pin_map()`, dropped the alignment argument, and renamed `XE_BO_FLAG_FORCE_WC` to `XE_BO_FLAG_SCANOUT`. ]
    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: propagate errors from fast commit range replay [+ + +]
Author: Guanghui Yang <[email protected]>
Date:   Wed Jul 8 08:12:04 2026 +0000

    ext4: propagate errors from fast commit range replay
    
    commit d8b8dd3530bf41e14b118702cdaf9de64bb96885 upstream.
    
    ext4_fc_replay() stops replaying fast commit tags only when a tag
    handler returns a negative error. However, ext4_fc_replay_add_range()
    and ext4_fc_replay_del_range() currently return 0 from their common
    exit paths even after internal failures.
    
    This hides errors from ext4_fc_record_modified_inode(),
    ext4_map_blocks(), ext4_find_extent(), ext4_ext_insert_extent(),
    ext4_ext_replay_update_ex(), and ext4_ext_remove_space(). As a result,
    a failed ADD_RANGE or DEL_RANGE replay can be treated as successful and
    the replay code may continue with subsequent fast commit tags.
    
    This is particularly problematic for DEL_RANGE because it may already
    have marked blocks as free before ext4_ext_remove_space() fails. If the
    error is swallowed, replay may continue from a partially applied range
    operation.
    
    Return the saved error from the common exit paths and make the
    ERR_PTR() cases in ADD_RANGE store PTR_ERR() before jumping to out.
    
    Fixes: 8016e29f4362 ("ext4: fast commit recovery path")
    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]>

 
gve: fix zero-length skb frag with header-split [+ + +]
Author: Jordan Rhee <[email protected]>
Date:   Fri Aug 7 22:43:14 2026 +0000

    gve: fix zero-length skb frag with header-split
    
    commit 6bf14575c65569dcded90ef78afb8a6d57323f04 upstream.
    
    When header split is enabled and a header-only packet is
    received such as a pure TCP ACK, GVE will indicate an
    RX SKB with a zero-length fragment. If this SKB is then
    hairpinned and sent back out, the GVE TX path will emit
    a zero-length descriptor. Hardware considers this
    an illegal descriptor and stops the queue, causing a
    TX timeout and interface reset.
    
    Fix it by not adding the zero-length skb frag.
    
    Cc: [email protected]
    Fixes: 5e37d8254e7f ("gve: Add header split data path")
    Suggested-by: Praveen Kaligineedi <[email protected]>
    Co-developed-by: Ziwei Xiao <[email protected]>
    Signed-off-by: Ziwei Xiao <[email protected]>
    Signed-off-by: Jordan Rhee <[email protected]>
    Signed-off-by: Harshitha Ramamurthy <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Harshitha Ramamurthy <[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: fix battery reporting for Bluetooth Magic Trackpad USB-C [+ + +]
Author: Andrei Fed <[email protected]>
Date:   Mon Jul 6 19:55:07 2026 +0200

    HID: magicmouse: fix battery reporting for Bluetooth Magic Trackpad USB-C
    
    commit a1556b48efc157fdda07b52ecc56c7bd1e1786f0 upstream.
    
    The Apple Magic Trackpad 2 (USB-C) reports a wildly wrong battery
    capacity over Bluetooth, for example a constant 4% for a pack that is
    actually at 74%.
    
    The device's battery input report (0x90) is laid out as
    [report-id][status][charge]. hid-input's synchronous capacity query,
    hidinput_query_battery_capacity(), assumes the common
    [report-id][capacity] layout and returns buf[1], which for this device
    is the status byte rather than the charge (buf[2]).
    
    magicmouse_fetch_battery(), which requests the battery report through
    hid_hw_request() so the reply is decoded via the report descriptor at
    the correct field offset, is gated to the USB models and never runs
    over Bluetooth. The device does not push battery reports on its own
    either, except a single one at connect time, which is delivered while
    probe holds driver_input_lock and is silently dropped. All userspace
    reads therefore go through the misparsing query, and the device is
    stuck reporting its status byte as the capacity.
    
    Enabling the fetch for Bluetooth is not sufficient on its own: user
    space reacts to the power_supply registration immediately, so a query
    is typically already in flight when the fetch reply is parsed.
    hidinput_get_battery_property() stores the query result and marks the
    battery as queried without rechecking whether a report arrived while
    it was waiting, clobbering the just-reported correct value with the
    misparsed one.
    
    Fix this by adding HID_BATTERY_QUIRK_AVOID_QUERY for the Bluetooth
    Magic Trackpad USB-C so the misparsing query path is never used, and
    by fetching the battery at the end of probe for this device. hidp has
    no asynchronous request() callback, so the fetch is serviced
    synchronously via __hid_request() while probe still holds
    driver_input_lock; call hid_device_io_start() first so the reply is
    processed instead of being discarded.
    
    Tested with a Magic Trackpad USB-C (004c:0324) over Bluetooth on
    6.18.37: the reported capacity now matches the device (verified against
    a raw GET_REPORT of report 0x90) and updates on reconnect.
    
    Fixes: 87a2f10395c8 ("HID: magicmouse: Apple Magic Trackpad 2 USB-C driver support")
    Cc: [email protected]
    Signed-off-by: Andrei Fed <[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: magicmouse: re-enable multitouch after reset-resume [+ + +]
Author: Christopher Kodama <[email protected]>
Date:   Sat Jul 25 16:34:46 2026 -0400

    HID: magicmouse: re-enable multitouch after reset-resume
    
    commit 4253fe22b137c4ee68f36b707fdb1b44b191edc4 upstream.
    
    When the Apple Magic Trackpad 2 (USB) is reset across a power transition
    (e.g. resume from hibernation) it drops out of multitouch mode: it keeps
    sending report ID 0x02 on its HID_TYPE_USBMOUSE interface, but the packet
    shrinks from 21 to 8 bytes and the trackpad2 handler drops it (size < 12).
    Clicks still work but pointer motion is lost until the device is re-plugged
    or the driver reloaded.
    
    Re-enable multitouch from .reset_resume via the workqueue.  Only
    .reset_resume is needed; suspend-to-idle keeps the device powered and
    retains multitouch.
    
    Fixes: 87a2f10395c8 ("HID: magicmouse: Apple Magic Trackpad 2 USB-C driver support")
    Cc: [email protected]
    Assisted-by: Claude-Code:claude-opus-4-8
    Signed-off-by: Christopher Kodama <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: nintendo: fix out-of-bounds read in joycon_ctlr_read_handler() [+ + +]
Author: Ibrahim Hashimov <[email protected]>
Date:   Wed Jul 15 13:52:53 2026 +0200

    HID: nintendo: fix out-of-bounds read in joycon_ctlr_read_handler()
    
    commit 27b376b945c0aac46fcdfcc950b14a85b874b557 upstream.
    
    joycon_ctlr_read_handler() casts an incoming HID input report to
    struct joycon_input_report and parses it, guarding the cast only with a
    12-byte length check:
    
            if (size >= 12) /* make sure it contains the input report */
                    joycon_parse_report(ctlr, (struct joycon_input_report *)data);
    
    struct joycon_input_report is 49 bytes: a 13-byte header followed by a
    union whose IMU arm is 36 bytes. For an IMU report joycon_parse_report()
    -> joycon_parse_imu_report() walks that union (struct offsets 13..48),
    so a report of exactly 12 bytes with data[0] == JC_INPUT_IMU_DATA passes
    the guard yet is read up to 37 bytes past its declared length. The
    over-read bytes are decoded into accelerometer/gyroscope values and
    forwarded to userspace through the "(IMU)" input device, leaking
    driver-internal memory. data[0] and size are fully controlled by a
    malicious or spoofed Joy-Con/Pro Controller.
    
    Receive buffers are sized to the maximum report length, so this is an
    over-read within the allocation rather than a slab OOB, but the decoded
    bytes still reach userspace.
    
    The sibling subcmd path in joycon_ctlr_handle_event() already bounds the
    same cast correctly:
    
            if (size < sizeof(struct joycon_input_report) ||
                data[0] != JC_INPUT_SUBCMD_REPLY)
                    break;
    
    Use the same sizeof(struct joycon_input_report) bound here.
    
    Fixes: 2af16c1f846b ("HID: nintendo: add nintendo switch controller driver")
    Cc: [email protected]
    Signed-off-by: Ibrahim Hashimov <[email protected]>
    Assisted-by: AuditCode-AI:2026.07
    Reviewed-by: Silvan Jegen <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: nintendo: register input device after capabilities are set [+ + +]
Author: Jiangshan Yi <[email protected]>
Date:   Thu Jul 30 18:15:06 2026 +0800

    HID: nintendo: register input device after capabilities are set
    
    commit d723bc1fe2e72b9252234e94c11af644ec477bf7 upstream.
    
    input_register_device() exposes the device to userspace immediately.
    In joycon_input_create() it was called before joycon_config_rumble()
    configures the FF_RUMBLE capability and the memless force-feedback
    device, so a concurrent EVIOCSFF could dereference a NULL dev->ff.
    
    Registering early also means the initial udev event lacks button and
    axis information, which can make input managers ignore the device.
    
    Move input_register_device() to the end of joycon_input_create(), after
    all capabilities, the IMU input device and the force-feedback callbacks
    have been configured.
    
    Fixes: 2af16c1f846b ("HID: nintendo: add nintendo switch controller driver")
    Reported-by: [email protected]
    Closes: https://sashiko.dev/#/patchset/[email protected]?part=1
    Cc: [email protected]
    Signed-off-by: Jiangshan Yi <[email protected]>
    Link: https://sashiko.dev/#/patchset/[email protected]?part=1
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

HID: nintendo: stop device IO before hid_hw_stop on probe failure [+ + +]
Author: Jiangshan Yi <[email protected]>
Date:   Thu Jul 30 11:19:27 2026 +0800

    HID: nintendo: stop device IO before hid_hw_stop on probe failure
    
    commit 1f74d3bff6fe04a64e02ab3661d2e0d554565aa6 upstream.
    
    nintendo_hid_probe() calls hid_device_io_start() before joycon_init()
    and joycon_leds_create().  If either fails, the error path jumps to
    err_close which calls hid_hw_close()/hid_hw_stop() without first calling
    hid_device_io_stop().
    
    hid_hw_stop() does not stop device IO, so hid_input_report() may still
    run and access driver data that is being torn down, resulting in a
    use-after-free.
    
    Add an err_io_stop label that calls hid_device_io_stop() before
    hid_hw_close(), and point the two post-io_start error paths at it.
    
    Fixes: 2af16c1f846b ("HID: nintendo: add nintendo switch controller driver")
    Cc: [email protected]
    Signed-off-by: Jiangshan Yi <[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]>

 
hwmon: (ltc4286) Fix symbol namespace of MODULE_IMPORT_NS() [+ + +]
Author: Nobuhiro Iwamatsu <[email protected]>
Date:   Mon Aug 24 10:50:22 2026 +0900

    hwmon: (ltc4286) Fix symbol namespace of MODULE_IMPORT_NS()
    
    In 6.12.y, the namespace specified in MODULE_IMPORT_NS() does not require
    a string. This removes the quotes from the namespace name.
    
    Fixes: 7fd4a5682c78 ("hwmon: (ltc4286) Add missing MODULE_IMPORT_NS("PMBUS")")
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
inet: frags: add inet_frag_putn() helper [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Fri Aug 21 10:49:22 2026 -0400

    inet: frags: add inet_frag_putn() helper
    
    [ Upstream commit ae2d90355aa5592b0e99c8bbb4c3fa1d8e205f1b ]
    
    inet_frag_putn() can release multiple references
    in one step.
    
    Use it in inet_frags_free_cb().
    
    Replace inet_frag_put(X) with inet_frag_putn(X, 1)
    
    Signed-off-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

inet: frags: change inet_frag_kill() to defer refcount updates [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Fri Aug 21 10:49:24 2026 -0400

    inet: frags: change inet_frag_kill() to defer refcount updates
    
    [ Upstream commit eb0dfc0ef195a04e519b15d73cf25d8c25ee8df7 ]
    
    In the following patch, we no longer assume inet_frag_kill()
    callers own a reference.
    
    Consuming two refcounts from inet_frag_kill() would lead in UAF.
    
    Propagate the pointer to the refs that will be consumed later
    by the final inet_frag_putn() call.
    
    Signed-off-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <[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 10:49:26 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]>

inet: frags: save a pair of atomic operations in reassembly [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Fri Aug 21 10:49:25 2026 -0400

    inet: frags: save a pair of atomic operations in reassembly
    
    [ Upstream commit ca0359df45a55a9eb4d6dc09a481064abf78320f ]
    
    As mentioned in commit 648700f76b03 ("inet: frags:
    use rhashtables for reassembly units"):
    
      A followup patch will even remove the refcount hold/release
      left from prior implementation and save a couple of atomic
      operations.
    
    This patch implements this idea, seven years later.
    
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Jacob Keller <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    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:01:04 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:01:05 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]>

Input: byd - synchronize timer deletion before freeing private data [+ + +]
Author: Linmao Li <[email protected]>
Date:   Mon Jul 20 14:12:59 2026 +0800

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

 
ipv4: frags: remove ipq_put() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Fri Aug 21 10:49:23 2026 -0400

    ipv4: frags: remove ipq_put()
    
    [ Upstream commit a2fb987c0ecf0498cc17056339cb11d128c46ab7 ]
    
    Replace ipq_put() with inet_frag_putn()
    
    Signed-off-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[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]>

ipv4: start using dst_dev_rcu() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Thu Aug 28 19:58:23 2025 +0000

    ipv4: start using dst_dev_rcu()
    
    [ Upstream commit 6ad8de3cefdb6ffa6708b21c567df0dbf82c43a8 ]
    
    Change icmpv4_xrlim_allow(), ip_defrag() to prevent possible UAF.
    
    Change ipmr_prepare_xmit(), ipmr_queue_fwd_xmit(), ip_mr_output(),
    ipv4_neigh_lookup() to use lockdep enabled dst_dev_rcu().
    
    Fixes: 4a6ce2b6f2ec ("net: introduce a new function dst_dev_put()")
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: David Ahern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[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]>

 
kcov: fix data corruption and race conditions on PREEMPT_RT [+ + +]
Author: Tetsuo Handa <[email protected]>
Date:   Thu Jul 16 08:01:29 2026 +0900

    kcov: fix data corruption and race conditions on PREEMPT_RT
    
    commit 2eed77fdcb0cc48e8eccb2bcd4b7f2c6d650e84c upstream.
    
    syzbot is reporting KCOV state corruption on PREEMPT_RT kernels, for the
    temporary storage used for saving/restoring remote KCOV state is currently
    allocated as the per-CPU area.
    
    On PREEMPT_RT kernels, softirq handlers run as preemptible task threads
    (e.g., ksoftirqd). If a softirq context preempts a task running a remote
    KCOV session, it safely saves the task's state into the per-CPU area.
    However, if that softirq thread is subsequently preempted by a higher-
    priority softirq thread on the same CPU, the second softirq will overwrite
    the same per-CPU area, permanently destroying the original task's KCOV
    state.
    
    Fix this data corruption by moving the temporary storage from the per-CPU
    area to the per-thread area. Since each softirq thread now owns its own
    task context, nested softirq preemption no longer causes data overwrites.
    
    Note that while the temporary storage is now on a per-thread basis, the
    per-CPU kcov_percpu_data.lock must be retained, for we need to ensure that
    kcov_remote_start() and kcov_remote_stop() operate atomically without
    racing against asynchronous interrupts that manipulate the current task's
    KCOV state.
    
    It is likely that GFP_KERNEL allocation by vmalloc_node() in kcov_init()
    has already called panic() before returning NULL, for there will be no
    OOM-killable userspace processes when __init function of built-in module
    runs. But this patch also fixes crashing the kernel when vmalloc_node()
    in kcov_init() returned NULL, for kcov_init() left per-CPU irq_area == NULL
    but kcov_remote_start() depends on per-CPU irq_area != NULL, resulting in
    
      (1) doing vmalloc() in kcov_remote_start() despite !in_task() context
    
      (2) out-of-array-bounds access if (1) succeeded but
          kcov->remote_size < CONFIG_KCOV_IRQ_AREA_SIZE
    
      (3) always leak memory allocated by (1), eventually killing all
          OOM-killable userspace processes
    
    problems.
    
    Link: https://lore.kernel.org/[email protected]
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=3f51ad7ac3ae57a6fdcc
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=47cf95ca1f9dcca872c8
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=8a173e13208949931dc7
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=90984d3713722683112e
    Analyzed-by: AI Mode in Google Search (no mail address)
    Fixes: 5ff3b30ab57d ("kcov: collect coverage from interrupts")
    Signed-off-by: Tetsuo Handa <[email protected]>
    Reviewed-by: Alexander Potapenko <[email protected]>
    Cc: Alan Stern <[email protected]>
    Cc: Andrey Konovalov <[email protected]>
    Cc: Christoph Hellwig <[email protected]>
    Cc: Clark Williams <[email protected]>
    Cc: Dmitry Vyukov <[email protected]>
    Cc: Greg Kroah-Hartman <[email protected]>
    Cc: Marco Elver <[email protected]>
    Cc: Mark Brown <[email protected]>
    Cc: Roman Gushchin <[email protected]>
    Cc: Sebastian Andrzej Siewior <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
libceph: fix OOB read in decode_watchers() via missing bounds check [+ + +]
Author: Pavitra Jha <[email protected]>
Date:   Mon Aug 24 07:29:43 2026 -0400

    libceph: fix OOB read in decode_watchers() via missing bounds check
    
    [ Upstream commit 00ead17c7de137a692edee59f2772e6af687e8eb ]
    
    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 6.12.106 [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Thu Aug 27 14:32:09 2026 +0200

    Linux 6.12.106
    
    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: Pavel Machek (CIP) <[email protected]>
    Tested-by: Dominique Martinet <[email protected]>
    Tested-by: Salvatore Bonaccorso <[email protected]>
    Tested-by: Brett A C Sheffield <[email protected]>
    Tested-by: Miguel Ojeda <[email protected]>
    Tested-by: Peter Schneider <[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:   Mon Aug 24 17:59:59 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 to mptcp_pm_add_timer() in pm_netlink.c instead of pm.c and collapsed the adaptive backoff branch to `if (!retransmit) timeout = 0;` since the tree lacks exponential ADD_ADDR retransmission timeouts ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mptcp: pm: fix memory leak from alloc-during-teardown race [+ + +]
Author: Shardul Bankar <[email protected]>
Date:   Tue Aug 25 07:24:24 2026 -0400

    mptcp: pm: fix memory leak from alloc-during-teardown race
    
    [ Upstream commit efc33b5102ff859bacd390a5f30112d8e0c084c0 ]
    
    mptcp_pm_destroy() empties msk->pm.anno_list and
    msk->pm.userspace_pm_local_addr_list under msk->pm.lock during socket
    teardown, dropping the lock between the two.
    
    A concurrent userspace PM genl ANNOUNCE on the same msk holds a sock
    reference via mptcp_token_get_sock() and, in
    mptcp_pm_nl_announce_doit(), calls
    mptcp_userspace_pm_append_new_local_addr() and
    mptcp_pm_announced_alloc(). Both take msk->pm.lock briefly to add to
    their respective lists. Because the genl handler holds a sock reference,
    mptcp_pm_destroy() may run on the same msk via mptcp_disconnect(), which
    invokes mptcp_destroy_common() without dropping the sock refcount,
    before the handler completes.
    
    If the lock acquisitions interleave such that mptcp_pm_destroy() empties
    a list first, the later alloc adds its entry to a list head that nothing
    else iterates for this msk, and the entry leaks. kmemleak reports both
    mptcp_pm_add_addr objects (from mptcp_pm_announced_alloc()) and
    mptcp_pm_addr_entry objects (from
    mptcp_userspace_pm_append_new_local_addr()) under sustained concurrent
    ANNOUNCE + close load against the userspace PM.
    
    Add an MPTCP_PM_DESTROYING bit in msk->pm.status, set by
    mptcp_pm_destroy() under pm.lock before the lists are emptied and
    checked under pm.lock by the alloc paths. Either the alloc takes pm.lock
    first, in which case its entry is on the list when mptcp_pm_destroy()
    frees it; or mptcp_pm_destroy() takes pm.lock first, in which case the
    later alloc observes the bit and refuses.
    
    Found by an MPTCP protocol-flow harness extending BRF (arXiv:2305.08782).
    
    Fixes: 9ab4807c84a4 ("mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE")
    Cc: [email protected]
    Signed-off-by: Shardul Bankar <[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-6-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Inlined `mptcp_pm_destroy()` at its call site in `mptcp_destroy_common()` and moved the fences into the pre-rename `mptcp_pm_alloc_anno_list()`/`mptcp_free_local_addr_list()` equivalents, deleting the `mptcp_pm_is_userspace()` guard from inside the callee instead of the call site. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ndisc: ndisc_send_redirect() cleanup [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Fri Feb 14 14:07:05 2025 +0000

    ndisc: ndisc_send_redirect() cleanup
    
    commit 0784d83df3bfc977c13252a0599be924f0afa68d upstream.
    
    ndisc_send_redirect() is always called under rcu_read_lock().
    
    It can use dev_net_rcu() and avoid one redundant
    rcu_read_lock()/rcu_read_unlock() pair.
    
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: David Ahern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Li Xiasong <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net/ionic: avoid OOB TX partner lookup for hwstamp RXQ [+ + +]
Author: Anand Khoje <[email protected]>
Date:   Thu Aug 13 08:37:05 2026 +0000

    net/ionic: avoid OOB TX partner lookup for hwstamp RXQ
    
    commit d92255b405fb6f5acca408239ccd742e0a42c9cb upstream.
    
    The dedicated hardware timestamp RX queue is allocated with q->index
    equal to lif->ionic->nrxqs_per_lif. The normal txqcqs array only
    contains the regular queue pairs, so using that index to set rxq->partner
    can read one entry past txqcqs[] and then write through the derived
    pointer.
    Only link RX/TX partners for normal queue-pair indexes. Leave the hwstamp
    RX queue unpaired, and make the XDP_TX path abort cleanly if an RX queue
    has no TX partner.
    
    Fixes: 8eeed8373e1c ("ionic: Add XDP_TX support")
    Reviewed-by: Si-Wei Liu <[email protected]>
    Reviewed-by: Shannon Nelson <[email protected]>
    Cc: [email protected]
    Signed-off-by: Anand Khoje <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Reviewed-by: Brett Creeley <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net: gro: properly validate BIG TCP aggregation criteria [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Thu Aug 27 06:08:01 2026 +0000

    net: gro: properly validate BIG TCP aggregation criteria
    
    When GRO attempts to aggregate packets beyond GRO_LEGACY_MAX_SIZE (64KB),
    BIG TCP should only be permitted for plain IPv4 TCP and plain IPv6 TCP
    (with sufficient MAC header room to insert the temporary HBH jumbo header).
    
    However, commit b1a78b9b9886 ("net: add support for ipv4 big tcp")
    loosened the check in skb_gro_receive(), leading to several issues:
    
    1. skb_gro_receive() checked skb_headroom(p) instead of the actual space
       before the MAC header (p->mac_header). Because skb_headroom(p) includes
       mac_len, crafted frames (e.g. injected via AF_PACKET) can pass the check
       with p->mac_header < 8 bytes. When ipv6_gro_complete() inserts the
       temporary HBH jumbo header, the memmove() starts before skb->head,
       causing an out-of-bounds write and wrapping skb->mac_header.
    2. It allowed non-IP protocols such as software VLAN (ETH_P_8021Q /
       ETH_P_8021AD) to aggregate beyond 64KB because
       p->protocol != ETH_P_IPV6 was true.
    3. It checked p->encapsulation instead of NAPI_GRO_CB(skb)->encap_mark,
       allowing encapsulated flows (e.g. SIT / IPv6-in-IPv4) to aggregate
       beyond 64KB.
    
    Fix skb_gro_receive() to strictly enforce:
    - NAPI_GRO_CB(skb)->proto == IPPROTO_TCP
    - Not encapsulated (!NAPI_GRO_CB(skb)->encap_mark && !p->encapsulation)
    - Protocol must be either ETH_P_IP or ETH_P_IPV6
    - If ETH_P_IPV6, p->mac_header must be at least
      sizeof(struct hop_jumbo_hdr)
    
    Returning -E2BIG from skb_gro_receive() ensures that packets which cannot
    become BIG TCP are cleanly flushed at <= 64KB and delivered intact without
    dropping.
    
    This issue does not exist in mainline (7.0+) because the subsystem was
    rewritten in commit 81be30c1f5f2 ("net/ipv6: Drop HBH for BIG TCP on RX
    side"), making this fix relevant only for older stable branches like
    6.18.y.
    
    Fixes: 0fe79f28bfaf ("net: allow gro_max_size to exceed 65536")
    Fixes: b1a78b9b9886 ("net: add support for ipv4 big tcp")
    Reported-by: Sam Dlinn <[email protected]>
    Cc: [email protected]
    Signed-off-by: Eric Dumazet <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
netfs: Fix potential UAF in netfs_unlock_abandoned_read_pages() [+ + +]
Author: David Howells <[email protected]>
Date:   Tue May 12 13:33:56 2026 +0100

    netfs: Fix potential UAF in netfs_unlock_abandoned_read_pages()
    
    commit dbe556972100fabb8e5a1b3d2163831ff07b1e8e upstream.
    
    netfs_unlock_abandoned_read_pages(rreq) accesses the index of the folios it
    is wanting to unlock and compares that to rreq->no_unlock_folio so that it
    doesn't unlock a folio being read for netfs_perform_write() or
    netfs_write_begin().
    
    However, given that netfs_unlock_abandoned_read_pages() is called _after_
    NETFS_RREQ_IN_PROGRESS is cleared, the one folio that it's not allowed to
    dereference is the one specified by ->no_unlock_folio as ownership
    immediately reverts to the caller.
    
    Fix this by storing the folio pointer instead and using that rather than
    the index.  Also fix netfs_unlock_read_folio() where the same applies.
    
    Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading")
    Closes: https://sashiko.dev/#/patchset/20260414082004.3756080-1-dhowells%40redhat.com
    Signed-off-by: David Howells <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    cc: Paulo Alcantara <[email protected]>
    cc: Viacheslav Dubeyko <[email protected]>
    cc: Matthew Wilcox <[email protected]>
    cc: [email protected]
    cc: [email protected]
    Signed-off-by: Christian Brauner <[email protected]>
    Signed-off-by: Shishkin Aleksey <[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:   Thu Aug 20 15:35:15 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-auth: zero the AUTH_RECEIVE response buffer [+ + +]
Author: Bryam Vargas <[email protected]>
Date:   Thu Jul 2 03:45:14 2026 -0500

    nvmet-auth: zero the AUTH_RECEIVE response buffer
    
    commit 3ddcfb013322aa37eaa7a0d344b73079c38dfa21 upstream.
    
    nvmet_execute_auth_receive() allocates the response buffer with kmalloc()
    sized by the host-supplied AUTH_RECEIVE allocation length, but the
    DH-HMAC-CHAP builders write only a fixed-size message into it. The full
    allocation length is then copied to the wire by nvmet_copy_to_sgl(), so a
    remote initiator receives the bytes past the built message -- up to nearly
    a page of uninitialized slab -- during the pre-authentication handshake.
    
    Allocate the buffer with kzalloc() so the unwritten tail is zeroed before
    it is sent; conforming responses are unaffected.
    
    Fixes: db1312dd9548 ("nvmet: implement basic In-Band Authentication")
    Cc: [email protected]
    Signed-off-by: Bryam Vargas <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Keith Busch <[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: bound SGL data length before allocating command buffers [+ + +]
Author: Ibrahim Hashimov <[email protected]>
Date:   Thu Jul 9 15:25:33 2026 +0200

    nvmet-tcp: bound SGL data length before allocating command buffers
    
    commit 4a3f00262a044e8e15064b1a6860968bf0500bf4 upstream.
    
    nvmet_tcp_map_data() reads the host-controlled 32-bit sgl->length
    and, for the in-capsule offset descriptor (type 0x01), checks it
    against port->inline_data_size before use. Any other SGL descriptor
    type -- including the non-inline transport SGL data-block descriptor
    (type (NVME_TRANSPORT_SGL_DATA_DESC << 4) | NVME_SGL_FMT_TRANSPORT_A,
    the type a real host uses for out-of-capsule writes) skips that check
    entirely and falls straight through to:
    
            cmd->req.sg = sgl_alloc(len, GFP_KERNEL, &cmd->req.sg_cnt);
    
    with len taken directly from the wire, unbounded up to 4 GiB.
    
    nvmet_req_init() only parses the command and never inspects
    sgl->length, and nvmet_check_transfer_len() -- the only other place
    transfer_len is validated -- runs later, from req->execute(), after
    the allocation has already happened. For a write command the target
    responds with an R2T and parks the command waiting for the host to
    send the data; if the host (or an unauthenticated peer that simply
    never follows up) never does, the sgl_alloc() buffer stays resident
    for the life of the command. NVMe/TCP has no mandatory authentication
    in the default configuration, so any peer able to reach the target
    portal and complete a Fabrics connect can drive this with a single
    crafted command, repeatable across queues and connections for
    amplification. This is unbounded kernel memory allocation
    triggered by a remote, effectively unauthenticated peer.
    
    Validate len against the same NVMET_TCP_MAXH2CDATA ceiling this file
    already uses to bound per-PDU H2C data, for every SGL descriptor type,
    before doing any allocation. This closes the gap for the non-inline
    descriptor while leaving the existing, tighter inline_data_size check
    in place for the in-capsule case.
    
    Runtime-verified on a v6.19 KASAN stand: with this bound in place, a
    crafted write command carrying an oversized non-inline SGL length is
    rejected before sgl_alloc() runs, where the same request previously
    drove an unbounded ~256 MiB kernel allocation (up to 4 GiB) that
    stayed resident pending an R2T the host never satisfies.
    
    Fixes: 872d26a391da ("nvmet-tcp: add NVMe over TCP target driver")
    Cc: [email protected]
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Ibrahim Hashimov <[email protected]>
    Assisted-by: AuditCode-AI:2026.07
    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]>

 
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]>
 
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]>

 
serial: 8250_of: clear stuck empty-FIFO RX-timeout on LPC32xx [+ + +]
Author: Ryan Wilbur <[email protected]>
Date:   Thu Aug 20 10:55:28 2026 -0400

    serial: 8250_of: clear stuck empty-FIFO RX-timeout on LPC32xx
    
    [ Upstream commit 1423415471274abda87024967d7fe2206ceee0ea ]
    
    The NXP LPC32xx UART (PORT_LPC3220) can latch an RX character-timeout
    interrupt while the RX FIFO is empty: IIR reports UART_IIR_RX_TIMEOUT
    (0x0c) but LSR.DR is clear. A character timeout is only cleared by
    reading RHR, but serial8250_rx_chars() reads RHR only when LSR.DR is
    set, so nothing ever clears the condition. The interrupt is
    level-triggered and re-fires immediately, so on a single-core ARM926
    the resulting interrupt storm livelocks the CPU.
    
    It is reproducible when userspace repeatedly opens the front-panel port
    (ttyS1): serial8250_do_set_termios() re-enables interrupts on unlock and
    the handler then spins forever with iir=0xcc lsr=0x60 ier=0x05, tripping
    the soft-lockup detector in serial8250_handle_irq_locked().
    
    LPC32xx has no dedicated 8250 glue driver, it's driven by the generic
    8250_of. Add a hardware specific handle_irq for PORT_LPC3220, wired up
    in of_platform_serial_setup() the same way fsl8250_handle_irq is
    installed. The handler follows dw8250_handle_irq(): on an RX timeout
    with an empty FIFO (LSR.DR and LSR.BI clear) it does one throwaway RHR
    read to clear the condition, then calls serial8250_handle_irq_locked().
    No real received data is ever discarded, and it is a no-op on healthy
    UARTs which never report a timeout with DR clear.
    
    This is the same class of bug already worked around in other 8250 drivers;
    see commit 424d79183af0 ("serial: 8250_dw: Avoid "too much work" from bogus rx timeout interrupt")
    which reports the identical iir=0xcc/lsr=0x60. See also
    UART_RX_TIMEOUT_QUIRK in 8250_omap, and the note in 8250_bcm7271.
    
    Cc: stable <[email protected]>
    Assisted-by: Claude:Opus4.8
    Signed-off-by: Ryan Wilbur <[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]>

serial: amba-pl011: synchronize DMA teardown [+ + +]
Author: Fan Wu <[email protected]>
Date:   Thu Aug 20 15:35:37 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]>

serial: sc16is7xx: enable THRI before filling TX FIFO [+ + +]
Author: Luca Fresi <[email protected]>
Date:   Thu Aug 20 23:59:20 2026 -0400

    serial: sc16is7xx: enable THRI before filling TX FIFO
    
    [ Upstream commit 246ac114f485c2affb454240f3ea4fabfce22456 ]
    
    sc16is7xx_handle_tx() currently requests the THRI enable only after it has
    filled the TX FIFO. The request is asynchronous because the IER update is
    performed later by reg_work.
    
    The SC16IS7xx generates a THRI interrupt when the TX FIFO crosses its
    trigger level. If the FIFO drains past that level before reg_work enables
    THRI, the chip does not generate a new interrupt. Characters remain queued
    indefinitely even though the hardware FIFO is empty.
    
    This was observed on an SC16IS752 while both UART channels were active.
    During the stall the software TX buffer remained non-empty while TXLVL
    reported 64 bytes free, LSR reported THR and transmitter empty, IER had
    THRI enabled, and IIR reported no interrupt pending.
    
    Enable THRI synchronously before filling the FIFO so the threshold crossing
    cannot be missed.
    
    Fixes: cc4c1d05eb10 ("sc16is7xx: Properly resume TX after stop")
    Cc: stable <[email protected]>
    Signed-off-by: Luca Fresi <[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]>

serial: sc16is7xx: rename EFR mutex with generic name [+ + +]
Author: Hugo Villeneuve <[email protected]>
Date:   Thu Aug 20 23:59:18 2026 -0400

    serial: sc16is7xx: rename EFR mutex with generic name
    
    [ Upstream commit d9b2d7ddbb973b981c20b21e9228581bb156f66f ]
    
    This mutex is used as a lock when accessing registers that share the same
    address space, not necessarily EFR registers.
    
    For example, address 0x06 is shared by MSR, TCR and XOFF1 registers,
    independently of EFR.
    
    Rename the mutex with a more generic name to avoid misinterpreting its
    usage.
    
    Signed-off-by: Hugo Villeneuve <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 246ac114f485 ("serial: sc16is7xx: enable THRI before filling TX FIFO")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

serial: sc16is7xx: use guards for simple mutex locks [+ + +]
Author: Hugo Villeneuve <[email protected]>
Date:   Thu Aug 20 23:59:19 2026 -0400

    serial: sc16is7xx: use guards for simple mutex locks
    
    [ Upstream commit 0f4f88bfd7e7bf3f3293045fffdc63586b0a889f ]
    
    Guards can help to make the code more readable, so use them wherever they
    do so.
    
    In sc16is7xx_port_irq(), labels and 'rc' locals are eliminated completely.
    
    Signed-off-by: Hugo Villeneuve <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 246ac114f485 ("serial: sc16is7xx: enable THRI before filling TX FIFO")
    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:   Sun Aug 23 14:04:24 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]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xfs: don't livelock in scrub on a circular unlinked list [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Sun Aug 23 20:24:38 2026 -0400

    xfs: don't livelock in scrub on a circular unlinked list
    
    [ Upstream commit 527eaaefddb6ec5c83a06c9a1559960dd6361753 ]
    
    LOLLM points out that online fsck can livelock if an unlinked inode list
    contains a loop.  Use a bitmap to detect cycles.
    
    Cc: [email protected] # v4.15
    Fixes: a12890aebb8959 ("xfs: scrub the AGI")
    Signed-off-by: Darrick J. Wong <[email protected]>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xfs: don't use a xfs_log_iovec for ri_buf in log recovery [+ + +]
Author: Christoph Hellwig <[email protected]>
Date:   Sun Aug 23 14:04:23 2026 -0400

    xfs: don't use a xfs_log_iovec for ri_buf in log recovery
    
    [ Upstream commit ded74fddcaf685a9440c5612f7831d0c4c1473ca ]
    
    ri_buf just holds a pointer/len pair and is not a log iovec used for
    writing to the log.  Switch to use a kvec instead.
    
    Signed-off-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Stable-dep-of: 813f8136a2ce ("xfs: bounds-check buffer log item's dirty bitmap")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xfs: hoist per-bucket unlinked list check to helper [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Sun Aug 23 20:24:37 2026 -0400

    xfs: hoist per-bucket unlinked list check to helper
    
    [ Upstream commit 7cdafd8f10ebdf745ba6046b9fa67490c343a17f ]
    
    In the next patch we're going to make this loop more exciting, so hoist
    the code to a helper function to reduce clutter in the resulting code.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Stable-dep-of: 527eaaefddb6 ("xfs: don't livelock in scrub on a circular unlinked list")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xfs: namespace the maximum length/refcount symbols [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Sun Aug 23 14:04:22 2026 -0400

    xfs: namespace the maximum length/refcount symbols
    
    [ Upstream commit 70fcf6866578e69635399e806273376f5e0b8e2b ]
    
    Actually namespace these variables properly, so that readers can tell
    that this is an XFS symbol, and that it's for the refcount
    functionality.
    
    Signed-off-by: "Darrick J. Wong" <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Stable-dep-of: 813f8136a2ce ("xfs: bounds-check buffer log item's dirty bitmap")
    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]>