Changelog in Linux kernel 6.6.154

 
ALSA: dummy: Check card index validity at probe [+ + +]
Author: Takashi Iwai <tiwai@suse.de>
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: syzbot+2fb5d1f7cc4c1f132bcc@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/6a73bd4d.01d0871a.3a0d52.0005.GAE@google.com
    Cc: <stable@vger.kernel.org>
    Link: https://patch.msgid.link/20260806100433.1287393-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ASoC: codecs: lpass-tx-macro: Fix enum kcontrol accesses [+ + +]
Author: Dawid Wróbel <me@dawidwrobel.com>
Date:   Mon Aug 24 18:00:24 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: stable@vger.kernel.org
    Signed-off-by: Dawid Wróbel <me@dawidwrobel.com>
    Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260730-worktree-lpass-tx-macro-enum-fix-v2-1-6d091c736116@dawidwrobel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    [ kept `snd_soc_kcontrol_component()` context line instead of upstream's renamed `snd_kcontrol_chip()` ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: ipc4-pcm: Continue the pipeline trigger in case of IPC timeout [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Mon Aug 24 18:06:01 2026 -0400

    ASoC: SOF: ipc4-pcm: Continue the pipeline trigger in case of IPC timeout
    
    [ Upstream commit 17661c67b206612cb3ba65d5ae726cd2015d0a53 ]
    
    Ignore IPC errors for pipeline state change if the firmware state is
    crashed or the IPC has timed out.
    
    If the firmware has crashed the kernel still needs to go through the state
    changes to reset its internal to be able to correctly work the next time
    the DSP is booted up.
    
    The case with IPC timeout is a bit more problematic, but it has been
    rootcaused to be the result of system scheduling blockage and the firmware
    did actually received and handled the message, but the reply handling got
    blocked by issues outside of the SOF stack.
    So far the best way to handle this is to continue with setting the state.
    
    Fixes: c40aad7c81e5 ("ASoC: SOF: ipc4-pcm: Workaround for crashed firmware on system suspend")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
    Link: https://patch.msgid.link/20260730112343.26687-1-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: pcm: Add snd_sof_pcm specific wrappers for dev_dbg() and dev_err() [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Mon Aug 24 18:06:00 2026 -0400

    ASoC: SOF: pcm: Add snd_sof_pcm specific wrappers for dev_dbg() and dev_err()
    
    [ Upstream commit 860693187c597645b28a421d8acb26428b8afd3f ]
    
    Introduce spcm_dbg() and spcm_err() macros to provide consistent printing
    for debug and error messages which includes usable information in the
    print's prefix.
    
    Update the prints in pcm.c, ipc3-pcm.c and ipc4-pcm.c to take advantage of
    the features provided by the macros.
    
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    Link: https://patch.msgid.link/20250206092828.7569-4-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Stable-dep-of: 17661c67b206 ("ASoC: SOF: ipc4-pcm: Continue the pipeline trigger in case of IPC timeout")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: pcm: Move period/buffer configuration print after platform open [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Mon Aug 24 18:05:59 2026 -0400

    ASoC: SOF: pcm: Move period/buffer configuration print after platform open
    
    [ Upstream commit 4d2ea16576c8aa1437048cf436bff85653f139fe ]
    
    The platform specific pcm_open call via snd_sof_pcm_platform_open() can
    modify the initial buffer configuration via constraints.
    
    Move the prints as last step in the sof_pcm_open() function to reflect the
    final setup.
    
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    Link: https://patch.msgid.link/20250206092828.7569-3-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Stable-dep-of: 17661c67b206 ("ASoC: SOF: ipc4-pcm: Continue the pipeline trigger in case of IPC timeout")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: sof: pcm: use snd_pcm_direction_name() [+ + +]
Author: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date:   Mon Aug 24 18:05:57 2026 -0400

    ASoC: sof: pcm: use snd_pcm_direction_name()
    
    [ Upstream commit cda4aa0069b73e3404ee61864b4814ccc7b7a6ad ]
    
    We already have snd_pcm_direction_name(). Let's use it.
    
    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://patch.msgid.link/87mslzk51h.wl-kuninori.morimoto.gx@renesas.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Stable-dep-of: 17661c67b206 ("ASoC: SOF: ipc4-pcm: Continue the pipeline trigger in case of IPC timeout")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: Relocate and rework functionality for PCM stream freeing [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Mon Aug 24 18:05:58 2026 -0400

    ASoC: SOF: Relocate and rework functionality for PCM stream freeing
    
    [ Upstream commit 169ec0a541aac8afb215ab591b0fd53276686014 ]
    
    Move the sof_pcm_stream_free() from sof-audio.c to pcm.c as static function
    and add wrapper to free all active stream, which is going to be used in
    ipc3/4 topology code (removes duplicated code).
    
    With this change most of the PCM stream related code is located in one
    source file for easier lookup and simplified flow.
    
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    Link: https://patch.msgid.link/20250206092828.7569-2-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Stable-dep-of: 17661c67b206 ("ASoC: SOF: ipc4-pcm: Continue the pipeline trigger in case of IPC timeout")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Bluetooth: hci_event: fix LE list UAF on reset [+ + +]
Author: Chengfeng Ye <nicoyip.dev@gmail.com>
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: stable@vger.kernel.org
    Signed-off-by: Chengfeng Ye <nicoyip.dev@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Bluetooth: hci_event: validate LE Set CIG Parameters response [+ + +]
Author: Laxman Acharya Padhya <acharyalaxman8848@gmail.com>
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: stable@vger.kernel.org
    Signed-off-by: Laxman Acharya Padhya <acharyalaxman8848@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Bluetooth: hci_sync: Fix advertising data UAFs [+ + +]
Author: Chengfeng Ye <nicoyip.dev@gmail.com>
Date:   Thu Jul 23 23:34:40 2026 +0800

    Bluetooth: hci_sync: Fix advertising data UAFs
    
    [ Upstream commit cdc36db204ffd97b947d64374cf23a210dc74777 ]
    
    hci_find_adv_instance() returns an adv_info pointer that is valid only
    while hdev->lock is held.  The advertising command-sync paths perform
    instance lookups without that lock and, in some cases, retain the pointer
    while waiting for a controller response.
    
    An advertising termination event can therefore interleave as follows:
    
      hci_cmd_sync_work                 hci_rx_work
      hci_find_adv_instance()
      __hci_cmd_sync_status()
        wait for controller reply       hci_dev_lock()
                                        hci_remove_adv_instance()
                                          kfree(adv)
      adv->scan_rsp_changed = false
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in hci_set_ext_scan_rsp_data_sync+0x2e1/0x300
      Write of size 1 at addr ffff88810a45d21d by task kworker/u17:0/88
      Workqueue: hci0 hci_cmd_sync_work
      Call Trace:
       hci_set_ext_scan_rsp_data_sync+0x2e1/0x300
       hci_schedule_adv_instance_sync+0x390/0x4c0
       hci_cmd_sync_work+0x173/0x300
      Allocated by task 87:
       hci_add_adv_instance+0x538/0xac0
       add_advertising+0x885/0x1160
      Freed by task 89:
       kfree+0x131/0x3c0
       hci_remove_adv_instance+0x1d8/0x3b0
       hci_le_ext_adv_term_evt+0x17b/0x730
    
    Protect the instance lookup and payload construction in the extended
    advertising, scan response, and periodic advertising data paths.  Snapshot
    the advertising parameters under hdev->lock, but release the lock before
    waiting for the controller.
    
    Clear advertising-data dirty bits before issuing their commands and
    restore them after a failure using a fresh lookup.  Likewise, update the
    reported transmit power through a fresh lookup after the parameter command
    completes.  No adv_info pointer then survives an HCI command wait.
    
    Fixes: cba6b758711c ("Bluetooth: hci_sync: Make use of hci_cmd_sync_queue set 2")
    Cc: stable@vger.kernel.org
    Suggested-by: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
    Signed-off-by: Chengfeng Ye <nicoyip.dev@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

Bluetooth: RFCOMM: take rfcomm_mutex for the deferred setup accept [+ + +]
Author: Ali Ahmet Memis <ali@iusegentoo.com>
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: stable@vger.kernel.org
    Signed-off-by: Ali Ahmet Memis <ali@iusegentoo.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amd/amdgpu: disable ASPM in some situations [+ + +]
Author: Kenneth Feng <kenneth.feng@amd.com>
Date:   Mon Aug 24 05:56:04 2026 -0400

    drm/amd/amdgpu: disable ASPM in some situations
    
    [ Upstream commit c770ef19673fb1defcbde2ee2b91c3c89bfcf164 ]
    
    disable ASPM with some ASICs on some specific platforms.
    required from PCIe controller owner.
    
    Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
    Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: 2a9c5154a565 ("drm/amdgpu: check ASPM on the dGPU host link")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix [+ + +]
Author: Nathan Lucas <nlucasgit@gmail.com>
Date:   Mon Aug 24 05:56:39 2026 -0400

    drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix
    
    [ Upstream commit 2f9a5c0f018d4a1586ee892f81f1383219676415 ]
    
    COLOR_SPACE_YCBCR2020_TYPE, which is selected for
    COLOR_SPACE_2020_YCBCR_LIMITED color_space, has coefficients that are
    incorrect for limited-range output. Its luma and chroma scaling is
    full-range so output is too bright and colors are incorrect.
    
    COLOR_SPACE_YCBCR2020_TYPE is closer to a full-range conversion matrix with
    incorrect luma offset, so correct the luma offset for full-range and rename
    it to COLOR_SPACE_YCBCR2020_FULL_TYPE.
    
    Add COLOR_SPACE_YCBCR2020_LIMITED_TYPE with correct scaling and range for
    limited-range output.
    
    Fix related functions so COLOR_SPACE_YCBCR2020_LIMITED_TYPE and
    COLOR_SPACE_YCBCR2020_FULL_TYPE are correctly selected based on
    dc_color_space.
    
    Derivation of both matrices follows ITU-T H.273:
    
    Table 4, MatrixCoefficients 9, BT.2020-NCL weights:
    KR = 0.2627, KB = 0.0593, KG = 1 - KR - KB = 0.6780.
    
    Equations 45-47 in matrix form:
                [  KR             KG             KB            0 ]
    M2020_NCL = [ -KR/(2(1-KB))  -KG/(2(1-KB))   1/2           0 ]
                [  1/2           -KG/(2(1-KR))  -KB/(2(1-KR))  0 ]
                [  0              0              0             1 ]
    
    Limited and Full transforms based on equations 30-32 and 36-38 with bit
    depth 10, normalized by 1023:
    
                [ 876/1023   0         0         64/1023  ]
    MLimited  = [ 0          896/1023  0         512/1023 ]
                [ 0          0         896/1023  512/1023 ]
                [ 0          0         0         1        ]
    
                [ 1023/1023  0         0         0        ]
        MFull = [ 0          1023/1023 0         512/1023 ]
                [ 0          0         1023/1023 512/1023 ]
                [ 0          0         0         1        ]
    
    M2020_NCL_Limited = MLimited x M2020_NCL
    M2020_NCL_Full    = MFull x M2020_NCL
    
    The upper three rows of M2020_NCL_* are stored in CR, Y, CB order. Each
    M2020_NCL_* value is stored as Round(value * 8192) in its 16-bit
    two's-complement representation.
    
    Fixes: 973a9c810c78 ("drm/amd/display: Fix COLOR_SPACE_YCBCR2020_TYPE matrix")
    Assisted-by: OpenAI-Codex:GPT-5.6-Sol
    Tested-by: Igor Paunovic <royalnet026@gmail.com>
    Tested-by: Satyajit Roy <sroy14@alum.utk.edu>
    Signed-off-by: Nathan Lucas <nlucasgit@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 3b906e1dc7e3c9ff9f7940f6828b367a6a9ec73c)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amd/display: Fix BT2020 YCbCr limited/full range input [+ + +]
