Changelog in Linux kernel 5.10.269

 
accessibility: speakup: unregister tty ldisc on later init failures [+ + +]
Author: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
Date:   Mon Jun 1 01:08:04 2026 +0200

    accessibility: speakup: unregister tty ldisc on later init failures
    
    commit a76acbaec9b8fd74413646984d2e3626d0543e39 upstream.
    
    The ldisc registration is intentionally non-fatal, since some synth
    drivers do not use tty/ldisc.  However, once speakup_init() continues
    past the registration point and later fails, the init unwind path should
    mirror speakup_exit() and call spk_ttyio_unregister_ldisc().
    
    Add the missing unregister call to the error path after synth_release(),
    matching the normal module exit cleanup order.
    
    Signed-off-by: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
    Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
    Fixes: e23a9b439ce9 ("staging: speakup: safely register and unregister ldisc")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260531230804.254962-16-samuel.thibault@ens-lyon.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ALSA: usb-audio: fix OOB write in snd_usbmidi_novation_output() [+ + +]
Author: Marouane El Moufid <eun0us@espilon.net>
Date:   Sun Aug 23 13:55:48 2026 +0000

    ALSA: usb-audio: fix OOB write in snd_usbmidi_novation_output()
    
    commit 1035a8f63bae28e498b0e7b5ac91d749844a7158 upstream.
    
    snd_usbmidi_novation_output() lays out a two-byte header at
    transfer_buffer[0..1] and passes &transfer_buffer[2] together with a
    length of ep->max_transfer - 2 to snd_rawmidi_transmit():
    
            count = snd_rawmidi_transmit(ep->ports[0].substream,
                                         &transfer_buffer[2],
                                         ep->max_transfer - 2);
    
    ep->max_transfer comes from the output endpoint's wMaxPacketSize via
    usb_maxpacket(). A malformed or malicious device can advertise a bulk
    OUT endpoint with a wMaxPacketSize of 1 - the USB core only clamps this
    value downwards - so ep->max_transfer becomes 1 and the count argument
    becomes -1.
    
    snd_rawmidi_transmit() passes the negative count on to
    __snd_rawmidi_transmit_peek(), where "if (count1 > count) count1 = count"
    leaves count1 negative; get_aligned_size() keeps it negative for a
    byte-stream substream, so the following memcpy(buffer, ..., count1) runs
    with a (size_t)-1 length and writes far past the transfer buffer, which
    was allocated with usb_alloc_coherent(ep->max_transfer).
    
    This is the same class of bug that was fixed for snd_usbmidi_akai_output()
    in commit 0970274613fb ("ALSA: usb-audio: fix OOB write in
    snd_usbmidi_akai_output()"); the novation output routine was left
    unguarded. Bail out when the endpoint cannot hold the two-byte header
    plus at least one payload byte.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Marouane El Moufid <eun0us@espilon.net>
    Link: https://patch.msgid.link/178749334830.543645.13722252148340572274@espilon.net
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
bpf: Fix use-after-free in offloaded map/prog info fill [+ + +]
Author: Jiayuan Chen <jiayuan.chen@linux.dev>
Date:   Thu Apr 9 10:37:32 2026 +0800

    bpf: Fix use-after-free in offloaded map/prog info fill
    
    [ Upstream commit a0c584fc18056709c8e047a82a6045d6c209f4ce ]
    
    When querying info for an offloaded BPF map or program,
    bpf_map_offload_info_fill_ns() and bpf_prog_offload_info_fill_ns()
    obtain the network namespace with get_net(dev_net(offmap->netdev)).
    However, the associated netdev's netns may be racing with teardown
    during netns destruction. If the netns refcount has already reached 0,
    get_net() performs a refcount_t increment on 0, triggering:
    
      refcount_t: addition on 0; use-after-free.
    
    Although rtnl_lock and bpf_devs_lock ensure the netdev pointer remains
    valid, they cannot prevent the netns refcount from reaching zero.
    
    Fix this by using maybe_get_net() instead of get_net(). maybe_get_net()
    uses refcount_inc_not_zero() and returns NULL if the refcount is already
    zero, which causes ns_get_path_cb() to fail and the caller to return
    -ENOENT -- the correct behavior when the netns is being destroyed.
    
    Fixes: 675fc275a3a2d ("bpf: offload: report device information for offloaded programs")
    Fixes: 52775b33bb507 ("bpf: offload: report device information about offloaded maps")
    Reported-by: Yinhao Hu <dddddd@hust.edu.cn>
    Reported-by: Kaiyan Mei <M202472210@hust.edu.cn>
    Reviewed-by: Dongliang Mu <dzm91@hust.edu.cn>
    Closes: https://lore.kernel.org/bpf/f0aa3678-79c9-47ae-9e8c-02a3d1df160a@hust.edu.cn/
    Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/r/20260409023733.168050-1-jiayuan.chen@linux.dev
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

bpf: Remove tst_run from lwt_seg6local_prog_ops. [+ + +]
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date:   Wed Jul 10 16:16:31 2024 +0200

    bpf: Remove tst_run from lwt_seg6local_prog_ops.
    
    [ Upstream commit c13fda93aca118b8e5cd202e339046728ee7dddb ]
    
    The syzbot reported that the lwt_seg6 related BPF ops can be invoked
    via bpf_test_run() without without entering input_action_end_bpf()
    first.
    
    Martin KaFai Lau said that self test for BPF_PROG_TYPE_LWT_SEG6LOCAL
    probably didn't work since it was introduced in commit 04d4b274e2a
    ("ipv6: sr: Add seg6local action End.BPF"). The reason is that the
    per-CPU variable seg6_bpf_srh_states::srh is never assigned in the self
    test case but each BPF function expects it.
    
    Remove test_run for BPF_PROG_TYPE_LWT_SEG6LOCAL.
    
    Suggested-by: Martin KaFai Lau <martin.lau@linux.dev>
    Reported-by: syzbot+608a2acde8c5a101d07d@syzkaller.appspotmail.com
    Fixes: d1542d4ae4df ("seg6: Use nested-BH locking for seg6_bpf_srh_states.")
    Fixes: 004d4b274e2a ("ipv6: sr: Add seg6local action End.BPF")
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/r/20240710141631.FbmHcQaX@linutronix.de
    Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
crypto: atmel-tdes - use scatterlist length before DMA mapping [+ + +]
Author: Thorsten Blum <thorsten.blum@linux.dev>
Date:   Thu Jun 11 12:36:35 2026 +0200

    crypto: atmel-tdes - use scatterlist length before DMA mapping
    
    commit ba199bdaa80b09a7dd92f28751de7f3dbb06c510 upstream.
    
    Using sg_dma_len() is only valid after mapping the scatterlist with
    dma_map_sg(). However, atmel_tdes_crypt_start() uses it before mapping
    to compare input/output lengths and to compute the transfer count.
    
    Use the original scatterlist lengths before DMA mapping to avoid reading
    stale or uninitialized DMA lengths when CONFIG_NEED_SG_DMA_LENGTH=y.
    
    Drop the output scatterlist length in the fast path since it is equal to
    ->in_sg->length and does not change the transfer count.
    
    Fixes: 13802005d8f2 ("crypto: atmel - add Atmel DES/TDES driver")
    Fixes: 1f858040c2f7 ("crypto: atmel-tdes - add support for latest release of the IP (0x700)")
    Cc: stable@vger.kernel.org
    Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

crypto: mxs-dcp - fix source scatterlist length access [+ + +]
Author: Thorsten Blum <thorsten.blum@linux.dev>
Date:   Sun Jun 21 21:26:16 2026 +0200

    crypto: mxs-dcp - fix source scatterlist length access
    
    commit c5bcb084a9871e5b62afb5f48b60adfa13b5d9f8 upstream.
    
    mxs_dcp_aes_block_crypt() uses sg_dma_len() without mapping the source
    scatterlist with dma_map_sg() first. Therefore, sg_dma_len() is invalid
    and could return zero or a stale DMA length, causing encryption and
    decryption to process the wrong number of bytes when
    CONFIG_NEED_SG_DMA_LENGTH=y.
    
    Use the original scatterlist length instead.
    
    Fixes: 15b59e7c3733 ("crypto: mxs - Add Freescale MXS DCP driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
    Reviewed-by: Frank Li <Frank.Li@nxp.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ext4: don't enable DAX on new encrypted files [+ + +]
Author: Eric Biggers <ebiggers@kernel.org>
Date:   Wed Aug 26 20:40:18 2026 -0700

    ext4: don't enable DAX on new encrypted files
    
    commit da32af420d6d466e247c43ac0b829edeac7ae0ad upstream.
    
    Currently, when a new encrypted regular file is created, the call to
    ext4_set_inode_flags(inode, init=true) in __ext4_new_inode() is made
    before EXT4_INODE_ENCRYPT is set.  As a result, it can set S_DAX if the
    filesystem is mounted with "-o dax=always".
    
    EXT4_INODE_ENCRYPT then actually gets set a bit later in
    __ext4_new_inode(), when it calls fscrypt_set_context() which calls
    ext4_set_context().  ext4_set_context() sets EXT4_INODE_ENCRYPT and
    calls ext4_set_inode_flags(inode, init=false) to set S_ENCRYPTED too.
    
    This was intended to clear S_DAX as well.  However, this was broken by
    commit 043546e46dc7 ("fs/ext4: Only change S_DAX on inode load").  This
    causes data written to the file to bypass encryption, also causing
    xfstests failures such as generic/548 (when "-o dax=always" is used).
    
    Fix this by simplifying the flow by making __ext4_new_inode() set
    EXT4_INODE_ENCRYPT earlier.  This makes it take effect in
    ext4_set_inode_flags(inode, init=true), making S_DAX never be set.
    
    Similarly, make EXT4_STATE_MAY_INLINE_DATA never be set in the first
    place on new encrypted inodes.  Then it doesn't need to be cleared.
    
    As a result of these simplifications, ext4_set_context() no longer needs
    to change inode flags or state when 'handle != NULL'.  Remove that too.
    
    Reported-by: Disha Goel <disgoel@linux.ibm.com>
    Reported-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
    Closes: https://lore.kernel.org/r/20260723085648.1500357-1-ojaswin@linux.ibm.com
    Fixes: 043546e46dc7 ("fs/ext4: Only change S_DAX on inode load")
    Cc: stable@vger.kernel.org
    Signed-off-by: Eric Biggers <ebiggers@kernel.org>
    Tested-by: Disha Goel <disgoel@linux.ibm.com>
    Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://patch.msgid.link/20260730175212.36923-1-ebiggers@kernel.org
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ext4: propagate errors from fast commit range replay [+ + +]
Author: Guanghui Yang <3497809730@qq.com>
Date:   Wed Aug 26 06:57:17 2026 -0400

    ext4: propagate errors from fast commit range replay
    
    [ Upstream commit d8b8dd3530bf41e14b118702cdaf9de64bb96885 ]
    
    ext4_fc_replay() stops replaying fast commit tags only when a tag
    handler returns a negative error. However, ext4_fc_replay_add_range()
    and ext4_fc_replay_del_range() currently return 0 from their common
    exit paths even after internal failures.
    
    This hides errors from ext4_fc_record_modified_inode(),
    ext4_map_blocks(), ext4_find_extent(), ext4_ext_insert_extent(),
    ext4_ext_replay_update_ex(), and ext4_ext_remove_space(). As a result,
    a failed ADD_RANGE or DEL_RANGE replay can be treated as successful and
    the replay code may continue with subsequent fast commit tags.
    
    This is particularly problematic for DEL_RANGE because it may already
    have marked blocks as free before ext4_ext_remove_space() fails. If the
    error is swallowed, replay may continue from a partially applied range
    operation.
    
    Return the saved error from the common exit paths and make the
    ERR_PTR() cases in ADD_RANGE store PTR_ERR() before jumping to out.
    
    Fixes: 8016e29f4362 ("ext4: fast commit recovery path")
    Cc: 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_E3622146846A84C75C31C7D32AC4D5AD0605@qq.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
fpga: dfl: fme: add error handling [+ + +]
Author: Griffin Kroah-Hartman <griffin@kroah.com>
Date:   Mon Jul 6 16:58:21 2026 +0200

    fpga: dfl: fme: add error handling
    
    commit b5ba63e247075087ab8a6a087622c762dc4172e9 upstream.
    
    Add error handling to devm_kasprint in fme_perf_pmu_register().
    
    Assisted-by: gkh_clanker_2000
    Fixes: 724142f8c42a ("fpga: dfl: fme: add performance reporting support")
    Cc: stable@kernel.org
    Cc: Xu Yilun <yilun.xu@intel.com>
    Cc: Tom Rix <trix@redhat.com>
    Cc: Moritz Fischer <mdf@kernel.org>
    Signed-off-by: Griffin Kroah-Hartman <griffin@kroah.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [ Yilun: Fix stable tag, add Fixes tag ]
    Reviewed-by: Xu Yilun <yilun.xu@intel.com>
    Link: https://lore.kernel.org/r/2026070620-unwired-clay-f6cc@gregkh
    Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
HID: input: read battery capacity from its actual report offset [+ + +]
Author: Jose Villaseñor Montfort <pepemontfort@gmail.com>
Date:   Thu Aug 27 09:02:48 2026 -0400

    HID: input: read battery capacity from its actual report offset
    
    [ Upstream commit d07644524b6511b622ee7b0e2e68c9ee43d522a4 ]
    
    hidinput_query_battery_capacity() assumes the state-of-charge value is
    the first byte following the report ID (buf[1]) and ignores where the
    battery field actually sits within the report.
    
    An Apple Magic Trackpad 2 precedes the AbsoluteStateOfCharge byte with a
    byte of status flags in its battery reports, so this query returns the
    flags byte instead of the charge level.
    
    The device happens to make that easy to observe, because it exposes the
    same cell twice: its report descriptor declares AbsoluteStateOfCharge in
    two reports (0x90 and 0x9b), so hidinput_setup_battery() registers two
    power supplies. Only the first one is refreshed by hid-magicmouse -- it
    uses hid_get_battery(), which returns the first battery of the list --
    and that refresh goes through the report event path, which parses the
    field correctly. Nothing ever reports the second one, so every read of
    its capacity takes the query path above. On a USB-C Magic Trackpad over
    USB, on an unpatched 7.1.5:
    
      hid-<serial>-battery-144 = 100%  (Charging)      <- report event path
      hid-<serial>-battery-155 =   3%  (Discharging)   <- query path
    
    Both are the same physical battery. A raw HIDIOCGINPUT of the two
    reports at that same moment:
    
      report 0x90 -> [90 03 64]
      report 0x9b -> [9b 03 64 64 00 00 10 00 00 00 00 00 00 00]
                         ^flags ^SoC = 0x64 = 100%
    
    The device answers correctly in both cases; only the offset the kernel
    reads the capacity from is wrong. 0x03 is the flags byte (present,
    charging), reported as "3%".
    
    Bluetooth takes the same query path for its capacity, where the trackpad
    reported a bogus near-constant ~4% -- 0b100, the FullyCharged flag --
    regardless of the real charge.
    
    Store the battery field's offset within the report at setup time and use
    it when querying, so the capacity is read from its real position. The
    report event path already parses the field correctly through the HID
    core; only the explicit GET_REPORT query was wrong.
    
    Devices whose capacity field is the first field in the report have a
    report_offset of 0 and are unaffected (buf[1 + 0] == buf[1]).
    
    Fixes: 581c4484769e ("HID: input: map digitizer battery usage")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jose Villaseñor Montfort <pepemontfort@gmail.com>
    Reviewed-by: Alec Hall <signshop.alec@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    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:   Wed Aug 26 09:47:02 2026 -0400

    HID: magicmouse: do not keep a stale msc->input if no input is claimed
    
    [ Upstream commit 0af3b89705688af01aa06025b84fa7a1e06ba6cc ]
    
    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: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
io_uring/io-wq: fix worker accounting when canceling creation callbacks [+ + +]
Author: Vishnu Razdan <vrazdan@openai.com>
Date:   Tue Aug 25 09:54:10 2026 -0700

    io_uring/io-wq: fix worker accounting when canceling creation callbacks
    
    commit 297b5ccea4acacaa47c150f043bce695202afbf1 upstream.
    
    create_worker_cb() reserves an io-wq worker slot only after its
    task-work callback runs. If the callback is canceled before then,
    io_worker_cancel_cb() still decrements acct->nr_workers. When an
    existing worker retires with its creation callback pending, that
    worker has already decremented the same account's worker count.
    
    The resulting undercount permits worker creation beyond the account's
    configured limit. On an AST2600 OpenBMC system, an unchanged sensor
    daemon reached 4,291 threads with the original kernel. With an
    equivalent downstream fix, 25 passive samples under its normal
    workload showed 6-9 threads.
    
    Decrement nr_workers only when the canceled callback is not
    create_worker_cb(). Continuation callbacks still release their reserved
    slot, and both callback types retain the existing running-count,
    reference-count, and create-state cleanup.
    
    [ Backport: retain the existing worker->wqe->lock protecting worker
      accounting. ]
    
    Fixes: 1d5f5ea7cb7d ("io-wq: remove worker to owner tw dependency")
    Cc: stable@vger.kernel.org
    Assisted-by: Codex:gpt-5.6-sol
    Reviewed-by: Gabriel Krisman Bertazi <krisman@suse.de>
    Link: https://patch.msgid.link/20260811-vrazdan-io-wq-b4-submit-v1-1-719ced16c921@openai.com
    Signed-off-by: Vishnu Razdan <vrazdan@openai.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ipv4: igmp: Fix potential UAF in igmp_gq_start_timer() [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Sun Jul 5 18:17:54 2026 +0000

    ipv4: igmp: Fix potential UAF in igmp_gq_start_timer()
    
    commit 7b19c0f81ed1fdaec6bc522569be367199a9edf3 upstream.
    
    A race condition exists between device teardown (inetdev_destroy) and
    incoming IGMP query processing (igmp_rcv), leading to a Use-After-Free
    in the IGMP timer callback.
    
    During device destruction, inetdev_destroy() drops the primary reference
    to in_device, which can drop its refcount to 0. The actual freeing of
    in_device memory is deferred via RCU (using call_rcu()).
    
    Concurrently, igmp_rcv() runs under RCU read lock and obtains the
    in_device pointer. Because the memory is RCU-protected, CPU-0 can safely
    dereference in_device even if its refcount has hit 0.
    
    However, if CPU-0 calls igmp_gq_start_timer() and re-arms the timer, it
    attempts to acquire a reference using in_dev_hold(). This increments the
    refcount from 0 to 1, triggering a "refcount_t: addition on 0" warning.
    Since the in_device memory is still scheduled to be freed after the RCU
    grace period (as the free callback does not check the refcount again),
    the device is freed while the timer is still armed. When the timer
    expires, it accesses the freed memory, causing a kernel panic.
    
    Fix this by using refcount_inc_not_zero() (via a new helper
    in_dev_hold_safe()) to prevent acquiring a reference if the device is
    already being destroyed. If the refcount is 0, we do not arm the timer.
    
    A similar issue in IPv6 MLD is fixed in a subsequent patch.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Zero Day Initiative <zdi-disclosures@trendmicro.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Ido Schimmel <idosch@nvidia.com>
    Link: https://patch.msgid.link/20260705181756.963063-2-edumazet@google.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    [Denis Arefev: adapted for 5.10/5.15: keep prandom_u32(),
    get_random_u32_below() not used here]
    Signed-off-by: Denis Arefev <arefev@swemel.ru>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ipv6: mcast: Fix use-after-free when processing MLD queries [+ + +]
Author: Ido Schimmel <idosch@nvidia.com>
Date:   Wed Aug 26 10:40:07 2026 +0300

    ipv6: mcast: Fix use-after-free when processing MLD queries
    
    commit 791c91dc7a9dfb2457d5e29b8216a6484b9c4b40 upstream.
    
    When processing an MLD query, a pointer to the multicast group address
    is retrieved when initially parsing the packet. This pointer is later
    dereferenced without being reloaded despite the fact that the skb header
    might have been reallocated following the pskb_may_pull() calls, leading
    to a use-after-free [1].
    
    Fix by copying the multicast group address when the packet is initially
    parsed.
    
    [1]
    BUG: KASAN: slab-use-after-free in __mld_query_work (net/ipv6/mcast.c:1512)
    Read of size 8 at addr ffff8881154b8e90 by task kworker/4:1/118
    
    Workqueue: mld mld_query_work
    Call Trace:
    <TASK>
    dump_stack_lvl (lib/dump_stack.c:94 lib/dump_stack.c:120)
    print_address_description.constprop.0 (mm/kasan/report.c:378)
    print_report (mm/kasan/report.c:482)
    kasan_report (mm/kasan/report.c:595)
    __mld_query_work (net/ipv6/mcast.c:1512)
    mld_query_work (net/ipv6/mcast.c:1563)
    process_one_work (kernel/workqueue.c:3314)
    worker_thread (kernel/workqueue.c:3397 kernel/workqueue.c:3478)
    kthread (kernel/kthread.c:436)
    ret_from_fork (arch/x86/kernel/process.c:158)
    ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
    </TASK>
    
    [...]
    
    Freed by task 118:
    kasan_save_stack (mm/kasan/common.c:57)
    kasan_save_track (mm/kasan/common.c:78)
    kasan_save_free_info (mm/kasan/generic.c:584)
    __kasan_slab_free (mm/kasan/common.c:253 mm/kasan/common.c:285)
    kfree (./include/linux/kasan.h:235 mm/slub.c:2689 mm/slub.c:6251 mm/slub.c:6566)
    pskb_expand_head (net/core/skbuff.c:2335)
    __pskb_pull_tail (net/core/skbuff.c:2878 (discriminator 4))
    __mld_query_work (net/ipv6/mcast.c:1495 (discriminator 1))
    mld_query_work (net/ipv6/mcast.c:1563)
    process_one_work (kernel/workqueue.c:3314)
    worker_thread (kernel/workqueue.c:3397 kernel/workqueue.c:3478)
    kthread (kernel/kthread.c:436)
    ret_from_fork (arch/x86/kernel/process.c:158)
    ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
    
    Fixes: 97300b5fdfe2 ("[MCAST] IPv6: Check packet size when process Multicast")
    Reported-by: Leo Lin <leo@depthfirst.com>
    Reviewed-by: David Ahern <dahern@nvidia.com>
    Signed-off-by: Ido Schimmel <idosch@nvidia.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Jiayuan Chen <jiayuan.chen@linux.dev>
    Link: https://patch.msgid.link/20260603101811.612594-1-idosch@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Roman Demidov <roman.demidov.nn@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ipv6: seg6: clear IPv4 control block on IPIP decapsulation [+ + +]
Author: Kyle Zeng <kylebot@openai.com>
Date:   Mon Aug 17 08:58:38 2026 +0000

    ipv6: seg6: clear IPv4 control block on IPIP decapsulation
    
    commit 44930446dde45a7a90fe1446fa38eb0e2c561646 upstream.
    
    End.DX4 and End.DT4 decapsulate an IPv4 packet through
    decap_and_validate() and send it directly to IPv4 routing. The inner
    packet therefore bypasses ip_rcv_core(), which normally clears IPCB
    before IPv4 interprets skb->cb.
    
    The skb instead retains IP6CB data from the outer packet. IP6CB and
    IPCB use the same skb->cb storage, so IP6CB(skb)->lastopt overlaps
    IPCB(skb)->opt.optlen and srr, while IP6CB(skb)->nhoff overlaps rr and
    ts.
    
    The sender can make the stale optlen byte nonzero with a valid outer
    extension-header chain. The reproducers put an eight-byte Destination
    Options header immediately after the 40-byte IPv6 header and before the
    Segment Routing Header. ipv6_destopt_rcv() records the sender-controlled
    Destination Options offset in both lastopt and nhoff, setting them to
    40. On the reproduced little-endian x86-64 kernel, IPv4 therefore sees
    optlen = 40 and rr = 40.
    
    Both tcp_v4_save_options() and __ip_options_echo() skip option copying
    when optlen is zero. Here optlen is 40, so the TCP SYN path allocates
    room for 40 bytes of option data and calls __ip_options_echo(). The
    stale rr value makes that function read inner packet byte 41 as the
    Record Route option length. The reproducers set that sender-controlled
    byte to 255, so __ip_options_echo() copies 255 bytes into the 40-byte
    option-data area.
    
    Separate End.DX4 and End.DT4 reproducers on the unpatched v7.2-rc5
    kernel both produced:
    
      BUG: KASAN: slab-out-of-bounds in __ip_options_echo()
      Write of size 255
    
    The relevant End.DX4 call path is:
    
      __ip_options_echo
      tcp_v4_route_req
      tcp_conn_request
      tcp_v4_conn_request
      tcp_rcv_state_process
      tcp_v4_do_rcv
      tcp_v4_rcv
      ip_protocol_deliver_rcu
      ip_local_deliver_finish
      ip_local_deliver
      input_action_end_dx4_finish
      input_action_end_dx4
    
    The relevant End.DT4 call path is:
    
      __ip_options_echo
      tcp_v4_route_req
      tcp_conn_request
      tcp_v4_conn_request
      tcp_rcv_state_process
      tcp_v4_do_rcv
      tcp_v4_rcv
      ip_protocol_deliver_rcu
      ip_local_deliver_finish
      ip_local_deliver
      input_action_end_dt4
    
    tcp_v4_save_options() is inlined into the tcp_v4_route_req() path, so
    it does not appear as a separate frame.
    
    When decap_and_validate() handles IPPROTO_IPIP, save the ingress
    interface from IP6CB, clear IPCB, and restore the saved value. Doing
    this in the common decapsulation path covers End.DX4, End.DT4, and
    End.DT46's IPv4 arm.
    
    Use IP6CB(skb)->iif rather than skb->skb_iif. These actions run after
    l3mdev processing, which can replace skb_iif with the L3 master;
    IP6CB iif still records the receiving interface set at IPv6 ingress.
    
    Fixes: 891ef8dd2a8d ("ipv6: sr: implement additional seg6local actions")
    Cc: stable@vger.kernel.org
    Suggested-by: Andrea Mayer <andrea.mayer@uniroma2.it>
    Signed-off-by: Kyle Zeng <kylebot@openai.com>
    Co-developed-by: David Lee <david.lee@trailofbits.com>
    Signed-off-by: David Lee <david.lee@trailofbits.com>
    Reviewed-by: Andrea Mayer <andrea.mayer@uniroma2.it>
    Link: https://patch.msgid.link/20260817085839.946321-1-david.lee@trailofbits.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ipvs: reload ip header after head reallocation [+ + +]
Author: Florian Westphal <fw@strlen.de>
Date:   Fri Aug 28 11:55:21 2026 +0300

    ipvs: reload ip header after head reallocation
    
    commit a2f57827bf7c695b8c72dc4511cae8e86582369d upstream.
    
    __ip_vs_get_out_rt() calls skb_ensure_writable() which may
    reallocate skb->head.
    
    Fixes: 8d8e20e2d7bb ("ipvs: Decrement ttl")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude:claude-sonnet-4-6
    Acked-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: Florian Westphal <fw@strlen.de>
    [Denis Arefev: adapted for 5.10/6.1: keep EnterFunction/LeaveFunction
    instrumentation]
    Signed-off-by: Denis Arefev <arefev@swemel.ru>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
jfs: add check read-only before truncation in jfs_truncate_nolock() [+ + +]
Author: Vasiliy Kovalev <kovalev@altlinux.org>
Date:   Tue Dec 24 17:49:14 2024 +0300

    jfs: add check read-only before truncation in jfs_truncate_nolock()
    
    [ Upstream commit b5799dd77054c1ec49b0088b006c9908e256843b ]
    
    Added a check for "read-only" mode in the `jfs_truncate_nolock`
    function to avoid errors related to writing to a read-only
    filesystem.
    
    Call stack:
    
    block_write_begin() {
      jfs_write_failed() {
        jfs_truncate() {
          jfs_truncate_nolock() {
            txEnd() {
              ...
              log = JFS_SBI(tblk->sb)->log;
              // (log == NULL)
    
    If the `isReadOnly(ip)` condition is triggered in
    `jfs_truncate_nolock`, the function execution will stop, and no
    further data modification will occur. Instead, the `xtTruncate`
    function will be called with the "COMMIT_WMAP" flag, preventing
    modifications in "read-only" mode.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: syzbot+4e89b5368baba8324e07@syzkaller.appspotmail.com
    Link: https://syzkaller.appspot.com/bug?extid=4e89b5368baba8324e07
    Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
    Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

jfs: add check read-only before txBeginAnon() call [+ + +]
Author: Vasiliy Kovalev <kovalev@altlinux.org>
Date:   Tue Dec 24 17:49:13 2024 +0300

    jfs: add check read-only before txBeginAnon() call
    
    [ Upstream commit 0176e69743ecc02961f2ae1ea42439cd2bf9ed58 ]
    
    Added a read-only check before calling `txBeginAnon` in `extAlloc`
    and `extRecord`. This prevents modification attempts on a read-only
    mounted filesystem, avoiding potential errors or crashes.
    
    Call trace:
     txBeginAnon+0xac/0x154
     extAlloc+0xe8/0xdec fs/jfs/jfs_extent.c:78
     jfs_get_block+0x340/0xb98 fs/jfs/inode.c:248
     __block_write_begin_int+0x580/0x166c fs/buffer.c:2128
     __block_write_begin fs/buffer.c:2177 [inline]
     block_write_begin+0x98/0x11c fs/buffer.c:2236
     jfs_write_begin+0x44/0x88 fs/jfs/inode.c:299
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: syzbot+4e89b5368baba8324e07@syzkaller.appspotmail.com
    Link: https://syzkaller.appspot.com/bug?extid=4e89b5368baba8324e07
    Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
    Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
kcov: fix data corruption and race conditions on PREEMPT_RT [+ + +]
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date:   Tue Aug 25 20:49:52 2026 -0400

    kcov: fix data corruption and race conditions on PREEMPT_RT
    
    [ Upstream commit 2eed77fdcb0cc48e8eccb2bcd4b7f2c6d650e84c ]
    
    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: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
KVM: arm64: Prevent access to vCPU events before init [+ + +]
Author: Oliver Upton <oupton@kernel.org>
Date:   Tue Sep 30 01:52:37 2025 -0700

    KVM: arm64: Prevent access to vCPU events before init
    
    [ Upstream commit 0aa1b76fe1429629215a7c79820e4b96233ac4a3 ]
    
    Another day, another syzkaller bug. KVM erroneously allows userspace to
    pend vCPU events for a vCPU that hasn't been initialized yet, leading to
    KVM interpreting a bunch of uninitialized garbage for routing /
    injecting the exception.
    
    In one case the injection code and the hyp disagree on whether the vCPU
    has a 32bit EL1 and put the vCPU into an illegal mode for AArch64,
    tripping the BUG() in exception_target_el() during the next injection:
    
      kernel BUG at arch/arm64/kvm/inject_fault.c:40!
      Internal error: Oops - BUG: 00000000f2000800 [#1]  SMP
      CPU: 3 UID: 0 PID: 318 Comm: repro Not tainted 6.17.0-rc4-00104-g10fd0285305d #6 PREEMPT
      Hardware name: linux,dummy-virt (DT)
      pstate: 21402009 (nzCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
      pc : exception_target_el+0x88/0x8c
      lr : pend_serror_exception+0x18/0x13c
      sp : ffff800082f03a10
      x29: ffff800082f03a10 x28: ffff0000cb132280 x27: 0000000000000000
      x26: 0000000000000000 x25: ffff0000c2a99c20 x24: 0000000000000000
      x23: 0000000000008000 x22: 0000000000000002 x21: 0000000000000004
      x20: 0000000000008000 x19: ffff0000c2a99c20 x18: 0000000000000000
      x17: 0000000000000000 x16: 0000000000000000 x15: 00000000200000c0
      x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
      x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000
      x8 : ffff800082f03af8 x7 : 0000000000000000 x6 : 0000000000000000
      x5 : ffff800080f621f0 x4 : 0000000000000000 x3 : 0000000000000000
      x2 : 000000000040009b x1 : 0000000000000003 x0 : ffff0000c2a99c20
      Call trace:
       exception_target_el+0x88/0x8c (P)
       kvm_inject_serror_esr+0x40/0x3b4
       __kvm_arm_vcpu_set_events+0xf0/0x100
       kvm_arch_vcpu_ioctl+0x180/0x9d4
       kvm_vcpu_ioctl+0x60c/0x9f4
       __arm64_sys_ioctl+0xac/0x104
       invoke_syscall+0x48/0x110
       el0_svc_common.constprop.0+0x40/0xe0
       do_el0_svc+0x1c/0x28
       el0_svc+0x34/0xf0
       el0t_64_sync_handler+0xa0/0xe4
       el0t_64_sync+0x198/0x19c
      Code: f946bc01 b4fffe61 9101e020 17fffff2 (d4210000)
    
    Reject the ioctls outright as no sane VMM would call these before
    KVM_ARM_VCPU_INIT anyway. Even if it did the exception would've been
    thrown away by the eventual reset of the vCPU's state.
    
    Cc: stable@vger.kernel.org # 6.17
    Fixes: b7b27facc7b5 ("arm/arm64: KVM: Add KVM_GET/SET_VCPU_EVENTS")
    Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

KVM: s390: vsie: zero stale crypto bits [+ + +]
Author: Christian Borntraeger <borntraeger@linux.ibm.com>
Date:   Tue Aug 11 17:37:36 2026 +0200

    KVM: s390: vsie: zero stale crypto bits
    
    commit 34d5b5b646c91cfb9338d7a12c955a70ffb8c66b upstream.
    
    When shadowing crypto access bits from a format0 apcb (crycb 0 or 1),
    the bits 64..255 are unchanged from whatever is in the vsie page in the
    crycb and thus in the apcb. This gives a nested guest potential access
    to a device no longer available. Zero out the remaining bits.
    
    Fixes: 6b79de4b056e ("KVM: s390: vsie: allow guest FORMAT-1 CRYCB on host FORMAT-2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Message-ID: <20260811153738.206885-3-borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Linux: Linux 5.10.269 [+ + +]
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Sep 2 14:26:44 2026 +0200

    Linux 5.10.269
    
    Link: https://lore.kernel.org/r/20260831133358.571886287@linuxfoundation.org
    Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
    Tested-by: Brett A C Sheffield <bacs@librecast.net>
    Tested-by: Woody Suwalski <terraluna977@gmail.com>
    Tested-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
    Tested-by: Pavel Machek (CIP) <pavel@nabladev.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Barry K. Nathan <barryn@pobox.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mm/swap: reject swapon() on filesystem-level encrypted files [+ + +]
Author: Eric Biggers <ebiggers@kernel.org>
Date:   Mon Aug 3 11:04:26 2026 -0700

    mm/swap: reject swapon() on filesystem-level encrypted files
    
    commit c310a8932a3107c9bc8f01d473e9d085f8aa9c98 upstream.
    
    ext4 and f2fs don't prevent filesystem-level encrypted files from being
    set up directly as swap files.  In this case, encryption is bypassed.
    
    No one should be doing this, vs.  the methods of encrypted swap that
    actually do work (such as swapping to a dm-crypt device, or swapping to a
    loopback device on top of a filesystem-level encrypted file).
    
    Nevertheless, to prevent user error, make swapon() explicitly reject this
    case.  Document this behavior in fscrypt.rst as well.
    
    Link: https://lore.kernel.org/20260803180426.3123-1-ebiggers@kernel.org
    Fixes: 9bd8212f981e ("ext4 crypto: add encryption policy and password salt support")
    Fixes: f424f664f0e8 ("f2fs crypto: add encryption policy and password salt support")
    Signed-off-by: Eric Biggers <ebiggers@kernel.org>
    Reviewed-by: Baoquan He <baoquan.he@linux.dev>
    Reviewed-by: Muhammad Usama Anjum <usama.anjum@arm.com>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Cc: Barry Song <baohua@kernel.org>
    Cc: Chris Li <chrisl@kernel.org>
    Cc: Kairui Song <kasong@tencent.com>
    Cc: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Nhat Pham <nphamcs@gmail.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nfc: nci: add data_len bound checks to activation parameter extractors [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Wed Aug 26 10:54:07 2026 -0400

    nfc: nci: add data_len bound checks to activation parameter extractors
    
    [ Upstream commit 0428fa2c22e2ba0cff766d3b80d461e149102045 ]
    
    nci_extract_activation_params_iso_dep() and
    nci_extract_activation_params_nfc_dep() read an inner length byte from
    the NCI RF_INTF_ACTIVATED_NTF payload and use it to memcpy() into fixed
    kernel buffers, but neither function receives the caller-validated
    activation_params_len.  A crafted NCI notification with
    activation_params_len=1 and an inner length byte of up to 20 (NFC-A) or
    50 (NFC-B) causes memcpy() to read that many bytes past the one valid
    byte in the activation params region -- a slab out-of-bounds read of
    kernel memory adjacent to the NCI skb.
    
    The sibling nci_extract_rf_params_*() family was given equivalent
    protection by commit 571dcbeb8e63 ("net: nfc: nci: Fix parameter
    validation for packet data"), but the two activation parameter
    extractors were not updated at that time.
    
    Add a data_len parameter to both functions, guard against an empty
    region before consuming the inner length byte, decrement the remaining
    count after consuming it, and clamp the copy length to what is actually
    available.  Update both call sites to pass ntf.activation_params_len,
    which is already validated against the skb at ntf.c:801.
    
    Fixes: e8c0dacd9836 ("NFC: Update names and structs to NCI spec 1.0 d18")
    Cc: stable@vger.kernel.org
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Link: https://patch.msgid.link/20260612-b4-disp-6d52d8b0-v3-1-e26221f8826d@proton.me
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    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:   Wed Aug 26 09:25:47 2026 -0400

    nfc: nci: fix uninit-value in the RF discover/activated NTF handlers
    
    [ Upstream commit 8cbe06c1e699c0a165dae5093a2550e65f914818 ]
    
    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: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nilfs2: reject invalid block index in GC ioctl [+ + +]
Author: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Date:   Wed Aug 26 06:57:42 2026 -0400

    nilfs2: reject invalid block index in GC ioctl
    
    [ Upstream commit a1735eae55448bc79c2da6593455791e886f6ed8 ]
    
    Syzbot reported list corruption caused by a double list_add_tail() call on
    bh->b_assoc_buffers within nilfs_lookup_dirty_data_buffers().
    
    Analysis revealed that the root cause was the insertion of a page/folio
    with a page index of ULONG_MAX into the page cache via the GC ioctl.
    filemap_get_folios_tag(), called by nilfs_lookup_dirty_data_buffers(),
    repeatedly detects a dirty folio with a page index of ULONG_MAX due to
    index wrap-around, leading to duplicate processing of dirty buffers.
    
    As a preparatory step, the GC ioctl loads the page/folio of the block to
    be moved during GC and inserts it into the page cache based on information
    in the nilfs_vdesc structure passed as an argument.  Normally, this does
    not cause issues because the user-space GC library configures the
    nilfs_vdesc structure properly.  However, since there is no range check on
    the parameters determining the page index, a request with artificially
    crafted parameters -- such as those generated by Syzbot -- can result in a
    page/folio being inserted with a page index of ULONG_MAX, triggering the
    above problem.
    
    This resolves the issue by checking the ranges of 'vd_offset' and
    'vd_vblocknr' in the nilfs_vdesc structure that determine the page index,
    thereby preventing the invalid page/folio insertions.
    
    Reported-by: syzbot+c37bed40868932d790e9@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=c37bed40868932d790e9
    Fixes: 7942b919f732 ("nilfs2: ioctl operations")
    Cc: wuyankun <wuyankun@uniontech.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Viacheslav Dubeyko <slava@dubeyko.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nvmet-tcp: bound SGL data length before allocating command buffers [+ + +]
Author: Ibrahim Hashimov <security@auditcode.ai>
Date:   Thu Aug 27 00:40:14 2026 -0400

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

 
RDMA/rxe: Fix OOB in free_rd_atomic_resources() [+ + +]
Author: Peiyang He <peiyang_he@smail.nju.edu.cn>
Date:   Tue Aug 25 22:14:50 2026 +0200

    RDMA/rxe: Fix OOB in free_rd_atomic_resources()
    
    commit de329533792a373186d79dca1ca120f8fa0afd05 upstream.
    
    free_rd_atomic_resources() iterates using qp->attr.max_dest_rd_atomic.
    Updating max_dest_rd_atomic before freeing the old array can make the
    free path walk past the old allocation and trigger a slab out-of-bounds
    write catched by KASAN:
    ==================================================================
    BUG: KASAN: slab-out-of-bounds in free_rd_atomic_resource drivers/infiniband/sw/rxe/rxe_qp.c:180 [inline]
    BUG: KASAN: slab-out-of-bounds in free_rd_atomic_resources drivers/infiniband/sw/rxe/rxe_qp.c:171 [inline]
    BUG: KASAN: slab-out-of-bounds in free_rd_atomic_resources drivers/infiniband/sw/rxe/rxe_qp.c:163 [inline]
    BUG: KASAN: slab-out-of-bounds in rxe_qp_from_attr+0x1e88/0x2150 drivers/infiniband/sw/rxe/rxe_qp.c:712
    Write of size 4 at addr ffff88802b8dddb8 by task syz.3.451/11063
    
    CPU: 0 UID: 0 PID: 11063 Comm: syz.3.451 Not tainted 7.1.0 #2 PREEMPT(full)
    Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    Call Trace:
     <TASK>
     __dump_stack lib/dump_stack.c:94 [inline]
     dump_stack_lvl+0x10e/0x1f0 lib/dump_stack.c:120
     print_address_description mm/kasan/report.c:378 [inline]
     print_report+0xf7/0x600 mm/kasan/report.c:482
     kasan_report+0xe4/0x120 mm/kasan/report.c:595
     free_rd_atomic_resource drivers/infiniband/sw/rxe/rxe_qp.c:180 [inline]
     free_rd_atomic_resources drivers/infiniband/sw/rxe/rxe_qp.c:171 [inline]
     free_rd_atomic_resources drivers/infiniband/sw/rxe/rxe_qp.c:163 [inline]
     rxe_qp_from_attr+0x1e88/0x2150 drivers/infiniband/sw/rxe/rxe_qp.c:712
     rxe_modify_qp+0x1e2/0x530 drivers/infiniband/sw/rxe/rxe_verbs.c:623
     ib_security_modify_qp+0x223/0xfa0 drivers/infiniband/core/security.c:625
     _ib_modify_qp+0x333/0xec0 drivers/infiniband/core/verbs.c:1915
     modify_qp+0x13ca/0x1940 drivers/infiniband/core/uverbs_cmd.c:1932
     ib_uverbs_modify_qp+0xcb/0x120 drivers/infiniband/core/uverbs_cmd.c:1958
     ib_uverbs_write+0xb86/0x1030 drivers/infiniband/core/uverbs_main.c:680
     vfs_write+0x2aa/0x1070 fs/read_write.c:686
     ksys_write+0x1f8/0x250 fs/read_write.c:740
     do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
     do_syscall_64+0x116/0x800 arch/x86/entry/syscall_64.c:94
     entry_SYSCALL_64_after_hwframe+0x77/0x7f
    RIP: 0033:0x7fefc75a70cd
    Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b0 ff ff ff f7 d8 64 89 01 48
    RSP: 002b:00007fefc8495018 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
    RAX: ffffffffffffffda RBX: 00007fefc7835fa0 RCX: 00007fefc75a70cd
    RDX: 0000000000000078 RSI: 0000200000000240 RDI: 0000000000000007
    RBP: 00007fefc764f10f R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007fefc7836038 R14: 00007fefc7835fa0 R15: 00007ffcf0586aa0
     </TASK>
    
    Allocated by task 11063:
     kasan_save_stack+0x33/0x60 mm/kasan/common.c:57
     kasan_save_track+0x14/0x30 mm/kasan/common.c:78
     poison_kmalloc_redzone mm/kasan/common.c:398 [inline]
     __kasan_kmalloc+0xaa/0xb0 mm/kasan/common.c:415
     kasan_kmalloc include/linux/kasan.h:263 [inline]
     __do_kmalloc_node mm/slub.c:5296 [inline]
     __kmalloc_noprof+0x32a/0x850 mm/slub.c:5308
     kmalloc_noprof include/linux/slab.h:954 [inline]
     kzalloc_noprof include/linux/slab.h:1188 [inline]
     alloc_rd_atomic_resources drivers/infiniband/sw/rxe/rxe_qp.c:155 [inline]
     rxe_qp_from_attr+0x3f8/0x2150 drivers/infiniband/sw/rxe/rxe_qp.c:714
     rxe_modify_qp+0x1e2/0x530 drivers/infiniband/sw/rxe/rxe_verbs.c:623
     ib_security_modify_qp+0x223/0xfa0 drivers/infiniband/core/security.c:625
     _ib_modify_qp+0x333/0xec0 drivers/infiniband/core/verbs.c:1915
     modify_qp+0x13ca/0x1940 drivers/infiniband/core/uverbs_cmd.c:1932
     ib_uverbs_modify_qp+0xcb/0x120 drivers/infiniband/core/uverbs_cmd.c:1958
     ib_uverbs_write+0xb86/0x1030 drivers/infiniband/core/uverbs_main.c:680
     vfs_write+0x2aa/0x1070 fs/read_write.c:686
     ksys_write+0x1f8/0x250 fs/read_write.c:740
     do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
     do_syscall_64+0x116/0x800 arch/x86/entry/syscall_64.c:94
     entry_SYSCALL_64_after_hwframe+0x77/0x7f
    
    The buggy address belongs to the object at ffff88802b8ddd80
     which belongs to the cache kmalloc-64 of size 64
    The buggy address is located 0 bytes to the right of
     allocated 56-byte region [ffff88802b8ddd80, ffff88802b8dddb8)
    
    The buggy address belongs to the physical page:
    page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x2b8dd
    flags: 0xfff00000000000(node=0|zone=1|lastcpupid=0x7ff)
    page_type: f5(slab)
    raw: 00fff00000000000 ffff888015c418c0 dead000000000100 dead000000000122
    raw: 0000000000000000 0000000800200020 00000000f5000000 0000000000000000
    page dumped because: kasan: bad access detected
    page_owner tracks the page as allocated
    page last allocated via order 0, migratetype Unmovable, gfp_mask 0xd2c40(GFP_NOFS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 4651, tgid 4651 ((udev-worker)), ts 123427165316, free_ts 123425874255
     set_page_owner include/linux/page_owner.h:32 [inline]
     post_alloc_hook+0xfc/0x120 mm/page_alloc.c:1853
     prep_new_page mm/page_alloc.c:1861 [inline]
     get_page_from_freelist+0x75b/0x3220 mm/page_alloc.c:3941
     __alloc_frozen_pages_noprof+0x27e/0x2b00 mm/page_alloc.c:5221
     alloc_slab_page mm/slub.c:3278 [inline]
     allocate_slab mm/slub.c:3467 [inline]
     new_slab+0xa6/0x670 mm/slub.c:3525
     refill_objects+0x278/0x420 mm/slub.c:7272
     refill_sheaf mm/slub.c:2816 [inline]
     __pcs_replace_empty_main+0x2ed/0x640 mm/slub.c:4652
     alloc_from_pcs mm/slub.c:4750 [inline]
     slab_alloc_node mm/slub.c:4884 [inline]
     __do_kmalloc_node mm/slub.c:5295 [inline]
     __kmalloc_noprof+0x68d/0x850 mm/slub.c:5308
     kmalloc_noprof include/linux/slab.h:954 [inline]
     kzalloc_noprof include/linux/slab.h:1188 [inline]
     tomoyo_encode2+0x100/0x3e0 security/tomoyo/realpath.c:45
     tomoyo_encode+0x29/0x50 security/tomoyo/realpath.c:80
     tomoyo_realpath_from_path+0x18c/0x690 security/tomoyo/realpath.c:283
     tomoyo_get_realpath security/tomoyo/file.c:151 [inline]
     tomoyo_check_open_permission+0x2ab/0x3c0 security/tomoyo/file.c:776
     tomoyo_file_open+0x6b/0x90 security/tomoyo/tomoyo.c:334
     security_file_open+0x7a/0x1b0 security/security.c:2739
     do_dentry_open+0x57e/0x1690 fs/open.c:924
     vfs_open+0x82/0x3f0 fs/open.c:1079
     do_open fs/namei.c:4699 [inline]
     path_openat+0x218a/0x3190 fs/namei.c:4858
    page last free pid 1 tgid 1 stack trace:
     reset_page_owner include/linux/page_owner.h:25 [inline]
     __free_pages_prepare mm/page_alloc.c:1397 [inline]
     __free_frozen_pages+0x763/0xfc0 mm/page_alloc.c:2938
     selinux_genfs_get_sid security/selinux/hooks.c:1364 [inline]
     inode_doinit_with_dentry+0x903/0x1320 security/selinux/hooks.c:1563
     selinux_d_instantiate+0x26/0x30 security/selinux/hooks.c:6658
     security_d_instantiate+0x123/0x190 security/security.c:3704
     d_splice_alias_ops+0x92/0x850 fs/dcache.c:3141
     kernfs_iop_lookup+0x23f/0x2d0 fs/kernfs/dir.c:1289
     lookup_open.isra.0+0x659/0x1080 fs/namei.c:4484
     open_last_lookups fs/namei.c:4611 [inline]
     path_openat+0x17dd/0x3190 fs/namei.c:4855
     do_file_open+0x20c/0x430 fs/namei.c:4887
     do_sys_openat2+0x101/0x1d0 fs/open.c:1364
     do_sys_open fs/open.c:1370 [inline]
     __do_sys_openat fs/open.c:1386 [inline]
     __se_sys_openat fs/open.c:1381 [inline]
     __x64_sys_openat+0x141/0x200 fs/open.c:1381
     do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
     do_syscall_64+0x116/0x800 arch/x86/entry/syscall_64.c:94
     entry_SYSCALL_64_after_hwframe+0x77/0x7f
    
    Memory state around the buggy address:
     ffff88802b8ddc80: 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc
     ffff88802b8ddd00: fa fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    >ffff88802b8ddd80: 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc
                                            ^
     ffff88802b8dde00: 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc
     ffff88802b8dde80: 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc
    
    Fix the OOB by moving the assignment after free_rd_atomic_resources()
    so the old array is freed using the old bound. This matches the original
    ordering in commit 8700e3e7c485 ("Soft RoCE driver").
    
    Closes: https://lore.kernel.org/all/365C68B4923F8214+30195a67-0b90-4b92-ab96-2ce41517793c@smail.nju.edu.cn/
    Fixes: b6bbee0d2438 ("IB/rxe: Properly honor max IRD value for rd/atomic.")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peiyang He <peiyang_he@smail.nju.edu.cn>
    Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    (cherry picked from commit de329533792a373186d79dca1ca120f8fa0afd05)
    [This commit is based on the upstream commit 6f7014237405 ("RDMA/rxe: Fix responder UAF on IB_QP_MAX_DEST_RD_ATOMIC modify_qp")]
    Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
 
Revert "mtd: maps: vmu-flash: fix fault in unaligned fixup" [+ + +]
Author: Sasha Levin <sashal@kernel.org>
Date:   Sun Aug 30 11:07:51 2026 -0400

    Revert "mtd: maps: vmu-flash: fix fault in unaligned fixup"
    
    This reverts commit f781e80c9f1e52d92535c076573b0cdafab04864.
    
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
Revert "PM: sleep: Use complete() in device_pm_sleep_init()" [+ + +]
Author: Sasha Levin <sashal@kernel.org>
Date:   Sat Aug 29 20:58:50 2026 -0400

    Revert "PM: sleep: Use complete() in device_pm_sleep_init()"
    
    This reverts commit d77b629876f15ebf9d9987e60b6747fd73ca8148.
    
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
Revert "smb: client: use kvzalloc() for megabyte buffer in simple fallocate" [+ + +]
Author: Sasha Levin <sashal@kernel.org>
Date:   Sun Aug 30 11:08:21 2026 -0400

    Revert "smb: client: use kvzalloc() for megabyte buffer in simple fallocate"
    
    This reverts commit a0c4a3e5387421ae252126a7bc29f3cd95b3cf06.
    
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
selinux: switch two allocations to use kzalloc_objs() [+ + +]
Author: Stephen Smalley <stephen.smalley.work@gmail.com>
Date:   Wed Apr 29 15:18:40 2026 -0400

    selinux: switch two allocations to use kzalloc_objs()
    
    [ Upstream commit cf6a513f1937581eb012a217b29817e025a1a0ef ]
    
    These were the only two allocations in the policy loading logic
    that were not already using kzalloc_objs() for the policy
    data structures. Fix these to be consistent with the rest and
    to protect against ill-formed policy.
    
    Signed-off-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
USB: c67x00: fix use-after-free in c67x00_add_iso_urb() [+ + +]
Author: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
Date:   Wed Aug 5 21:35:02 2026 -0400

    USB: c67x00: fix use-after-free in c67x00_add_iso_urb()
    
    commit b1e24de475bf2d66fffc9103f3444b783527d55a upstream.
    
    When TD creation fails for the last packet of an isochronous URB,
    c67x00_add_iso_urb() gives the URB back before updating the endpoint
    scheduling state.
    
    c67x00_giveback_urb() frees the URB private data, and the completion
    callback may release the final URB reference. The following accesses to
    urbp->ep_data, urb->interval, and urbp->cnt can therefore use freed
    memory.
    
    Update next_frame and cnt before giving back the failed final packet,
    making the giveback the last operation that uses the URB and its private
    data.
    
    Fixes: e9b29ffc519b ("USB: add Cypress c67x00 OTG controller HCD driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
    Link: https://patch.msgid.link/20260806013502.322067-1-shuangpeng.kernel@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
usb: core: Add lock to usb_wakeup_notification() [+ + +]
Author: Griffin Kroah-Hartman <griffin@kroah.com>
Date:   Mon Jul 13 17:43:53 2026 +0200

    usb: core: Add lock to usb_wakeup_notification()
    
    commit e263e18a9e7b1ff3e7301f0801c6ff87c31adfb6 upstream.
    
    Add a spin lock to usb_wakeup notification to prevent a race condition
    with dereferencing freed memory. This could be hit by the xHCI driver as
    it calls this function from an IRQ and could race with the
    hub_disconnect() function, which properly grabs this lock to protect the
    state of the device.
    
    Assisted-by: gkh_clanker_t1000
    Signed-off-by: Griffin Kroah-Hartman <griffin@kroah.com>
    Link: https://patch.msgid.link/20260713-usb_core_patches_1-v1-3-7721c2b33f53@kroah.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

usb: core: Strengthen error handling in hub_hub_status() [+ + +]
Author: Griffin Kroah-Hartman <griffin@kroah.com>
Date:   Wed Jul 22 10:17:39 2026 +0200

    usb: core: Strengthen error handling in hub_hub_status()
    
    commit a29496745aa335d97f617385809583241e118610 upstream.
    
    Add additional error handling after the call to get_hub_status() in
    hub_hub_status().
    
    get_hub_status() uses usb_control_msg() which does not verify that the
    message is the correct length, substituting it for
    usb_control_msg_recv() would also solve this issue but increase memory
    allocations.
    
    Instead, error handling is copied from the method used in
    hub_ext_port_status(), which shares the same flow of logic as
    hub_hub_status().
    
    Assisted-by: gkh_clanker_t1000
    Signed-off-by: Griffin Kroah-Hartman <griffin@kroah.com>
    Link: https://patch.msgid.link/20260722-usb_core_patches_2-v3-1-87622252bfdd@kroah.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

usb: gadget: f_tcm: keep port count until LUN teardown completes [+ + +]
Author: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
Date:   Fri Aug 7 02:07:33 2026 -0400

    usb: gadget: f_tcm: keep port count until LUN teardown completes
    
    commit c39d0916da47d94909391876c9e5bd429ea7b1b9 upstream.
    
    tcm_usbg_drop_nexus() permits session removal once tpg_port_count
    reaches zero. However, usbg_port_unlink() currently decrements that
    count from the fabric_pre_unlink() callback, before core_dev_del_lun()
    waits for active se_lun references to drain.
    
    If removal of the last LUN races a nexus removal, the latter can observe
    a zero port count and call target_remove_session(). This frees
    sess_cmd_map while an in-flight struct usbg_cmd, including its work item,
    can still be accessed.
    
    Overlapping the last-LUN unlink with nexus removal reproduces this
    lifetime violation as a DEBUG_OBJECTS "free active" warning for
    usbg_cmd_work, followed by a target-core BUG/Oops.
    
    The generic target-core unlink path has no callback after
    core_dev_del_lun() completes. Add an optional fabric_post_unlink()
    callback and use it for the f_tcm port count. The count now remains
    nonzero until core_dev_del_lun() has finished draining active LUN
    references, preventing nexus removal from freeing the session during
    command completion.
    
    Fixes: c52661d60f63 ("usb-gadget: Initial merge of target module for UASP + BOT")
    Cc: stable@vger.kernel.org
    Signed-off-by: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
    Link: https://patch.msgid.link/20260807060733.3186624-1-shuangpeng.kernel@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
USB: serial: option: fix slab OOB read in interrupt URB callback [+ + +]
Author: Jiale Yao <yaojiale02@163.com>
Date:   Sun Jul 26 00:27:51 2026 +0800

    USB: serial: option: fix slab OOB read in interrupt URB callback
    
    commit 885d802f544ca7bfa8f3984d94233cce715bb6b3 upstream.
    
    The interrupt URB buffer is allocated in setup_port_interrupt_in() based
    on the endpoint's wMaxPacketSize:
    
        buffer_size = usb_endpoint_maxp(epd);
        port->interrupt_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
    
    When a USB device declares wMaxPacketSize = 8 on its interrupt IN
    endpoint, the buffer is allocated from kmalloc-8 cache (exactly
    8 bytes).
    
    If the device sends a short packet (actual_length < wMaxPacketSize),
    the URB completes with status == 0 and the callback proceeds to read:
    
        data[sizeof(struct usb_ctrlrequest)]
    
    which evaluates to data[8], accessing 1 byte beyond the allocated 8-byte
    buffer. This results in a slab out-of-bounds read.
    
    Fix this by adding the missing bounds check: first verify that the
    actual length is large enough to contain the struct usb_ctrlrequest
    header before accessing req_pkt->bRequestType and req_pkt->bRequest,
    and then verify that there is an additional byte for the modem signal
    state before reading data[sizeof(struct usb_ctrlrequest)] inside the
    conditional.  Use sizeof(*req_pkt) instead of sizeof(struct
    usb_ctrlrequest) for consistency.
    
    Assisted-by: Claude:deepseek-v4-pro
    Signed-off-by: Jiale Yao <yaojiale02@163.com>
    Fixes: 58cfe9113e48 ("[PATCH] USB: add Option Card driver")
    Cc: stable@vger.kernel.org      # v2.6.12
    [ johan: use dev_err(); split signals declaration and initialisation ]
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

USB: serial: spcp8x5: drop broken carrier detect support [+ + +]
Author: Johan Hovold <johan@kernel.org>
Date:   Thu Aug 6 15:52:48 2026 +0200

    USB: serial: spcp8x5: drop broken carrier detect support
    
    commit d37186bd95a07e334447f47274a38a311dad2172 upstream.
    
    The driver does not support modem status notifications and instead used
    to fetch the modem status once at open() and subsequently operate on and
    report stale state.
    
    As part of fixing this, a call to fetch the status was added to
    carrier_raised(), which does not work as that callback must not sleep
    (e.g. unlike tiocmget()).
    
    Drop the broken carrier detect support.
    
    Fixes: e1ed212d8593 ("USB: spcp8x5: add proper modem-status support")
    Cc: stable@vger.kernel.org      # 3.10
    Reported-by: syzbot+3b514b87202742f22c44@syzkaller.appspotmail.com
    Link: https://lore.kernel.org/all/6a73cea2.01d0871a.3a0d52.000d.GAE@google.com
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
usb: usbfs: fix use-after-free of usb_device in usbdev_release() [+ + +]
Author: Miguel Peñaranda <mig.penaranda07@gmail.com>
Date:   Mon Aug 10 14:12:09 2026 +0200

    usb: usbfs: fix use-after-free of usb_device in usbdev_release()
    
    commit 0dd68b5d01d022fc9c5e71c82a82b0a94d3d0671 upstream.
    
    usbdev_release() drops its reference to the struct usb_device before
    draining the list of completed async URBs, but that drain path reads back
    through the same object: free_async() calls dec_usb_memory_use_count()
    for any URB whose buffer came from the usbfs mmap() region, and its first
    statement is bus_to_hcd(ps->dev->bus).
    
    After a disconnect the usbfs reference can be the last one, in which case
    usb_put_dev() frees the device and the subsequent loop reads offset 80 of
    freed memory and uses the result as a struct usb_hcd *, which
    hcd_buffer_free_pages() then dereferences.
    
    This is reachable by an unprivileged process that has read/write access to
    a /dev/bus/usb node: mmap() the fd, submit one URB with a buffer inside the
    mapping, wait for the device to be unplugged, then munmap() and close().
    It reproduces on every attempt rather than being a race, because a live
    MAP_SHARED vma holds a reference on the struct file, so usbdev_release()
    cannot run until the last vma is gone and the freeing branch of
    dec_usb_memory_use_count() is always taken.
    
      BUG: KASAN: slab-use-after-free in dec_usb_memory_use_count+0x3ae/0x410
      Read of size 8 at addr ffff8880122ee050 by task poc/769
      CPU: 1 UID: 1000 PID: 769 Comm: poc Tainted: G    B    6.12.94 #3
    
      Call Trace:
       dec_usb_memory_use_count+0x3ae/0x410
       free_async+0x2aa/0x4f0
       usbdev_release+0x375/0x460
       __fput+0x3ea/0xb50
       __x64_sys_close+0x86/0x100
    
      Allocated by task 11:
       usb_alloc_dev+0x55/0xd90
       hub_event+0x2524/0x43d0
    
      Freed by task 769:
       kfree+0x121/0x360
       device_release+0xd2/0x280
       usb_put_dev+0x23/0x30
       usbdev_release+0x2d8/0x460
    
    Release the device reference after the drain loop instead. Nothing between
    the two points requires it to have been dropped.
    
    Fixes: f7d34b445abc ("USB: Add support for usbfs zerocopy.")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Miguel Peñaranda <mig.penaranda07@gmail.com>
    Reviewed-by: Alan Stern <stern@rowland.harvard.edu>
    Link: https://patch.msgid.link/20260810121209.795089-1-mig.penaranda07@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

usb: usbtest: disable dynamic ID support [+ + +]
Author: Aleksandr Nogikh <nogikh@google.com>
Date:   Thu Aug 6 15:26:51 2026 +0000

    usb: usbtest: disable dynamic ID support
    
    commit 00e2071f6d5621a5ddea311a5e6b143ae6e474af upstream.
    
    The usbtest driver relies on the driver_info field of struct usb_device_id
    to point to a valid struct usbtest_info descriptor. This structure contains
    essential test configurations, such as endpoint addresses and test modes,
    which are required during probe.
    
    When a user dynamically adds a new device ID via the sysfs new_id
    interface without specifying a reference device, the USB core initializes
    driver_info to 0 (NULL). When a matching device is subsequently probed,
    usbtest_probe() unconditionally casts driver_info to a struct usbtest_info
    pointer and dereferences it, leading to a NULL pointer dereference crash:
    
      Oops: general protection fault, probably for non-canonical address
      0xdffffc0000000001: 0000 [#1] SMP KASAN NOPTI
      KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
      RIP: 0010:usbtest_probe+0x3b9/0x1280 drivers/usb/misc/usbtest.c:2822
    
    Because usbtest strictly requires pre-defined usbtest_info descriptors
    to function, dynamic ID binding via sysfs is fundamentally unsupported
    for this driver.
    
    Fix this by setting .no_dynamic_id = 1 on usbtest_driver. This instructs
    the USB core to skip creating the new_id and remove_id sysfs interfaces
    for usbtest, preventing invalid dynamic ID entries from being created.
    
    Cc: stable@vger.kernel.org
    Reported-by: syzbot+7e1e5911f9eac50bedc7@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=7e1e5911f9eac50bedc7
    Signed-off-by: Aleksandr Nogikh <nogikh@google.com>
    Tested-by: syzbot@syzkaller.appspotmail.com
    Link: https://patch.msgid.link/20260806152651.2370795-1-nogikh@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
xfrm: ah6: validate routing header segments_left [+ + +]
Author: Asim Viladi Oglu Manizada <manizada@pm.me>
Date:   Thu Jul 23 09:35:48 2026 +0000

    xfrm: ah6: validate routing header segments_left
    
    commit 7bad4bda74dc4713f398d3b7624ff05478e3a568 upstream.
    
    AH6 rearranges routing-header addresses before computing or verifying the
    ICV. ipv6_rearrange_rthdr() assumes that segments_left is not larger than
    the number of addresses described by the routing header's hdrlen field.
    
    That assumption does not hold for raw IPv6 HDRINCL packets. A packet with
    hdrlen equal to 2 describes one address, but can carry an arbitrary
    segments_left value. With segments_left equal to 255, the function moves
    its address pointer 4,064 bytes backwards and passes a 4,064-byte length to
    memmove(), resulting in an out-of-bounds access.
    
    Validate the invariant locally before modifying the routing header or
    performing any address-pointer arithmetic, and propagate malformed-header
    errors to the existing AH6 input and output error paths.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Assisted-by: avom-custom-harness:gpt-5.5-qwen3.6-mod-mix
    Signed-off-by: Asim Viladi Oglu Manizada <manizada@pm.me>
    Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfrm: drop ESP-in-TCP packets with no ingress device [+ + +]
Author: Zhiling Zou <roxy520tt@gmail.com>
Date:   Sat Jul 18 15:12:50 2026 +0800

    xfrm: drop ESP-in-TCP packets with no ingress device
    
    commit e1d7c5ac1c246ce5775f604515de0a59fbf2116e upstream.
    
    ESP-in-TCP receives records through the TCP strparser. handle_esp()
    restores skb->dev from the saved skb_iif before passing the packet into
    the XFRM input path.
    
    Queued TCP data can be processed after the original ingress device has
    been removed, for example during veth or net namespace teardown. In that
    case dev_get_by_index_rcu() returns NULL. The XFRM IPv4 and IPv6 input
    paths both expect skb->dev to be valid while building the route lookup,
    so queued ESP-in-TCP data can dereference a NULL device.
    
    Drop the packet if the saved ingress device can no longer be resolved.
    Such a packet can no longer be routed through the normal XFRM receive
    path, and this preserves the existing behaviour for packets whose ingress
    device still exists.
    
    Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
    Cc: stable@vger.kernel.org
    Reported-by: Vega <vega@nebusec.ai>
    Signed-off-by: Zhiling Zou <roxy520tt@gmail.com>
    Assisted-by: Codex:gpt-5.4
    Reviewed-by: Ren Wei <enjou1224z@gmail.com>
    Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfrm: espintcp: fix UAF during close [+ + +]
Author: Sabrina Dubroca <sd@queasysnail.net>
Date:   Thu Jul 16 22:54:59 2026 +0200

    xfrm: espintcp: fix UAF during close
    
    commit deb232e884877bf10b4ce2580909eedec986c284 upstream.
    
    ZDI reported and analyzed a race condition during close for espintcp
    sockets:
    
        espintcp_close() frees emsg->skb via kfree_skb() without holding
        any socket lock. Concurrently, the xfrm_trans_reinject work queue
        invokes esp_output_tcp_finish() -> espintcp_push_skb() ->
        espintcp_push_msgs() -> skb_send_sock_locked(), which reads the
        same skb as a data source.
    
    Fix this by adding a synchronize_rcu() call after resetting sk_prot,
    since esp_output_tcp_finish() runs under RCU and won't use a socket
    with sk_prot == &tcp_prot.  Simply taking the socket lock in
    espintcp_close() could lead to leaks, if esp_output_tcp_finish()
    re-adds an skb in the slot we just freed. After this, the existing
    barrier() is no longer needed.
    
    Cc: stable@vger.kernel.org
    Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
    Reported-by: zdi-disclosures@trendmicro.com
    Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
    Reviewed-by: Breno Leitao <leitao@debian.org>
    Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfrm: fix xfrm_state_construct() auth-trunc leak [+ + +]
Author: Zihan Xi <zihanx@nebusec.ai>
Date:   Tue Jul 28 01:30:32 2026 +0800

    xfrm: fix xfrm_state_construct() auth-trunc leak
    
    commit c12cbf56320fb633484ee0ca1fb7d68d6b64b213 upstream.
    
    attach_auth_trunc() can allocate x->aalg while leaving
    x->props.aalgo at zero when the selected auth algorithm has no
    sadb_alg_id. One real case is cmac(aes).
    
    xfrm_state_construct() then treats !x->props.aalgo as "no auth
    algorithm attached yet" and calls attach_auth(). That overwrites
    x->aalg and loses the first allocation. Any later failure or teardown
    only frees the replacement pointer.
    
    Check whether x->aalg is already attached instead of inferring that
    state from x->props.aalgo.
    
    Fixes: 4447bb33f094 ("xfrm: Store aalg in xfrm_state with a user specified truncation length")
    Cc: stable@vger.kernel.org
    Reported-by: Vega <vega@nebusec.ai>
    Assisted-by: Codex:gpt-5.4
    Signed-off-by: Zihan Xi <zihanx@nebusec.ai>
    Signed-off-by: Ren Wei <enjou1224z@gmail.com>
    Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>