Author: Ilya Bakoulin <Ilya.Bakoulin@amd.com>
Date:   Mon Aug 24 05:56:38 2026 -0400

    drm/amd/display: Fix BT2020 YCbCr limited/full range input
    
    [ Upstream commit 07bc2dcbcf403d47d6f305ef7f0d3d489491c5fb ]
    
    [Why]
    BT2020 YCbCr input is not handled properly when full range
    quantization is used and limited range is not supported at all.
    
    [How]
    - Add enums for BT2020 YCbCr limited/full range
    - Add limited range CSC matrix
    
    Reviewed-by: Krunoslav Kovac <krunoslav.kovac@amd.com>
    Signed-off-by: Ilya Bakoulin <Ilya.Bakoulin@amd.com>
    Signed-off-by: Roman Li <roman.li@amd.com>
    Tested-by: Robert Mader <robert.mader@collabora.com>
    Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: 2f9a5c0f018d ("drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amdgpu: check ASPM on the dGPU host link [+ + +]
Author: Yang Wang <kevinyang.wang@amd.com>
Date:   Mon Aug 24 05:56:05 2026 -0400

    drm/amdgpu: check ASPM on the dGPU host link
    
    [ Upstream commit 2a9c5154a5650c09ad44ff5e1dff74754e15a3c6 ]
    
    dGPUs with an internal PCIe switch expose graphics functions below the
    switch downstream port. The automatic ASPM check uses the display
    endpoint and evaluates the internal link instead of the host link.
    
    Use the switch upstream port for the check and report the selected
    link.
    
    Fixes: 0ab5d711ec74 ("drm/amd: Refactor `amdgpu_aspm` to be evaluated per device")
    Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
    Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 4e0d6f2876e704fff707b18c40dbd383aea4a1c9)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ext4: clear error before retrying inode xattr space fallback [+ + +]
Author: Guanghui Yang <3497809730@qq.com>
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: stable@vger.kernel.org
    Signed-off-by: Guanghui Yang <3497809730@qq.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://patch.msgid.link/tencent_192F8A699EFD21126E02101131C9546F3C08@qq.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ext4: stop retrying saturated xattr cache entries [+ + +]
Author: Matthias Goergens <matthias.goergens@gmail.com>
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: syzbot+e68dbebd9617a9250e8d@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=e68dbebd9617a9250e8d
    Fixes: 65f8b80053a1 ("ext4: fix race when reusing xattr blocks")
    Cc: stable@vger.kernel.org
    Signed-off-by: Matthias Goergens <matthias.goergens@gmail.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Reported-by: syzbot+e68dbebd9617a9250e8d@syzkaller.appspotmail.com
    Tested-by: syzbot+e68dbebd9617a9250e8d@syzkaller.appspotmail.com
    Link: https://patch.msgid.link/20260802065941.1726052-1-matthias.goergens@gmail.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
gpio: ml-ioh: use raw_spinlock_t for the register lock [+ + +]
Author: Junjie Cao <junjie.cao@intel.com>
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: stable@vger.kernel.org
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Link: https://patch.msgid.link/20260731032747.2987292-1-junjie.cao@intel.com
    Signed-off-by: Junjie Cao <junjie.cao@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
HID: core: fix number/pointer type confusion on long items [+ + +]
Author: Jann Horn <jannh@google.com>
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: stable@vger.kernel.org
    Signed-off-by: Jann Horn <jannh@google.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: core: fix OOB read of field->usage in hid_set_field() [+ + +]
Author: Baul Lee <baul.lee@xbow.com>
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 <baul.lee@xbow.com>
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Federico Kirschbaum <federico.kirschbaum@xbow.com>
    Reported-by: Baul Lee <baul.lee@xbow.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Baul Lee <baul.lee@xbow.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: hyperv: validate initial device info bounds [+ + +]
Author: Michael Bommarito <michael.bommarito@gmail.com>
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: stable@vger.kernel.org
    Assisted-by: Codex:gpt-5-5-xhigh
    Signed-off-by: Michael Bommarito <michael.bommarito@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: magicmouse: do not keep a stale msc->input if no input is claimed [+ + +]
Author: Jose Villaseñor Montfort <pepemontfort@gmail.com>
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/20260728185542.65F091F000E9@smtp.kernel.org/
    Cc: stable@vger.kernel.org
    Signed-off-by: Jose Villaseñor Montfort <pepemontfort@gmail.com>
    Reviewed-by: Alec Hall <signshop.alec@gmail.com>
    Tested-by: Alec Hall <signshop.alec@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: magicmouse: fix battery reporting for Bluetooth Magic Trackpad USB-C [+ + +]
Author: Andrei Fed <andfed.net@gmail.com>
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: stable@vger.kernel.org
    Signed-off-by: Andrei Fed <andfed.net@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: magicmouse: Prevent out-of-bounds (OOB) read during DOUBLE_REPORT_ID [+ + +]
Author: Lee Jones <lee@kernel.org>
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 <lee@kernel.org>
    Reviewed-by: Günther Noack <gnoack@google.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: nintendo: fix out-of-bounds read in joycon_ctlr_read_handler() [+ + +]
Author: Ibrahim Hashimov <security@auditcode.ai>
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: stable@vger.kernel.org
    Signed-off-by: Ibrahim Hashimov <security@auditcode.ai>
    Assisted-by: AuditCode-AI:2026.07
    Reviewed-by: Silvan Jegen <s.jegen@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

HID: sensor: custom: Fix use-after-free in enable_sensor [+ + +]
Author: Haoxiang Li <haoxiang_li2024@163.com>
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 <sashiko-bot@kernel.org>
    Link: https://sashiko.dev/#/patchset/20260623021950.1736413-1-haoxiang_li2024@163.com?part=1
    Fixes: 4a7de0519df5 ("HID: sensor: Custom and Generic sensor support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Haoxiang Li <haoxiang_li2024@163.com>
    Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
inet: frags: add inet_frag_putn() helper [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Aug 21 12:51:43 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 <edumazet@google.com>
    Link: https://patch.msgid.link/20250312082250.1803501-2-edumazet@google.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

inet: frags: change inet_frag_kill() to defer refcount updates [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Aug 21 12:51:45 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 <edumazet@google.com>
    Link: https://patch.msgid.link/20250312082250.1803501-4-edumazet@google.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

inet: frags: publish queues before arming timer [+ + +]
Author: Zhiling Zou <zhilinz@nebusec.ai>
Date:   Fri Aug 21 12:51:47 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: stable@vger.kernel.org
    Reported-by: Vega <vega@nebusec.ai>
    Signed-off-by: Zhiling Zou <zhilinz@nebusec.ai>
    Signed-off-by: Ren Wei <enjou1224z@gmail.com>
    Link: https://patch.msgid.link/bf66785e7c0c139d7a1900e2f01faeeab344b960.1784948849.git.zhilinz@nebusec.ai
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

inet: frags: save a pair of atomic operations in reassembly [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Aug 21 12:51:46 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 <edumazet@google.com>
    Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
    Link: https://patch.msgid.link/20250312082250.1803501-5-edumazet@google.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Input: atkbd - skip deactivate for HONOR FMB-P's internal keyboard [+ + +]
Author: Cryolitia PukNgae <cryolitia.pukngae@linux.dev>
Date:   Mon Aug 24 11:19:08 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 <mikurakyouka@aosc.io>
    Reported-by: foad.elkhattabi <foad.elkhattabi@gmail.com>
    Signed-off-by: Cryolitia PukNgae <cryolitia.pukngae@linux.dev>
    Reviewed-by: Hans de Goede <hansg@kernel.org>
    Link: https://patch.msgid.link/20251022-honor-v1-1-ff894ed271a9@linux.dev
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Stable-dep-of: 410c44b10967 ("Input: atkbd - skip deactivate for HONOR ZQC-P")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: atkbd - skip deactivate for HONOR ZQC-P [+ + +]
Author: Donglin Lyu <DongLin_Lyu@outlook.com>
Date:   Mon Aug 24 11:19:09 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 <donglin_lyu@outlook.com>
    Tested-by: Ruslan Shevchenko <adefka@gmail.com>
    Link: https://patch.msgid.link/20260801151115.52709-1-donglin_lyu@outlook.com
    Cc: stable@vger.kernel.org
    [dtor: keep all HONOR entries together]
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: byd - synchronize timer deletion before freeing private data [+ + +]
Author: Linmao Li <lilinmao@kylinos.cn>
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: stable@vger.kernel.org
    Signed-off-by: Linmao Li <lilinmao@kylinos.cn>
    Link: https://patch.msgid.link/20260720061259.1601281-1-lilinmao@kylinos.cn
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    [ changed `del_timer()` to `timer_shutdown_sync()` since 6.12 predates the `del_timer()` → `timer_delete()` rename ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ipv4: frags: remove ipq_put() [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Aug 21 12:51:44 2026 -0400

    ipv4: frags: remove ipq_put()
    
    [ Upstream commit a2fb987c0ecf0498cc17056339cb11d128c46ab7 ]
    
    Replace ipq_put() with inet_frag_putn()
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20250312082250.1803501-3-edumazet@google.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Stable-dep-of: 653d7ddf6cba ("inet: frags: publish queues before arming timer")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ipv4: reject undersized MTUs in ip_do_fragment() [+ + +]
Author: Yong Wang <edragain@163.com>
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: stable@vger.kernel.org
    Reported-by: Vega <vega@nebusec.ai>
    Signed-off-by: Yong Wang <edragain@163.com>
    Signed-off-by: Ren Wei <weir@nebusec.ai>
    Reviewed-by: Ido Schimmel <idosch@nvidia.com>
    Link: https://patch.msgid.link/8809ef6314b98913681b0b370a05a85c2b6cd579.1786599079.git.edragain@163.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ipv6: fix use-after-free in ip6_finish_output2() [+ + +]
Author: Luxiao Xu <rakukuip@gmail.com>
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: stable@vger.kernel.org
    Reported-by: Vega <vega@nebusec.ai>
    Signed-off-by: Luxiao Xu <rakukuip@gmail.com>
    Signed-off-by: Ren Wei <weir@nebusec.ai>
    Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
    Reviewed-by: Ido Schimmel <idosch@nvidia.com>
    Link: https://patch.msgid.link/4aa3f53bc44e79572c6dd2340ec7b68ef1a3d87d.1786516730.git.rakukuip@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
kcov: fix data corruption and race conditions on PREEMPT_RT [+ + +]
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
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/43552d09-2ce2-4b19-b0d3-a2d1ab952145@I-love.SAKURA.ne.jp
    Reported-by: syzbot+3f51ad7ac3ae57a6fdcc@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=3f51ad7ac3ae57a6fdcc
    Reported-by: syzbot+47cf95ca1f9dcca872c8@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=47cf95ca1f9dcca872c8
    Reported-by: syzbot+8a173e13208949931dc7@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=8a173e13208949931dc7
    Reported-by: syzbot+90984d3713722683112e@syzkaller.appspotmail.com
    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 <penguin-kernel@I-love.SAKURA.ne.jp>
    Reviewed-by: Alexander Potapenko <glider@google.com>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Clark Williams <williams@redhat.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Marco Elver <elver@google.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

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

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

 
Linux: Linux 6.6.154 [+ + +]
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu Aug 27 14:29:48 2026 +0200

    Linux 6.6.154
    
    Link: https://lore.kernel.org/r/20260825132541.813800447@linuxfoundation.org
    Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Ron Economos <re@w6rz.net>
    Tested-by: Wentao Guan <guanwentao@uniontech.com>
    Tested-by: Barry K. Nathan <barryn@pobox.com>
    Tested-by: Brett A C Sheffield <bacs@librecast.net>
    Tested-by: Miguel Ojeda <ojeda@kernel.org>
    Tested-by: Peter Schneider <pschneider1968@googlemail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mptcp: pm: fix data race in add_addr timer callback [+ + +]
Author: Qing Luo <luoqing@kylinos.cn>
Date:   Mon Aug 24 18:05:57 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: stable@vger.kernel.org
    Signed-off-by: Qing Luo <luoqing@kylinos.cn>
    Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-4-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    [ 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 <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

mptcp: pm: fix memory leak from alloc-during-teardown race [+ + +]
Author: Shardul Bankar <shardul.b@mpiricsoftware.com>
Date:   Tue Aug 25 07:29:56 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: stable@vger.kernel.org
    Signed-off-by: Shardul Bankar <shardul.b@mpiricsoftware.com>
    Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-6-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    [ 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 <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ndisc: ndisc_send_redirect() cleanup [+ + +]
Author: Eric Dumazet <edumazet@google.com>
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 <edumazet@google.com>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Link: https://patch.msgid.link/20250214140705.2105890-1-edumazet@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Li Xiasong <lixiasong1@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
net: gro: properly validate BIG TCP aggregation criteria [+ + +]
Author: Eric Dumazet <edumazet@google.com>
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 <sledge@meta.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nfc: digital: clamp SENSF_RES length to the destination buffer [+ + +]
Author: Doruk Tan Ozturk <doruk@0sec.ai>
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: stable@vger.kernel.org
    Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
    Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
    Link: https://patch.msgid.link/20260603141355.68156-1-doruk@0sec.ai
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: fdp: bound the device-reported read length and fix an skb leak [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
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: stable@vger.kernel.org
    Suggested-by: Simon Horman <horms@kernel.org>
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Link: https://patch.msgid.link/20260616-b4-disp-b1f8ab4c-v2-1-2d1fe5955325@proton.me
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: llcp: bound the connect_sn TLV walk to the skb [+ + +]
Author: Doruk Tan Ozturk <doruk@0sec.ai>
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: stable@vger.kernel.org
    Assisted-by: 0sec:claude-opus-4-8
    Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20260709131229.44477-1-doruk@0sec.ai
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: llcp: fix OOB read and u8 offset wrap in TLV parsers [+ + +]
Author: Muhammad Bilal <meatuni001@gmail.com>
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: stable@vger.kernel.org
    Signed-off-by: Muhammad Bilal <meatuni001@gmail.com>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20260622131802.239035-1-meatuni001@gmail.com
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: llcp: reject PDUs shorter than the LLCP header [+ + +]
Author: Doruk Tan Ozturk <doruk@0sec.ai>
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: stable@vger.kernel.org
    Suggested-by: David Laight <david.laight.linux@gmail.com>
    Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
    Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
    Link: https://patch.msgid.link/20260714164631.75068-1-doruk@0sec.ai
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: microread: validate target discovery payload lengths [+ + +]
Author: Pengpeng Hou <pengpeng@iscas.ac.cn>
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: stable@vger.kernel.org
    Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
    Link: https://patch.msgid.link/20260723103508.1-microread-v2-pengpeng@iscas.ac.cn
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: nci: fix out-of-bounds write in nci_target_auto_activated() [+ + +]
Author: Samuel Page <sam@bynar.io>
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: stable@vger.kernel.org
    Assisted-by: Bynario AI
    Signed-off-by: Samuel Page <sam@bynar.io>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20260622145243.3167276-1-sam@bynar.io
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: nci: fix uninit-value in the RF discover/activated NTF handlers [+ + +]
Author: Samuel Page <sam@bynar.io>
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/20260623172109.1105965-2-horms@kernel.org/
    Cc: stable@vger.kernel.org
    Assisted-by: Bynario AI
    Signed-off-by: Samuel Page <sam@bynar.io>
    Link: https://patch.msgid.link/20260626090301.2139500-1-sam@bynar.io
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: nci: free destination parameters when closing a connection [+ + +]
Author: Linmao Li <lilinmao@kylinos.cn>
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: stable@vger.kernel.org
    Signed-off-by: Linmao Li <lilinmao@kylinos.cn>
    Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
    Link: https://patch.msgid.link/20260721023518.1697625-1-lilinmao@kylinos.cn
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: pn533: purge fragmented skbs during cleanup [+ + +]
Author: Xu Rao <raoxu@uniontech.com>
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: stable@vger.kernel.org
    Signed-off-by: Xu Rao <raoxu@uniontech.com>
    Link: https://patch.msgid.link/2D896607CAE4408E+20260720021444.3362044-1-raoxu@uniontech.com
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

nfc: st21nfca: validate ATR_REQ length against the received frame [+ + +]
Author: Doruk Tan Ozturk <doruk@0sec.ai>
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: stable@vger.kernel.org
    Assisted-by: 0sec:claude-opus-4-8
    Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20260711071301.58071-1-doruk@0sec.ai
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
NTB: ntb_netdev: Preserve RX queue depth on allocation failure [+ + +]
Author: Koichiro Den <den@valinux.co.jp>
Date:   Thu Aug 20 18:27:57 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: stable@vger.kernel.org
    Signed-off-by: Koichiro Den <den@valinux.co.jp>
    Reviewed-by: Dave Jiang <dave.jiang@intel.com>
    Link: https://patch.msgid.link/20260806032537.3526498-1-den@valinux.co.jp
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    [ 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 <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
null_blk: fix UBSAN shift-out-of-bounds when zone_size is 0 or overflows [+ + +]
Author: Rik van Riel <riel@surriel.com>
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: syzbot+abd6a8dca0f2b7726060@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=abd6a8dca0f2b7726060
    Link: https://lore.kernel.org/all/6a75205c.01d0871a.3a0d52.0033.GAE@google.com/
    Fixes: 8a3cf049af68 ("null_blk: add zoned block device emulation")
    Cc: stable@vger.kernel.org
    Assisted-by: Hermes:muse-spark-1.2 syzkaller
    Signed-off-by: Rik van Riel <riel@surriel.com>
    Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
    Link: https://patch.msgid.link/20260808114239.69167f68@fangorn
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nvmet-auth: zero the AUTH_RECEIVE response buffer [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
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: stable@vger.kernel.org
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nvmet-fc: fix invalid free in LS IOD error path [+ + +]
Author: Jiang HongHui <jiang_hh2019@163.com>
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: stable@vger.kernel.org
    Reviewed-by: Maurizio Lombardi <mlombard@redhat.com>
    Assisted-by: Codex:gpt-5
    Signed-off-by: Jiang HongHui <jiang_hh2019@163.com>
    Signed-off-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nvmet-tcp: Do not WARN on remotely-controlled oversized SGL allocations [+ + +]
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
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 <stable@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ocfs2: fix missing metadata reservation for large xattrs [+ + +]
Author: Ian Bridges <icb@fastmail.org>
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 <icb@fastmail.org>
    Reported-by: syzbot+e538032956b1157914a3@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=e538032956b1157914a3
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: Heming Zhao <heming.zhao@suse.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
PCI: host-generic: Fix NULL pointer dereference on 32-bit CAM systems [+ + +]
Author: Steffen Persvold <spersvold@gmail.com>
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 <spersvold@gmail.com>
    [mani: removed timestamp from log]
    Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260709122446.3151899-1-spersvold@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 
perf/core: Fix group leader use-after-free after sibling detach [+ + +]
Author: Aditya Chillara <aditya.chillara@oss.qualcomm.com>
Date:   Thu Aug 20 18:28:10 2026 -0400

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

 
perf: Unify perf_event_free_task() / perf_event_exit_task_context() [+ + +]
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Aug 20 18:28:09 2026 -0400

    perf: Unify perf_event_free_task() / perf_event_exit_task_context()
    
    [ Upstream commit 90661365021a6d0d7f3a2c5046ebe33e4df53b92 ]
    
    Both perf_event_free_task() and perf_event_exit_task_context() are
    very similar, except perf_event_exit_task_context() is a little more
    generic / makes less assumptions.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Ravi Bangoria <ravi.bangoria@amd.com>
    Link: https://lkml.kernel.org/r/20250307193723.274039710@infradead.org
    Stable-dep-of: 42c5ca1f0a28 ("perf/core: Fix group leader use-after-free after sibling detach")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
rndis_host: add overflow check in rndis_rx_fixup() [+ + +]
Author: Griffin Kroah-Hartman <griffin@kroah.com>
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 <andrew+netdev@lunn.ch>
    Cc: Shaoxu Liu <shaoxul@foxmail.com>
    Signed-off-by: Griffin Kroah-Hartman <griffin@kroah.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/2026070900-denim-brook-52d4@gregkh
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
s390/vfio_ccw: Calculate idal length based on idaw type [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:17 2026 +0200

    s390/vfio_ccw: Calculate idal length based on idaw type
    
    commit 4f6fdc6e1a7fbfa36b945af33c65a417948feac0 upstream.
    
    Sashiko pointed out that get_guest_idal() unconditionally calculates
    the length of the IDAL presuming everything is a Format-2 IDAW.
    
    The output of vfio-ccw is always Format-2, but the input can be either
    Format-1 (31-bit addresses) or Format-2 (64-bit addresses). As a result,
    the size of the guest IDAL may be incorrect and should be trimmed down.
    
    Reported-by: sashiko-bot <sashiko-bot@kernel.org>
    Link: https://lore.kernel.org/r/20260720203400.7328E1F000E9@smtp.kernel.org/
    Fixes: 1b676fe3d9d3 ("vfio/ccw: handle a guest Format-1 IDAL")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    [farman@linux.ibm.com: resolved merge conflict]
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Ensure first IDAW remains constant [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:16 2026 +0200

    s390/vfio_ccw: Ensure first IDAW remains constant
    
    commit 565bef268d75bf7df665bce6923a88cd0eb74592 upstream.
    
    The first IDAW in a list does not need to be on a 2K/4K boundary
    like all others, and so is read separately to accurately calculate
    the size of the buffer needed to read the full IDAL.
    
    Verify that the address found in the first IDAW is unchanged between
    reads, to ensure a consistent set of IDAWs being worked with.
    
    Fixes: 01aa26c672c0 ("s390/cio: Combine direct and indirect CCW paths")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    [farman@linux.ibm.com: resolved merge conflict]
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Free all memory if cp_init() fails [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:13 2026 +0200

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

s390/vfio_ccw: Implement a crw lock [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:22 2026 +0200

    s390/vfio_ccw: Implement a crw lock
    
    commit 16b0798024c0e9117e395829ddbbe70981c79d9c upstream.
    
    Unlike the channel_program struct, which covers synchronous I/O
    submissions and asynchronous interrupts, the CRW region relies
    exclusively on asynchronous events coming from hardware.
    
    Implement a lock to manage the list of those payloads, to ensure
    they are read cohesively.
    
    Fixes: 3f02cb2fd9d2 ("vfio-ccw: Wire up the CRW irq and CRW region")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Reviewed-by: Farhan Ali <alifm@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    [farman@linux.ibm.com: resolved merge conflict]
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
serial: amba-pl011: synchronize DMA teardown [+ + +]
Author: Fan Wu <fanwu01@zju.edu.cn>
Date:   Thu Aug 20 18:28:04 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 <stable@kernel.org>
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <fanwu01@zju.edu.cn>
    Link: https://patch.msgid.link/20260731085915.326775-4-fanwu01@zju.edu.cn
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [ 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 <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

serial: qcom-geni: fix TX DMA buffer flush [+ + +]
Author: Jan Sebastian Götte <linux@jaseg.de>
Date:   Fri Aug 21 00:00:04 2026 -0400

    serial: qcom-geni: fix TX DMA buffer flush
    
    [ Upstream commit e3c04834ae1ab5e9cfbe8ac54ec734aa4774249d ]
    
    When transmit flushing a qcom-geni UART during an ongoing TX DMA, the
    UART gets stuck infinitely repeating corrupted TX DMA frames.
    
    The DMA-mode uart_ops does not provide a flush_buffer callback, so an
    in-flight transfer can complete after serial core has reset the transmit
    kfifo, underflowing its length and resubmitting page-sized transfers
    indefinitely. Add one that stops the transfer and clears tx_remaining
    and tx_queued.
    
    The stop path was also broken: it unmapped the buffer while the serial
    engine could still read it, and never reset the TX DMA state machine.
    Cancel the main sequencer command first, then reset the state machine
    and wait for it before unmapping. Drop the early return so a pending
    mapping is also cleaned up when the main command is inactive.
    
    The bug can be triggered from userspace with a large write immediately
    followed by TCOFLUSH. A following tcdrain will hang forever. The bug was
    reproduced and this fix was validated on Arduino Uno Q (QRB2210)
    using /dev/ttyHS1.
    
    Assisted-by: Claude:claude-5-opus Codex:gpt-5
    Signed-off-by: Jan Sebastian Götte <linux@jaseg.de>
    Fixes: 2aaa43c70778 ("tty: serial: qcom-geni-serial: add support for serial engine DMA")
    Cc: stable <stable@kernel.org>
    Reviewed-by: Praveen Talari <praveen.talari@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260729174105.21838-2-git@jaseg.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [ Inlined `__qcom_geni_serial_cancel_tx_cmd()` as the existing open-coded cancel/abort block and dropped the `flush_buffer`→`flush_buffer_fifo` rename and `tx_queued` reset, which don't exist in this tree. ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

serial: sc16is7xx: convert bitmask definitions to use BIT() macro [+ + +]
Author: Lech Perczak <lech.perczak@camlingroup.com>
Date:   Fri Aug 21 07:00:05 2026 -0400

    serial: sc16is7xx: convert bitmask definitions to use BIT() macro
    
    [ Upstream commit d2e8590fd1048c5c0dba160edc6a48ee8305a1f0 ]
    
    Now that bit definition comments were cleaned up, convert bitmask
    definitions to use BIT() macro for clarity.
    Convert SC16IS7XX_IIR_ID_MASK to use GENMASK() macro -
    - while at that, realign comments.
    Compose SC16IS7XX_LSR_BRK_ERROR_MASK using aforementioned constants,
    instead of open-coding it, and remove now unneeded comments.
    
    Signed-off-by: Lech Perczak <lech.perczak@camlingroup.com>
    Reviewed-by: Andy Shevchenko <andy@kernel.org>
    Link: https://lore.kernel.org/r/8b45a01e-7cc5-4d53-b467-c6680bc51ef4@camlingroup.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Stable-dep-of: 246ac114f485 ("serial: sc16is7xx: enable THRI before filling TX FIFO")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

serial: sc16is7xx: enable THRI before filling TX FIFO [+ + +]
Author: Luca Fresi <luca.fresi@bithiatec.com>
Date:   Fri Aug 21 07:00:08 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 <stable@kernel.org>
    Signed-off-by: Luca Fresi <luca.fresi@bithiatec.com>
    Link: https://patch.msgid.link/20260721222404.204746-1-luca.fresi@bithiatec.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

serial: sc16is7xx: fix copy-paste errors in EFR_SWFLOWx_BIT constants [+ + +]
Author: Lech Perczak <lech.perczak@camlingroup.com>
Date:   Fri Aug 21 07:00:04 2026 -0400

    serial: sc16is7xx: fix copy-paste errors in EFR_SWFLOWx_BIT constants
    
    [ Upstream commit eccdb0fd1c340155666533f5c60c5229d370baab ]
    
    Comments attached to bits 0 and 1 incorrectly referenced bits 2 and 3,
    which don't match the datasheet - fix them.
    At the same time remove comments for individual constants, as they add
    nothing to the definitions themselves.
    
    Signed-off-by: Lech Perczak <lech.perczak@camlingroup.com>
    Reviewed-by: Andy Shevchenko <andy@kernel.org>
    Link: https://lore.kernel.org/r/2986a485-935d-4ab2-9a16-4a85288aa15a@camlingroup.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Stable-dep-of: 246ac114f485 ("serial: sc16is7xx: enable THRI before filling TX FIFO")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

serial: sc16is7xx: rename EFR mutex with generic name [+ + +]
Author: Hugo Villeneuve <hvilleneuve@dimonoff.com>
Date:   Fri Aug 21 07:00:06 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 <hvilleneuve@dimonoff.com>
    Link: https://patch.msgid.link/20251027142957.1032073-3-hugo@hugovil.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Stable-dep-of: 246ac114f485 ("serial: sc16is7xx: enable THRI before filling TX FIFO")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

serial: sc16is7xx: use guards for simple mutex locks [+ + +]
Author: Hugo Villeneuve <hvilleneuve@dimonoff.com>
Date:   Fri Aug 21 07:00:07 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 <hvilleneuve@dimonoff.com>
    Link: https://patch.msgid.link/20251027142957.1032073-6-hugo@hugovil.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Stable-dep-of: 246ac114f485 ("serial: sc16is7xx: enable THRI before filling TX FIFO")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
xfrm: fix sk_dst_cache double-free in xfrm_user_policy() [+ + +]
Author: Xiang Mei (Microsoft) <xmei5@asu.edu>
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: AutonomousCodeSecurity@microsoft.com
    Signed-off-by: Xiang Mei (Microsoft) <xmei5@asu.edu>
    Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
xfs: bounds-check buffer log item's dirty bitmap [+ + +]
Author: Ibrahim Hashimov <security@auditcode.ai>
Date:   Sun Aug 23 20:09: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: stable@vger.kernel.org
    Signed-off-by: Ibrahim Hashimov <security@auditcode.ai>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Reviewed-by: Brian Foster <bfoster@redhat.com>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: don't use a xfs_log_iovec for ri_buf in log recovery [+ + +]
Author: Christoph Hellwig <hch@lst.de>
Date:   Sun Aug 23 20:09: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 <hch@lst.de>
    Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Stable-dep-of: 813f8136a2ce ("xfs: bounds-check buffer log item's dirty bitmap")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: validate attr entry pointer before field access [+ + +]
Author: Hongling Zeng <zenghongling@kylinos.cn>
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: <stable@vger.kernel.org> # v5.5
    Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>