Skip to content

[LTS 9.6] CVE-2025-39966, CVE-2025-38129, CVE-2025-39881, CVE-2025-38106#1116

Merged
PlaidCat merged 10 commits intoctrliq:ciqlts9_6from
pvts-mat:ciqlts9_6-CVE-batch-27
Apr 21, 2026
Merged

[LTS 9.6] CVE-2025-39966, CVE-2025-38129, CVE-2025-39881, CVE-2025-38106#1116
PlaidCat merged 10 commits intoctrliq:ciqlts9_6from
pvts-mat:ciqlts9_6-CVE-batch-27

Conversation

@pvts-mat
Copy link
Copy Markdown
Contributor

[LTS 9.6]

CVE-2025-39966 VULN-161965
CVE-2025-38129 VULN-162992
CVE-2025-39881 VULN-161581
CVE-2025-38106 VULN-162982

Commits

CVE-2025-39966

iommufd: Fix race during abort for file descriptors

jira VULN-161965
cve CVE-2025-39966
commit-author Jason Gunthorpe <jgg@ziepe.ca>
commit 4e034bf045b12852a24d5d33f2451850818ba0c1
upstream-diff |
  drivers/iommu/iommufd/main.c
        - The modified `IOMMUFD_OBJ_FAULT' entry can be found at different
          place than in the upstream because of the missing
          442003f3a842dc374b1c706187778c3d57b84c23 ("iommufd: Keep
          OBJ/IOCTL lists in an alphabetical order")
        - Ignored the `IOMMUFD_OBJ_VEVENTQ' entry in the
          `iommufd_object_ops' array, which was introduced in the
          non-backported commit e36ba5ab808ef6237c3148d469c8238674230e2b
          ("iommufd: Add IOMMUFD_OBJ_VEVENTQ and
          IOMMUFD_CMD_VEVENTQ_ALLOC")
        - Passed `filep' and `obj' to the `IOMMUFD_FILE_OFFSET' macro
          instead of `common.filep' and `common.obj' as in the upstream
          because these fields of `iommufd_fault' have not yet been
          extracted to the `common' sub-struct as in the upstream
          (5426a78bebefbb32643ee85320e977f3971c5521 ("iommufd: Abstract an
          iommufd_eventq from iommufd_fault"))
  drivers/iommu/iommufd/fault.c
        - Modified drivers/iommu/iommufd/fault.c instead of upstream's
          drivers/iommu/iommufd/eventq.c - it's the same file just renamed
          in the non-backported 0507f337fc0c3a10f802b42834e6532edcf605be
          ("iommufd: Rename fault.c to eventq.c")
        - Accounted for the missing
          927dabc9aa4dbebf92b34da9b7acd7d8d5c6331b ("iommufd/fault: Add an
          iommufd_fault_init() helper"): implemented the omission of
          `fput()' call on failure in the `iommufd_fault_alloc()' function
          instead of `iommufd_eventq_init()' (named `iommufd_fault_init()'
          at the moment of 927dabc9aa4).
        - Ignored change to the non-existing function
          `iommufd_veventq_alloc()' only introduced in e36ba5ab808.

(No idea why BUILD_BUG_ON_ZERO macro was called like that if it triggers compilation error when the argument is non-zero - confirmed experimentally)

CVE-2025-38129

page_pool: Fix use-after-free in page_pool_recycle_in_ring

jira VULN-162992
cve CVE-2025-38129
commit-author Dong Chenchen <dongchenchen2@huawei.com>
commit 271683bb2cf32e5126c592b5d5e6a756fa374fd9
upstream-diff Accounted in `page_pool_recycle_in_ring()' for the missing
  4dec64c52e24c2c9a15f81c115f1be5ea35121cb ("page_pool: convert to use
  netmem")

CVE-2025-39881

kernfs: Fix UAF in polling when open file is released

jira VULN-161581
cve CVE-2025-39881
commit-author Chen Ridong <chenridong@huawei.com>
commit 3c9ba2777d6c86025e1ba4186dc5cd930e40ec5f
upstream-diff Omitted in the `kernfs_fop_llseek()' function the
  `kernfs_get_active()' -> `kernfs_get_active_of()' replacement - it was
  introduced in the non-backported commit
  0fedefd4c4e33dd24f726b13b5d7c143e2b483be ("kernfs: sysfs: support
  custom llseek method for sysfs entries")

CVE-2025-38106

io_uring/sqpoll: annotate debug task == current with data_race()

jira VULN-162982
cve-pre CVE-2025-38106
commit-author Jens Axboe <axboe@kernel.dk>
commit e4956dc7a84da074fd8dc10f7abd147f15b3ae58
io_uring/sqpoll: fix sqpoll error handling races

jira VULN-162982
cve-pre CVE-2025-38106
commit-author Pavel Begunkov <asml.silence@gmail.com>
commit e33ac68e5e21ec1292490dfe061e75c0dbdd3bd4

Not a strict prerequisite - omitting it would merely lead to a trivial context conflict resolution. However, it's small, does fix another UAF bug and allows for a clean pick of ac0b8b3 so may as well be included.

io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()

jira VULN-162982
cve CVE-2025-38106
commit-author Penglei Jiang <superman.xpt@gmail.com>
commit ac0b8b327a5677dc6fecdf353d808161525b1ff0
io_uring: consistently use rcu semantics with sqpoll thread

jira VULN-162982
cve-bf CVE-2025-38106
commit-author Keith Busch <kbusch@kernel.org>
commit c538f400fae22725580842deb2bef546701b64bd
io_uring/sqpoll: don't put task_struct on tctx setup failure

jira VULN-162982
cve-bf CVE-2025-38106
commit-author Jens Axboe <axboe@kernel.dk>
commit f2320f1dd6f6f82cb2c7aff23a12bab537bdea89

kABI check: passed

[0/1] kabi_check_kernel	Check ABI of kernel [ciqlts9_6-CVE-batch-27]	_kabi_check_kernel__x86_64--test--ciqlts9_6-CVE-batch-27
+ dist_git_version=el-9.6
+ local_version=ciqlts9_6-CVE-batch-27
+ arch=x86_64
+ user=pvts
+ buildmachine=x86_64--build--ciqlts9_6
+ virsh_timeout=600
+ ssh_daemon_wait=20
+ src_dir=/mnt/code/kernel-dist-git-el-9.6
+ build_dir=/mnt/build_files/kernel-src-tree-ciqlts9_6-CVE-batch-27
+ sudo chmod +x /data/src/ctrliq-github-haskell/kernel-dist-git-el-9.6/SOURCES/check-kabi
+ ninja-back/virssh.xsh --max 8 --shutdown-on-success --shutdown-on-failure --timeout 600 --ssh-daemon-wait 20 pvts x86_64--build--ciqlts9_6 ''\''/mnt/code/kernel-dist-git-el-9.6/SOURCES/check-kabi'\'' -k '\''/mnt/code/kernel-dist-git-el-9.6/SOURCES/Module.kabi_x86_64'\'' -s '\''/mnt/build_files/kernel-src-tree-ciqlts9_6-CVE-batch-27/Module.symvers'\'''
kABI check passed
+ touch state/kernels/ciqlts9_6-CVE-batch-27/x86_64/kabi_checked

Boot test: passed

boot-test.log

Kselftests: passed relative

Reference

kselftests–ciqlts9_6–run1.log

Patch

kselftests–ciqlts9_6-CVE-batch-27–run1.log
kselftests–ciqlts9_6-CVE-batch-27–run2.log

Comparison

The tests results for the reference and the patch are the same.

$ ktests.xsh diff  kselftests*.log

Column    File
--------  --------------------------------------------
Status0   kselftests--ciqlts9_6--run1.log
Status1   kselftests--ciqlts9_6-CVE-batch-27--run1.log
Status2   kselftests--ciqlts9_6-CVE-batch-27--run2.log

TestCase                                               Status0  Status1  Status2  Summary
bpf:test_cgroup_storage                                pass     pass     pass     same
bpf:test_lru_map                                       pass     pass     pass     same
bpf:test_sock                                          pass     pass     pass     same
bpf:test_sysctl                                        pass     pass     pass     same
bpf:test_tag                                           pass     pass     pass     same
bpf:test_tcpnotify_user                                fail     fail     fail     same
bpf:test_verifier                                      fail     fail     fail     same
breakpoints:breakpoint_test                            pass     pass     pass     same
capabilities:test_execve                               pass     pass     pass     same
clone3:clone3                                          pass     pass     pass     same
clone3:clone3_cap_checkpoint_restore                   pass     pass     pass     same
clone3:clone3_clear_sighand                            pass     pass     pass     same
clone3:clone3_set_tid                                  pass     pass     pass     same
cpu-hotplug:cpu-on-off-test.sh                         pass     pass     pass     same
cpufreq:main.sh                                        fail     fail     fail     same
drivers/dma-buf:udmabuf                                pass     pass     pass     same
drivers/net/bonding:bond-arp-interval-causes-panic.sh  pass     pass     pass     same
drivers/net/bonding:bond-break-lacpdu-tx.sh            fail     fail     fail     same
drivers/net/bonding:bond-eth-type-change.sh            pass     pass     pass     same
drivers/net/bonding:bond-lladdr-target.sh              pass     pass     pass     same
drivers/net/bonding:bond_options.sh                    fail     fail     fail     same
drivers/net/bonding:dev_addr_lists.sh                  pass     pass     pass     same
drivers/net/bonding:mode-1-recovery-updelay.sh         pass     pass     pass     same
drivers/net/bonding:mode-2-recovery-updelay.sh         pass     pass     pass     same
drivers/net/team:dev_addr_lists.sh                     pass     pass     pass     same
exec:binfmt_script                                     pass     pass     pass     same
exec:execveat                                          pass     pass     pass     same
exec:load_address_16777216                             fail     fail     fail     same
exec:load_address_2097152                              pass     pass     pass     same
exec:load_address_4096                                 pass     pass     pass     same
exec:non-regular                                       fail     fail     fail     same
exec:recursion-depth                                   pass     pass     pass     same
filesystems/binderfs:binderfs_test                     fail     fail     fail     same
filesystems/epoll:epoll_wakeup_test                    pass     pass     pass     same
firmware:fw_run_tests.sh                               skip     skip     skip     same
fpu:run_test_fpu.sh                                    skip     skip     skip     same
fpu:test_fpu                                           pass     pass     pass     same
ftrace:ftracetest                                      pass     pass     pass     same
futex:run.sh                                           pass     pass     pass     same
gpio:gpio-mockup.sh                                    fail     fail     fail     same
intel_pstate:run.sh                                    pass     pass     pass     same
iommu:iommufd                                          fail     fail     fail     same
iommu:iommufd_fail_nth                                 pass     pass     pass     same
ipc:msgque                                             pass     pass     pass     same
ir:ir_loopback.sh                                      skip     skip     skip     same
kcmp:kcmp_test                                         pass     pass     pass     same
kexec:test_kexec_file_load.sh                          skip     skip     skip     same
kexec:test_kexec_load.sh                               skip     skip     skip     same
kvm:access_tracking_perf_test                          pass     pass     pass     same
kvm:amx_test                                           fail     fail     fail     same
kvm:cpuid_test                                         fail     fail     fail     same
kvm:cr4_cpuid_sync_test                                fail     fail     fail     same
kvm:debug_regs                                         fail     fail     fail     same
kvm:demand_paging_test                                 pass     pass     pass     same
kvm:dirty_log_page_splitting_test                      fail     fail     fail     same
kvm:dirty_log_perf_test                                pass     pass     pass     same
kvm:dirty_log_test                                     fail     fail     fail     same
kvm:exit_on_emulation_failure_test                     fail     fail     fail     same
kvm:fix_hypercall_test                                 fail     fail     fail     same
kvm:get_msr_index_features                             fail     fail     fail     same
kvm:guest_memfd_test                                   pass     pass     pass     same
kvm:guest_print_test                                   pass     pass     pass     same
kvm:hardware_disable_test                              pass     pass     pass     same
kvm:hyperv_clock                                       fail     fail     fail     same
kvm:hyperv_cpuid                                       fail     fail     fail     same
kvm:hyperv_evmcs                                       fail     fail     fail     same
kvm:hyperv_extended_hypercalls                         fail     fail     fail     same
kvm:hyperv_features                                    fail     fail     fail     same
kvm:hyperv_ipi                                         fail     fail     fail     same
kvm:hyperv_svm_test                                    fail     fail     fail     same
kvm:hyperv_tlb_flush                                   fail     fail     fail     same
kvm:kvm_binary_stats_test                              pass     pass     pass     same
kvm:kvm_clock_test                                     fail     fail     fail     same
kvm:kvm_create_max_vcpus                               pass     pass     pass     same
kvm:kvm_page_table_test                                pass     pass     pass     same
kvm:kvm_pv_test                                        fail     fail     fail     same
kvm:max_guest_memory_test                              pass     pass     pass     same
kvm:max_vcpuid_cap_test                                fail     fail     fail     same
kvm:memslot_modification_stress_test                   pass     pass     pass     same
kvm:memslot_perf_test                                  pass     pass     pass     same
kvm:mmio_warning_test                                  fail     fail     fail     same
kvm:monitor_mwait_test                                 fail     fail     fail     same
kvm:nested_exceptions_test                             fail     fail     fail     same
kvm:nx_huge_pages_test.sh                              fail     fail     fail     same
kvm:platform_info_test                                 fail     fail     fail     same
kvm:pmu_event_filter_test                              fail     fail     fail     same
kvm:private_mem_conversions_test                       fail     fail     fail     same
kvm:private_mem_kvm_exits_test                         fail     fail     fail     same
kvm:recalc_apic_map_test                               fail     fail     fail     same
kvm:rseq_test                                          fail     fail     fail     same
kvm:set_boot_cpu_id                                    fail     fail     fail     same
kvm:set_memory_region_test                             pass     pass     pass     same
kvm:set_sregs_test                                     fail     fail     fail     same
kvm:sev_migrate_tests                                  fail     fail     fail     same
kvm:smaller_maxphyaddr_emulation_test                  fail     fail     fail     same
kvm:smm_test                                           fail     fail     fail     same
kvm:state_test                                         fail     fail     fail     same
kvm:steal_time                                         pass     pass     pass     same
kvm:svm_int_ctl_test                                   fail     fail     fail     same
kvm:svm_nested_shutdown_test                           fail     fail     fail     same
kvm:svm_nested_soft_inject_test                        fail     fail     fail     same
kvm:svm_vmcall_test                                    fail     fail     fail     same
kvm:sync_regs_test                                     fail     fail     fail     same
kvm:system_counter_offset_test                         pass     pass     pass     same
kvm:triple_fault_event_test                            fail     fail     fail     same
kvm:tsc_msrs_test                                      fail     fail     fail     same
kvm:tsc_scaling_sync                                   fail     fail     fail     same
kvm:ucna_injection_test                                fail     fail     fail     same
kvm:userspace_io_test                                  fail     fail     fail     same
kvm:userspace_msr_exit_test                            fail     fail     fail     same
kvm:vmx_apic_access_test                               fail     fail     fail     same
kvm:vmx_close_while_nested_test                        fail     fail     fail     same
kvm:vmx_dirty_log_test                                 fail     fail     fail     same
kvm:vmx_exception_with_invalid_guest_state             fail     fail     fail     same
kvm:vmx_invalid_nested_guest_state                     fail     fail     fail     same
kvm:vmx_msrs_test                                      fail     fail     fail     same
kvm:vmx_nested_tsc_scaling_test                        fail     fail     fail     same
kvm:vmx_pmu_caps_test                                  fail     fail     fail     same
kvm:vmx_preemption_timer_test                          fail     fail     fail     same
kvm:vmx_set_nested_state_test                          fail     fail     fail     same
kvm:vmx_tsc_adjust_test                                fail     fail     fail     same
kvm:xapic_ipi_test                                     fail     fail     fail     same
kvm:xapic_state_test                                   fail     fail     fail     same
kvm:xcr0_cpuid_test                                    fail     fail     fail     same
kvm:xen_shinfo_test                                    fail     fail     fail     same
kvm:xen_vmcall_test                                    fail     fail     fail     same
kvm:xss_msr_test                                       fail     fail     fail     same
landlock:base_test                                     fail     fail     fail     same
landlock:fs_test                                       fail     fail     fail     same
landlock:ptrace_test                                   pass     pass     pass     same
lib:bitmap.sh                                          skip     skip     skip     same
lib:prime_numbers.sh                                   pass     pass     pass     same
lib:printf.sh                                          skip     skip     skip     same
lib:scanf.sh                                           skip     skip     skip     same
lib:strscpy.sh                                         skip     skip     skip     same
livepatch:test-callbacks.sh                            pass     pass     pass     same
livepatch:test-ftrace.sh                               pass     pass     pass     same
livepatch:test-livepatch.sh                            pass     pass     pass     same
livepatch:test-shadow-vars.sh                          pass     pass     pass     same
livepatch:test-state.sh                                pass     pass     pass     same
livepatch:test-sysfs.sh                                pass     pass     pass     same
membarrier:membarrier_test_multi_thread                pass     pass     pass     same
membarrier:membarrier_test_single_thread               pass     pass     pass     same
memfd:memfd_test                                       pass     pass     pass     same
memfd:run_fuse_test.sh                                 pass     pass     pass     same
memfd:run_hugetlbfs_test.sh                            pass     pass     pass     same
memory-hotplug:mem-on-off-test.sh                      pass     pass     pass     same
mincore:mincore_selftest                               fail     fail     fail     same
mount:run_nosymfollow.sh                               pass     pass     pass     same
mount:run_unprivileged_remount.sh                      pass     pass     pass     same
mqueue:mq_open_tests                                   pass     pass     pass     same
mqueue:mq_perf_tests                                   pass     pass     pass     same
nci:nci_dev                                            fail     fail     fail     same
net/forwarding:bridge_locked_port.sh                   fail     fail     fail     same
net/forwarding:bridge_mdb.sh                           fail     fail     fail     same
net/forwarding:bridge_mdb_host.sh                      pass     pass     pass     same
net/forwarding:bridge_mdb_max.sh                       pass     pass     pass     same
net/forwarding:bridge_mdb_port_down.sh                 pass     pass     pass     same
net/forwarding:bridge_mld.sh                           pass     pass     pass     same
net/forwarding:bridge_port_isolation.sh                fail     fail     fail     same
net/forwarding:bridge_sticky_fdb.sh                    pass     pass     pass     same
net/forwarding:bridge_vlan_aware.sh                    fail     fail     fail     same
net/forwarding:bridge_vlan_mcast.sh                    pass     pass     pass     same
net/forwarding:bridge_vlan_unaware.sh                  fail     fail     fail     same
net/forwarding:custom_multipath_hash.sh                fail     fail     fail     same
net/forwarding:ethtool.sh                              skip     skip     skip     same
net/forwarding:ethtool_extended_state.sh               skip     skip     skip     same
net/forwarding:gre_custom_multipath_hash.sh            fail     fail     fail     same
net/forwarding:gre_inner_v4_multipath.sh               fail     fail     fail     same
net/forwarding:gre_multipath.sh                        fail     fail     fail     same
net/forwarding:gre_multipath_nh.sh                     fail     fail     fail     same
net/forwarding:gre_multipath_nh_res.sh                 fail     fail     fail     same
net/forwarding:hw_stats_l3.sh                          skip     skip     skip     same
net/forwarding:hw_stats_l3_gre.sh                      skip     skip     skip     same
net/forwarding:ip6_forward_instats_vrf.sh              skip     skip     skip     same
net/forwarding:ip6gre_custom_multipath_hash.sh         fail     fail     fail     same
net/forwarding:ip6gre_flat.sh                          fail     fail     fail     same
net/forwarding:ip6gre_flat_key.sh                      fail     fail     fail     same
net/forwarding:ip6gre_flat_keys.sh                     fail     fail     fail     same
net/forwarding:ip6gre_hier.sh                          fail     fail     fail     same
net/forwarding:ip6gre_hier_key.sh                      fail     fail     fail     same
net/forwarding:ip6gre_hier_keys.sh                     fail     fail     fail     same
net/forwarding:ip6gre_inner_v4_multipath.sh            fail     fail     fail     same
net/forwarding:ipip_flat_gre.sh                        fail     fail     fail     same
net/forwarding:ipip_flat_gre_key.sh                    fail     fail     fail     same
net/forwarding:ipip_flat_gre_keys.sh                   fail     fail     fail     same
net/forwarding:ipip_hier_gre.sh                        fail     fail     fail     same
net/forwarding:ipip_hier_gre_key.sh                    fail     fail     fail     same
net/forwarding:local_termination.sh                    skip     skip     skip     same
net/forwarding:loopback.sh                             skip     skip     skip     same
net/forwarding:mirror_gre.sh                           pass     pass     pass     same
net/forwarding:mirror_gre_bound.sh                     pass     pass     pass     same
net/forwarding:mirror_gre_bridge_1d.sh                 pass     pass     pass     same
net/forwarding:mirror_gre_bridge_1q.sh                 pass     pass     pass     same
net/forwarding:mirror_gre_bridge_1q_lag.sh             pass     pass     pass     same
net/forwarding:mirror_gre_changes.sh                   pass     pass     pass     same
net/forwarding:mirror_gre_flower.sh                    pass     pass     pass     same
net/forwarding:mirror_gre_lag_lacp.sh                  pass     pass     pass     same
net/forwarding:mirror_gre_neigh.sh                     pass     pass     pass     same
net/forwarding:mirror_gre_nh.sh                        pass     pass     pass     same
net/forwarding:mirror_gre_vlan.sh                      pass     pass     pass     same
net/forwarding:mirror_vlan.sh                          pass     pass     pass     same
net/forwarding:no_forwarding.sh                        pass     pass     pass     same
net/forwarding:pedit_dsfield.sh                        fail     fail     fail     same
net/forwarding:pedit_ip.sh                             fail     fail     fail     same
net/forwarding:pedit_l4port.sh                         fail     fail     fail     same
net/forwarding:q_in_vni_ipv6.sh                        fail     fail     fail     same
net/forwarding:router.sh                               skip     skip     skip     same
net/forwarding:router_bridge.sh                        fail     fail     fail     same
net/forwarding:router_bridge_1d.sh                     fail     fail     fail     same
net/forwarding:router_bridge_pvid_vlan_upper.sh        fail     fail     fail     same
net/forwarding:router_bridge_vlan.sh                   fail     fail     fail     same
net/forwarding:router_bridge_vlan_upper.sh             fail     fail     fail     same
net/forwarding:router_bridge_vlan_upper_pvid.sh        fail     fail     fail     same
net/forwarding:router_broadcast.sh                     fail     fail     fail     same
net/forwarding:router_mpath_nh.sh                      fail     fail     fail     same
net/forwarding:router_mpath_nh_res.sh                  fail     fail     fail     same
net/forwarding:router_multicast.sh                     skip     skip     skip     same
net/forwarding:router_multipath.sh                     fail     fail     fail     same
net/forwarding:router_nh.sh                            fail     fail     fail     same
net/forwarding:router_vid_1.sh                         fail     fail     fail     same
net/forwarding:skbedit_priority.sh                     fail     fail     fail     same
net/forwarding:tc_chains.sh                            pass     pass     pass     same
net/forwarding:tc_flower.sh                            pass     pass     pass     same
net/forwarding:tc_flower_cfm.sh                        pass     pass     pass     same
net/forwarding:tc_flower_l2_miss.sh                    fail     fail     fail     same
net/forwarding:tc_flower_router.sh                     pass     pass     pass     same
net/forwarding:tc_mpls_l2vpn.sh                        fail     fail     fail     same
net/forwarding:tc_shblocks.sh                          pass     pass     pass     same
net/forwarding:tc_tunnel_key.sh                        pass     pass     pass     same
net/forwarding:tc_vlan_modify.sh                       fail     fail     fail     same
net/forwarding:vxlan_asymmetric.sh                     fail     fail     fail     same
net/forwarding:vxlan_asymmetric_ipv6.sh                fail     fail     fail     same
net/forwarding:vxlan_bridge_1d.sh                      fail     fail     fail     same
net/forwarding:vxlan_bridge_1d_port_8472.sh            fail     fail     fail     same
net/forwarding:vxlan_bridge_1d_port_8472_ipv6.sh       fail     fail     fail     same
net/forwarding:vxlan_bridge_1q.sh                      fail     fail     fail     same
net/forwarding:vxlan_bridge_1q_ipv6.sh                 fail     fail     fail     same
net/forwarding:vxlan_bridge_1q_port_8472.sh            fail     fail     fail     same
net/forwarding:vxlan_bridge_1q_port_8472_ipv6.sh       fail     fail     fail     same
net/forwarding:vxlan_symmetric.sh                      fail     fail     fail     same
net/forwarding:vxlan_symmetric_ipv6.sh                 fail     fail     fail     same
net/hsr:hsr_ping.sh                                    fail     fail     fail     same
net/mptcp:diag.sh                                      pass     pass     pass     same
net/mptcp:mptcp_connect.sh                             pass     pass     pass     same
net/mptcp:mptcp_sockopt.sh                             skip     skip     skip     same
net/mptcp:pm_netlink.sh                                pass     pass     pass     same
net:altnames.sh                                        pass     pass     pass     same
net:bareudp.sh                                         pass     pass     pass     same
net:big_tcp.sh                                         skip     skip     skip     same
net:cmsg_so_mark.sh                                    pass     pass     pass     same
net:devlink_port_split.py                              skip     skip     skip     same
net:drop_monitor_tests.sh                              skip     skip     skip     same
net:fcnal-test.sh                                      skip     skip     skip     same
net:fib-onlink-tests.sh                                pass     pass     pass     same
net:fib_nexthop_multiprefix.sh                         pass     pass     pass     same
net:fib_nexthop_nongw.sh                               pass     pass     pass     same
net:fib_rule_tests.sh                                  pass     pass     pass     same
net:fib_tests.sh                                       fail     fail     fail     same
net:fin_ack_lat.sh                                     pass     pass     pass     same
net:gre_gso.sh                                         pass     pass     pass     same
net:icmp.sh                                            fail     fail     fail     same
net:icmp_redirect.sh                                   pass     pass     pass     same
net:io_uring_zerocopy_tx.sh                            fail     fail     fail     same
net:ip6_gre_headroom.sh                                pass     pass     pass     same
net:ipv6_flowlabel.sh                                  pass     pass     pass     same
net:l2_tos_ttl_inherit.sh                              skip     skip     skip     same
net:l2tp.sh                                            pass     pass     pass     same
net:msg_zerocopy.sh                                    pass     pass     pass     same
net:netdevice.sh                                       pass     pass     pass     same
net:pmtu.sh                                            fail     fail     fail     same
net:psock_snd.sh                                       pass     pass     pass     same
net:reuseaddr_conflict                                 pass     pass     pass     same
net:reuseaddr_ports_exhausted.sh                       pass     pass     pass     same
net:reuseport_bpf                                      pass     pass     pass     same
net:reuseport_bpf_cpu                                  pass     pass     pass     same
net:reuseport_bpf_numa                                 pass     pass     pass     same
net:reuseport_dualstack                                pass     pass     pass     same
net:route_localnet.sh                                  pass     pass     pass     same
net:rps_default_mask.sh                                pass     pass     pass     same
net:rtnetlink.sh                                       skip     skip     skip     same
net:run_afpackettests                                  pass     pass     pass     same
net:run_netsocktests                                   pass     pass     pass     same
net:rxtimestamp.sh                                     pass     pass     pass     same
net:so_txtime.sh                                       pass     pass     pass     same
net:srv6_end_next_csid_l3vpn_test.sh                   pass     pass     pass     same
net:srv6_hencap_red_l3vpn_test.sh                      pass     pass     pass     same
net:srv6_hl2encap_red_l2vpn_test.sh                    pass     pass     pass     same
net:stress_reuseport_listen.sh                         pass     pass     pass     same
net:tcp_fastopen_backup_key.sh                         pass     pass     pass     same
net:test_blackhole_dev.sh                              fail     fail     fail     same
net:test_bpf.sh                                        pass     pass     pass     same
net:test_bridge_neigh_suppress.sh                      skip     skip     skip     same
net:test_vxlan_fdb_changelink.sh                       pass     pass     pass     same
net:test_vxlan_under_vrf.sh                            pass     pass     pass     same
net:tls                                                pass     pass     pass     same
net:traceroute.sh                                      pass     pass     pass     same
net:udpgro.sh                                          fail     fail     fail     same
net:udpgro_bench.sh                                    fail     fail     fail     same
net:udpgso.sh                                          fail     fail     fail     same
net:unicast_extensions.sh                              pass     pass     pass     same
net:veth.sh                                            fail     fail     fail     same
net:vrf-xfrm-tests.sh                                  pass     pass     pass     same
net:vrf_route_leaking.sh                               pass     pass     pass     same
net:vrf_strict_mode_test.sh                            pass     pass     pass     same
netfilter:bridge_brouter.sh                            skip     skip     skip     same
netfilter:conntrack_icmp_related.sh                    skip     skip     skip     same
netfilter:conntrack_tcp_unreplied.sh                   skip     skip     skip     same
netfilter:conntrack_vrf.sh                             skip     skip     skip     same
netfilter:ipvs.sh                                      pass     pass     pass     same
netfilter:nf_nat_edemux.sh                             skip     skip     skip     same
netfilter:nft_audit.sh                                 skip     skip     skip     same
netfilter:nft_concat_range.sh                          fail     fail     fail     same
netfilter:nft_conntrack_helper.sh                      skip     skip     skip     same
netfilter:nft_fib.sh                                   skip     skip     skip     same
netfilter:nft_flowtable.sh                             skip     skip     skip     same
netfilter:nft_meta.sh                                  skip     skip     skip     same
netfilter:nft_nat.sh                                   skip     skip     skip     same
netfilter:nft_queue.sh                                 skip     skip     skip     same
netfilter:rpath.sh                                     skip     skip     skip     same
nsfs:owner                                             pass     pass     pass     same
nsfs:pidns                                             pass     pass     pass     same
pid_namespace:regression_enomem                        pass     pass     pass     same
pidfd:pidfd_fdinfo_test                                pass     pass     pass     same
pidfd:pidfd_getfd_test                                 pass     pass     pass     same
pidfd:pidfd_open_test                                  pass     pass     pass     same
pidfd:pidfd_poll_test                                  pass     pass     pass     same
pidfd:pidfd_setns_test                                 pass     pass     pass     same
pidfd:pidfd_test                                       pass     pass     pass     same
pidfd:pidfd_wait                                       pass     pass     pass     same
proc:fd-001-lookup                                     pass     pass     pass     same
proc:fd-002-posix-eq                                   pass     pass     pass     same
proc:fd-003-kthread                                    pass     pass     pass     same
proc:proc-fsconfig-hidepid                             pass     pass     pass     same
proc:proc-loadavg-001                                  pass     pass     pass     same
proc:proc-multiple-procfs                              pass     pass     pass     same
proc:proc-self-map-files-001                           pass     pass     pass     same
proc:proc-self-map-files-002                           pass     pass     pass     same
proc:proc-self-syscall                                 pass     pass     pass     same
proc:proc-self-wchan                                   pass     pass     pass     same
proc:proc-subset-pid                                   pass     pass     pass     same
proc:proc-uptime-002                                   pass     pass     pass     same
proc:read                                              pass     pass     pass     same
proc:self                                              pass     pass     pass     same
proc:setns-dcache                                      pass     pass     pass     same
proc:setns-sysvipc                                     pass     pass     pass     same
proc:thread-self                                       pass     pass     pass     same
pstore:pstore_post_reboot_tests                        skip     skip     skip     same
pstore:pstore_tests                                    fail     fail     fail     same
ptrace:get_syscall_info                                pass     pass     pass     same
ptrace:peeksiginfo                                     pass     pass     pass     same
ptrace:vmaccess                                        fail     fail     fail     same
rlimits:rlimits-per-userns                             pass     pass     pass     same
rseq:basic_percpu_ops_test                             pass     pass     pass     same
rseq:basic_test                                        pass     pass     pass     same
rseq:param_test                                        pass     pass     pass     same
rseq:param_test_benchmark                              pass     pass     pass     same
rseq:param_test_compare_twice                          pass     pass     pass     same
rseq:run_param_test.sh                                 pass     pass     pass     same
seccomp:seccomp_benchmark                              pass     pass     pass     same
seccomp:seccomp_bpf                                    pass     pass     pass     same
sgx:test_sgx                                           fail     fail     fail     same
sigaltstack:sas                                        pass     pass     pass     same
size:get_size                                          pass     pass     pass     same
splice:default_file_splice_read.sh                     pass     pass     pass     same
splice:short_splice_read.sh                            fail     fail     fail     same
static_keys:test_static_keys.sh                        skip     skip     skip     same
syscall_user_dispatch:sud_benchmark                    pass     pass     pass     same
syscall_user_dispatch:sud_test                         pass     pass     pass     same
tc-testing:tdc.sh                                      fail     fail     fail     same
tdx:tdx_guest_test                                     fail     fail     fail     same
timens:clock_nanosleep                                 pass     pass     pass     same
timens:exec                                            pass     pass     pass     same
timens:futex                                           pass     pass     pass     same
timens:procfs                                          pass     pass     pass     same
timens:timens                                          pass     pass     pass     same
timens:timer                                           pass     pass     pass     same
timens:timerfd                                         pass     pass     pass     same
timens:vfork_exec                                      pass     pass     pass     same
timers:inconsistency-check                             pass     pass     pass     same
timers:mqueue-lat                                      pass     pass     pass     same
timers:nanosleep                                       pass     pass     pass     same
timers:nsleep-lat                                      pass     pass     pass     same
timers:posix_timers                                    pass     pass     pass     same
timers:rtcpie                                          pass     pass     pass     same
timers:set-timer-lat                                   pass     pass     pass     same
timers:threadtest                                      pass     pass     pass     same
tmpfs:bug-link-o-tmpfile                               pass     pass     pass     same
tpm2:test_smoke.sh                                     skip     skip     skip     same
tpm2:test_space.sh                                     skip     skip     skip     same
tty:tty_tstamp_update                                  skip     skip     skip     same
vDSO:vdso_standalone_test_x86                          pass     pass     pass     same
vDSO:vdso_test_abi                                     pass     pass     pass     same
vDSO:vdso_test_clock_getres                            pass     pass     pass     same
vDSO:vdso_test_correctness                             pass     pass     pass     same
vDSO:vdso_test_getcpu                                  pass     pass     pass     same
vDSO:vdso_test_gettimeofday                            pass     pass     pass     same
x86:amx_64                                             fail     fail     fail     same
x86:check_initial_reg_state_64                         fail     fail     fail     same
x86:corrupt_xstate_header_64                           fail     fail     fail     same
x86:fsgsbase_64                                        fail     fail     fail     same
x86:fsgsbase_restore_64                                fail     fail     fail     same
x86:ioperm_64                                          fail     fail     fail     same
x86:iopl_64                                            fail     fail     fail     same
x86:lam_64                                             fail     fail     fail     same
x86:mov_ss_trap_64                                     fail     fail     fail     same
x86:sigaltstack_64                                     fail     fail     fail     same
x86:sigreturn_64                                       fail     fail     fail     same
x86:single_step_syscall_64                             fail     fail     fail     same
x86:syscall_arg_fault_64                               fail     fail     fail     same
x86:syscall_nt_64                                      fail     fail     fail     same
x86:syscall_numbering_64                               fail     fail     fail     same
x86:sysret_rip_64                                      fail     fail     fail     same
x86:sysret_ss_attrs_64                                 fail     fail     fail     same
x86:test_mremap_vdso_64                                fail     fail     fail     same
x86:test_vsyscall_64                                   fail     fail     fail     same
zram:zram.sh                                           pass     pass     pass     same

jira VULN-161965
cve CVE-2025-39966
commit-author Jason Gunthorpe <jgg@ziepe.ca>
commit 4e034bf
upstream-diff |
  drivers/iommu/iommufd/main.c
        - The modified `IOMMUFD_OBJ_FAULT' entry can be found at different
          place than in the upstream because of the missing
          442003f ("iommufd: Keep
          OBJ/IOCTL lists in an alphabetical order")
        - Ignored the `IOMMUFD_OBJ_VEVENTQ' entry in the
          `iommufd_object_ops' array, which was introduced in the
          non-backported commit e36ba5a
          ("iommufd: Add IOMMUFD_OBJ_VEVENTQ and
          IOMMUFD_CMD_VEVENTQ_ALLOC")
        - Passed `filep' and `obj' to the `IOMMUFD_FILE_OFFSET' macro
          instead of `common.filep' and `common.obj' as in the upstream
          because these fields of `iommufd_fault' have not yet been
          extracted to the `common' sub-struct as in the upstream
          (5426a78 ("iommufd: Abstract an
          iommufd_eventq from iommufd_fault"))
  drivers/iommu/iommufd/fault.c
        - Modified drivers/iommu/iommufd/fault.c instead of upstream's
          drivers/iommu/iommufd/eventq.c - it's the same file just renamed
          in the non-backported 0507f33
          ("iommufd: Rename fault.c to eventq.c")
        - Accounted for the missing
          927dabc ("iommufd/fault: Add an
          iommufd_fault_init() helper"): implemented the omission of
          `fput()' call on failure in the `iommufd_fault_alloc()' function
          instead of `iommufd_eventq_init()' (named `iommufd_fault_init()'
          at the moment of 927dabc).
        - Ignored change to the non-existing function
          `iommufd_veventq_alloc()' only introduced in e36ba5a.

fput() doesn't actually call file_operations release() synchronously, it
puts the file on a work queue and it will be released eventually.

This is normally fine, except for iommufd the file and the iommufd_object
are tied to gether. The file has the object as it's private_data and holds
a users refcount, while the object is expected to remain alive as long as
the file is.

When the allocation of a new object aborts before installing the file it
will fput() the file and then go on to immediately kfree() the obj. This
causes a UAF once the workqueue completes the fput() and tries to
decrement the users refcount.

Fix this by putting the core code in charge of the file lifetime, and call
__fput_sync() during abort to ensure that release() is called before
kfree. __fput_sync() is a bit too tricky to open code in all the object
implementations. Instead the objects tell the core code where the file
pointer is and the core will take care of the life cycle.

If the object is successfully allocated then the file will hold a users
refcount and the iommufd_object cannot be destroyed.

It is worth noting that close(); ioctl(IOMMU_DESTROY); doesn't have an
issue because close() is already using a synchronous version of fput().

The UAF looks like this:

    BUG: KASAN: slab-use-after-free in iommufd_eventq_fops_release+0x45/0xc0 drivers/iommu/iommufd/eventq.c:376
    Write of size 4 at addr ffff888059c97804 by task syz.0.46/6164

    CPU: 0 UID: 0 PID: 6164 Comm: syz.0.46 Not tainted syzkaller #0 PREEMPT(full)
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/18/2025
    Call Trace:
     <TASK>
     __dump_stack lib/dump_stack.c:94 [inline]
     dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120
     print_address_description mm/kasan/report.c:378 [inline]
     print_report+0xcd/0x630 mm/kasan/report.c:482
     kasan_report+0xe0/0x110 mm/kasan/report.c:595
     check_region_inline mm/kasan/generic.c:183 [inline]
     kasan_check_range+0x100/0x1b0 mm/kasan/generic.c:189
     instrument_atomic_read_write include/linux/instrumented.h:96 [inline]
     atomic_fetch_sub_release include/linux/atomic/atomic-instrumented.h:400 [inline]
     __refcount_dec include/linux/refcount.h:455 [inline]
     refcount_dec include/linux/refcount.h:476 [inline]
     iommufd_eventq_fops_release+0x45/0xc0 drivers/iommu/iommufd/eventq.c:376
     __fput+0x402/0xb70 fs/file_table.c:468
     task_work_run+0x14d/0x240 kernel/task_work.c:227
     resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
     exit_to_user_mode_loop+0xeb/0x110 kernel/entry/common.c:43
     exit_to_user_mode_prepare include/linux/irq-entry-common.h:225 [inline]
     syscall_exit_to_user_mode_work include/linux/entry-common.h:175 [inline]
     syscall_exit_to_user_mode include/linux/entry-common.h:210 [inline]
     do_syscall_64+0x41c/0x4c0 arch/x86/entry/syscall_64.c:100
     entry_SYSCALL_64_after_hwframe+0x77/0x7f

Link: https://patch.msgid.link/r/1-v1-02cd136829df+31-iommufd_syz_fput_jgg@nvidia.com
	Cc: stable@vger.kernel.org
Fixes: 07838f7 ("iommufd: Add iommufd fault object")
	Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
	Reviewed-by: Nirmoy Das <nirmoyd@nvidia.com>
	Reviewed-by: Kevin Tian <kevin.tian@intel.com>
	Tested-by: Nicolin Chen <nicolinc@nvidia.com>
	Reported-by: syzbot+80620e2d0d0a33b09f93@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/r/68c8583d.050a0220.2ff435.03a2.GAE@google.com
	Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
(cherry picked from commit 4e034bf)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162992
cve CVE-2025-38129
commit-author Dong Chenchen <dongchenchen2@huawei.com>
commit 271683b
upstream-diff Accounted in `page_pool_recycle_in_ring()' for the missing
  4dec64c ("page_pool: convert to use
  netmem")

syzbot reported a uaf in page_pool_recycle_in_ring:

BUG: KASAN: slab-use-after-free in lock_release+0x151/0xa30 kernel/locking/lockdep.c:5862
Read of size 8 at addr ffff8880286045a0 by task syz.0.284/6943

CPU: 0 UID: 0 PID: 6943 Comm: syz.0.284 Not tainted 6.13.0-rc3-syzkaller-gdfa94ce54f41 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:94 [inline]
 dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120
 print_address_description mm/kasan/report.c:378 [inline]
 print_report+0x169/0x550 mm/kasan/report.c:489
 kasan_report+0x143/0x180 mm/kasan/report.c:602
 lock_release+0x151/0xa30 kernel/locking/lockdep.c:5862
 __raw_spin_unlock_bh include/linux/spinlock_api_smp.h:165 [inline]
 _raw_spin_unlock_bh+0x1b/0x40 kernel/locking/spinlock.c:210
 spin_unlock_bh include/linux/spinlock.h:396 [inline]
 ptr_ring_produce_bh include/linux/ptr_ring.h:164 [inline]
 page_pool_recycle_in_ring net/core/page_pool.c:707 [inline]
 page_pool_put_unrefed_netmem+0x748/0xb00 net/core/page_pool.c:826
 page_pool_put_netmem include/net/page_pool/helpers.h:323 [inline]
 page_pool_put_full_netmem include/net/page_pool/helpers.h:353 [inline]
 napi_pp_put_page+0x149/0x2b0 net/core/skbuff.c:1036
 skb_pp_recycle net/core/skbuff.c:1047 [inline]
 skb_free_head net/core/skbuff.c:1094 [inline]
 skb_release_data+0x6c4/0x8a0 net/core/skbuff.c:1125
 skb_release_all net/core/skbuff.c:1190 [inline]
 __kfree_skb net/core/skbuff.c:1204 [inline]
 sk_skb_reason_drop+0x1c9/0x380 net/core/skbuff.c:1242
 kfree_skb_reason include/linux/skbuff.h:1263 [inline]
 __skb_queue_purge_reason include/linux/skbuff.h:3343 [inline]

root cause is:

page_pool_recycle_in_ring
  ptr_ring_produce
    spin_lock(&r->producer_lock);
    WRITE_ONCE(r->queue[r->producer++], ptr)
      //recycle last page to pool
				page_pool_release
				  page_pool_scrub
				    page_pool_empty_ring
				      ptr_ring_consume
				      page_pool_return_page  //release all page
				  __page_pool_destroy
				     free_percpu(pool->recycle_stats);
				     free(pool) //free

     spin_unlock(&r->producer_lock); //pool->ring uaf read
  recycle_stat_inc(pool, ring);

page_pool can be free while page pool recycle the last page in ring.
Add producer-lock barrier to page_pool_release to prevent the page
pool from being free before all pages have been recycled.

recycle_stat_inc() is empty when CONFIG_PAGE_POOL_STATS is not
enabled, which will trigger Wempty-body build warning. Add definition
for pool stat macro to fix warning.

	Suggested-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/netdev/20250513083123.3514193-1-dongchenchen2@huawei.com
Fixes: ff7d6b2 ("page_pool: refurbish version of page_pool code")
	Reported-by: syzbot+204a4382fcb3311f3858@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=204a4382fcb3311f3858
	Signed-off-by: Dong Chenchen <dongchenchen2@huawei.com>
	Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
	Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250527114152.3119109-1-dongchenchen2@huawei.com
	Signed-off-by: Jakub Kicinski <kuba@kernel.org>
(cherry picked from commit 271683b)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-161581
cve CVE-2025-39881
commit-author Chen Ridong <chenridong@huawei.com>
commit 3c9ba27
upstream-diff Omitted in the `kernfs_fop_llseek()' function the
  `kernfs_get_active()' -> `kernfs_get_active_of()' replacement - it was
  introduced in the non-backported commit
  0fedefd ("kernfs: sysfs: support
  custom llseek method for sysfs entries")

A use-after-free (UAF) vulnerability was identified in the PSI (Pressure
Stall Information) monitoring mechanism:

BUG: KASAN: slab-use-after-free in psi_trigger_poll+0x3c/0x140
Read of size 8 at addr ffff3de3d50bd308 by task systemd/1

psi_trigger_poll+0x3c/0x140
cgroup_pressure_poll+0x70/0xa0
cgroup_file_poll+0x8c/0x100
kernfs_fop_poll+0x11c/0x1c0
ep_item_poll.isra.0+0x188/0x2c0

Allocated by task 1:
cgroup_file_open+0x88/0x388
kernfs_fop_open+0x73c/0xaf0
do_dentry_open+0x5fc/0x1200
vfs_open+0xa0/0x3f0
do_open+0x7e8/0xd08
path_openat+0x2fc/0x6b0
do_filp_open+0x174/0x368

Freed by task 8462:
cgroup_file_release+0x130/0x1f8
kernfs_drain_open_files+0x17c/0x440
kernfs_drain+0x2dc/0x360
kernfs_show+0x1b8/0x288
cgroup_file_show+0x150/0x268
cgroup_pressure_write+0x1dc/0x340
cgroup_file_write+0x274/0x548

Reproduction Steps:
1. Open test/cpu.pressure and establish epoll monitoring
2. Disable monitoring: echo 0 > test/cgroup.pressure
3. Re-enable monitoring: echo 1 > test/cgroup.pressure

The race condition occurs because:
1. When cgroup.pressure is disabled (echo 0 > cgroup.pressure), it:
   - Releases PSI triggers via cgroup_file_release()
   - Frees of->priv through kernfs_drain_open_files()
2. While epoll still holds reference to the file and continues polling
3. Re-enabling (echo 1 > cgroup.pressure) accesses freed of->priv

epolling			disable/enable cgroup.pressure
fd=open(cpu.pressure)
while(1)
...
epoll_wait
kernfs_fop_poll
kernfs_get_active = true	echo 0 > cgroup.pressure
...				cgroup_file_show
				kernfs_show
				// inactive kn
				kernfs_drain_open_files
				cft->release(of);
				kfree(ctx);
				...
kernfs_get_active = false
				echo 1 > cgroup.pressure
				kernfs_show
				kernfs_activate_one(kn);
kernfs_fop_poll
kernfs_get_active = true
cgroup_file_poll
psi_trigger_poll
// UAF
...
end: close(fd)

To address this issue, introduce kernfs_get_active_of() for kernfs open
files to obtain active references. This function will fail if the open file
has been released. Replace kernfs_get_active() with kernfs_get_active_of()
to prevent further operations on released file descriptors.

Fixes: 34f26a1 ("sched/psi: Per-cgroup PSI accounting disable/re-enable interface")
	Cc: stable <stable@kernel.org>
	Reported-by: Zhang Zhaotian <zhangzhaotian@huawei.com>
	Signed-off-by: Chen Ridong <chenridong@huawei.com>
	Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20250822070715.1565236-2-chenridong@huaweicloud.com
	Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 3c9ba27)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162982
cve-pre CVE-2025-38106
commit-author Jens Axboe <axboe@kernel.dk>
commit e4956dc

There's a debug check in io_sq_thread_park() checking if it's the SQPOLL
thread itself calling park. KCSAN warns about this, as we should not be
reading sqd->thread outside of sqd->lock.

Just silence this with data_race(). The pointer isn't used for anything
but this debug check.

	Reported-by: syzbot+2b946a3fd80caf971b21@syzkaller.appspotmail.com
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit e4956dc)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162982
cve-pre CVE-2025-38106
commit-author Pavel Begunkov <asml.silence@gmail.com>
commit e33ac68

BUG: KASAN: slab-use-after-free in __lock_acquire+0x370b/0x4a10 kernel/locking/lockdep.c:5089
Call Trace:
<TASK>
...
_raw_spin_lock_irqsave+0x3d/0x60 kernel/locking/spinlock.c:162
class_raw_spinlock_irqsave_constructor include/linux/spinlock.h:551 [inline]
try_to_wake_up+0xb5/0x23c0 kernel/sched/core.c:4205
io_sq_thread_park+0xac/0xe0 io_uring/sqpoll.c:55
io_sq_thread_finish+0x6b/0x310 io_uring/sqpoll.c:96
io_sq_offload_create+0x162/0x11d0 io_uring/sqpoll.c:497
io_uring_create io_uring/io_uring.c:3724 [inline]
io_uring_setup+0x1728/0x3230 io_uring/io_uring.c:3806
...

Kun Hu reports that the SQPOLL creating error path has UAF, which
happens if io_uring_alloc_task_context() fails and then io_sq_thread()
manages to run and complete before the rest of error handling code,
which means io_sq_thread_finish() is looking at already killed task.

Note that this is mostly theoretical, requiring fault injection on
the allocation side to trigger in practice.

	Cc: stable@vger.kernel.org
	Reported-by: Kun Hu <huk23@m.fudan.edu.cn>
	Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/0f2f1aa5729332612bd01fe0f2f385fd1f06ce7c.1735231717.git.asml.silence@gmail.com
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit e33ac68)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
@PlaidCat PlaidCat requested a review from a team April 14, 2026 20:48
@github-actions
Copy link
Copy Markdown

🤖 Validation Checks In Progress Workflow run: https://github.com/ctrliq/kernel-src-tree/actions/runs/24422566950

@github-actions
Copy link
Copy Markdown

🔍 Upstream Linux Kernel Commit Check

  • ⚠️ PR commit b30621f5cf6 (io_uring/sqpoll: fix sqpoll error handling races) does not reference a CVE but
    upstream commit e33ac68e5e21 is associated with CVE-2024-56762

This is an automated message from the kernel commit checker workflow.

@github-actions
Copy link
Copy Markdown

🔍 Interdiff Analysis

  • ⚠️ PR commit 15b62393d32 (iommufd: Fix race during abort for file descriptors) → upstream 4e034bf045b1
    Differences found:
================================================================================
*    DELTA DIFFERENCES - code changes that differ between the patches          *
================================================================================

--- b/drivers/iommu/iommufd/main.c
+++ b/drivers/iommu/iommufd/main.c
@@ -545,7 +544,7 @@
 	},
 	[IOMMUFD_OBJ_FAULT] = {
 		.destroy = iommufd_fault_destroy,
-		IOMMUFD_FILE_OFFSET(struct iommufd_fault, filep, obj),
+		IOMMUFD_FILE_OFFSET(struct iommufd_fault, common.filep, common.obj),
 	},
 #ifdef CONFIG_IOMMUFD_TEST
 	[IOMMUFD_OBJ_SELFTEST] = {

################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/drivers/iommu/iommufd/main.c
+++ b/drivers/iommu/iommufd/main.c
@@ -23,6 +23,7 @@
 #include "iommufd_test.h"
 
 struct iommufd_object_ops {
+	size_t file_offset;
 	void (*pre_destroy)(struct iommufd_object *obj);
 	void (*destroy)(struct iommufd_object *obj);
 	void (*abort)(struct iommufd_object *obj);
@@ -718,6 +746,7 @@
 	[IOMMUFD_OBJ_VEVENTQ] = {
 		.destroy = iommufd_veventq_destroy,
 		.abort = iommufd_veventq_abort,
+		IOMMUFD_FILE_OFFSET(struct iommufd_veventq, common.filep, common.obj),
 	},
 	[IOMMUFD_OBJ_VIOMMU] = {
 		.destroy = iommufd_viommu_destroy,

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/drivers/iommu/iommufd/main.c
+++ b/drivers/iommu/iommufd/main.c
@@ -24,4 +24,5 @@
 
 struct iommufd_object_ops {
+	void (*pre_destroy)(struct iommufd_object *obj);
 	void (*destroy)(struct iommufd_object *obj);
 	void (*abort)(struct iommufd_object *obj);
@@ -495,6 +529,6 @@
 }
-EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, IOMMUFD);
+EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, "IOMMUFD");
 
 static const struct iommufd_object_ops iommufd_object_ops[] = {
 	[IOMMUFD_OBJ_ACCESS] = {
 		.destroy = iommufd_access_destroy_object,
@@ -515,6 +685,3 @@
 	},
-	[IOMMUFD_OBJ_FAULT] = {
-		.destroy = iommufd_fault_destroy,
-	},
-#ifdef CONFIG_IOMMUFD_TEST
-	[IOMMUFD_OBJ_SELFTEST] = {
+	[IOMMUFD_OBJ_VIOMMU] = {
+		.destroy = iommufd_viommu_destroy,

================================================================================
*    ONLY IN PATCH1 - files not modified by patch2                             *
================================================================================

--- b/drivers/iommu/iommufd/fault.c
+++ a/drivers/iommu/iommufd/fault.c
@@ -402,7 +402,6 @@
 	spin_lock_init(&fault->lock);
 	init_waitqueue_head(&fault->wait_queue);
 
-	/* The filep is fput() by the core code during failure */
 	filep = anon_inode_getfile("[iommufd-pgfault]", &iommufd_fault_fops,
 				   fault, O_RDWR);
 	if (IS_ERR(filep)) {
@@ -417,7 +416,7 @@
 	fdno = get_unused_fd_flags(O_CLOEXEC);
 	if (fdno < 0) {
 		rc = fdno;
+		goto out_fput;
-		goto out_abort;
 	}
 
 	cmd->out_fault_id = fault->obj.id;
@@ -433,6 +432,8 @@
 	return 0;
 out_put_fdno:
 	put_unused_fd(fdno);
+out_fput:
+	fput(filep);
 out_abort:
 	iommufd_object_abort_and_destroy(ucmd->ictx, &fault->obj);
 

================================================================================
*    ONLY IN PATCH2 - files not modified by patch1                             *
================================================================================

--- a/drivers/iommu/iommufd/eventq.c
+++ b/drivers/iommu/iommufd/eventq.c
@@ -393,12 +393,12 @@ static int iommufd_eventq_init(struct iommufd_eventq *eventq, char *name,
 			       const struct file_operations *fops)
 {
 	struct file *filep;
-	int fdno;
 
 	spin_lock_init(&eventq->lock);
 	INIT_LIST_HEAD(&eventq->deliver);
 	init_waitqueue_head(&eventq->wait_queue);
 
+	/* The filep is fput() by the core code during failure */
 	filep = anon_inode_getfile(name, fops, eventq, O_RDWR);
 	if (IS_ERR(filep))
 		return PTR_ERR(filep);
@@ -408,10 +408,7 @@ static int iommufd_eventq_init(struct iommufd_eventq *eventq, char *name,
 	eventq->filep = filep;
 	refcount_inc(&eventq->obj.users);
 
-	fdno = get_unused_fd_flags(O_CLOEXEC);
-	if (fdno < 0)
-		fput(filep);
-	return fdno;
+	return get_unused_fd_flags(O_CLOEXEC);
 }
 
 static const struct file_operations iommufd_fault_fops =
@@ -452,7 +449,6 @@ int iommufd_fault_alloc(struct iommufd_ucmd *ucmd)
 	return 0;
 out_put_fdno:
 	put_unused_fd(fdno);
-	fput(fault->common.filep);
 	return rc;
 }
 
@@ -536,7 +532,6 @@ int iommufd_veventq_alloc(struct iommufd_ucmd *ucmd)
 
 out_put_fdno:
 	put_unused_fd(fdno);
-	fput(veventq->common.filep);
 out_abort:
 	iommufd_object_abort_and_destroy(ucmd->ictx, &veventq->common.obj);
 out_unlock_veventqs:
  • ⚠️ PR commit b9c38ea8cc5 (page_pool: Fix use-after-free in page_pool_recycle_in_ring) → upstream 271683bb2cf3
    Differences found:
================================================================================
*    DELTA DIFFERENCES - code changes that differ between the patches          *
================================================================================

--- b/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -678,11 +678,16 @@
 
 static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page)
 {
-	bool in_softirq, ret;
+	int ret;
+	/* BH protection not needed if current is softirq */
+	if (in_softirq())
+		ret = ptr_ring_produce(&pool->ring, page);
+	else
+		ret = ptr_ring_produce_bh(&pool->ring, page);
 
 	/* BH protection not needed if current is softirq */
 	in_softirq = page_pool_producer_lock(pool);
-	ret = !__ptr_ring_produce(&pool->ring, page);
+	ret = !__ptr_ring_produce(&pool->ring, (__force void *)netmem);
 	if (ret)
 		recycle_stat_inc(pool, ring);
 	page_pool_producer_unlock(pool, in_softirq);

################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -741,12 +741,7 @@
 
 static bool page_pool_recycle_in_ring(struct page_pool *pool, netmem_ref netmem)
 {
-	int ret;
-	/* BH protection not needed if current is softirq */
-	if (in_softirq())
-		ret = ptr_ring_produce(&pool->ring, (__force void *)netmem);
-	else
-		ret = ptr_ring_produce_bh(&pool->ring, (__force void *)netmem);
+	bool in_softirq, ret;
 
 	if (!ret) {
 		recycle_stat_inc(pool, ring);

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -675,12 +684,12 @@
 
-static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page)
+static bool page_pool_recycle_in_ring(struct page_pool *pool, netmem_ref netmem)
 {
 	int ret;
 	/* BH protection not needed if current is softirq */
 	if (in_softirq())
-		ret = ptr_ring_produce(&pool->ring, page);
+		ret = ptr_ring_produce(&pool->ring, (__force void *)netmem);
 	else
-		ret = ptr_ring_produce_bh(&pool->ring, page);
+		ret = ptr_ring_produce_bh(&pool->ring, (__force void *)netmem);
 
 	if (!ret) {
 		recycle_stat_inc(pool, ring);
  • ⚠️ PR commit ad0a14ad80c (kernfs: Fix UAF in polling when open file is released) → upstream 3c9ba2777d6c
    Differences found:
################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -893,7 +911,7 @@
 	 * the ops aren't called concurrently for the same open file.
 	 */
 	mutex_lock(&of->mutex);
-	if (!kernfs_get_active(of->kn)) {
+	if (!kernfs_get_active_of(of)) {
 		mutex_unlock(&of->mutex);
 		return -ENODEV;
 	}
@@ -904,7 +922,7 @@
 	else
 		ret = generic_file_llseek(file, offset, whence);
 
-	kernfs_put_active(of->kn);
+	kernfs_put_active_of(of);
 	mutex_unlock(&of->mutex);
 	return ret;
 }

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -490,4 +485,4 @@
-	of->vm_ops = vma->vm_ops;
+	}
 	vma->vm_ops = &kernfs_vm_ops;
 out_put:
 	kernfs_put_active(of->kn);
  • ⚠️ PR commit 4c2bded1fb0 (io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()) → upstream ac0b8b327a56
    Differences found:
================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/io_uring/fdinfo.c
+++ b/io_uring/fdinfo.c
@@ -138,5 +138,5 @@
 
-	if (has_lock && (ctx->flags & IORING_SETUP_SQPOLL)) {
+	if (ctx->flags & IORING_SETUP_SQPOLL) {
 		struct io_sq_data *sq = ctx->sq_data;
 
 		/*

This is an automated interdiff check for backported commits.

@github-actions
Copy link
Copy Markdown

JIRA PR Check Results

8 commit(s) with issues found:

Commit 6f65d7f08f76

Summary: io_uring/sqpoll: don't put task_struct on tctx setup failure

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 26eae07673a2

Summary: io_uring: consistently use rcu semantics with sqpoll thread

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 4c2bded1fb0f

Summary: io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit b30621f5cf6a

Summary: io_uring/sqpoll: fix sqpoll error handling races

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 21cbc13ba4c1

Summary: io_uring/sqpoll: annotate debug task == current with data_race()

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit ad0a14ad80cb

Summary: kernfs: Fix UAF in polling when open file is released

❌ Errors:

  • VULN-161581: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-161581: No time logged - please log time manually

Commit b9c38ea8cc58

Summary: page_pool: Fix use-after-free in page_pool_recycle_in_ring

❌ Errors:

  • VULN-162992: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162992: No time logged - please log time manually

Commit 15b62393d325

Summary: iommufd: Fix race during abort for file descriptors

❌ Errors:

  • VULN-161965: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-161965: No time logged - please log time manually

Summary: Checked 8 commit(s) total.

@github-actions
Copy link
Copy Markdown

Validation checks completed with issues View full results: https://github.com/ctrliq/kernel-src-tree/actions/runs/24422566950

@pvts-mat
Copy link
Copy Markdown
Contributor Author

🔍 Upstream Linux Kernel Commit Check

* ⚠️ PR commit `b30621f5cf6 (io_uring/sqpoll: fix sqpoll error handling races)` does not reference a CVE but
  upstream commit `e33ac68e5e21` is associated with `CVE-2024-56762`

This is an automated message from the kernel commit checker workflow.

Rejected CVE, see https://lore.kernel.org/linux-cve-announce/2025010720-REJECTED-2931@gregkh/

if (fdno < 0) {
rc = fdno;
goto out_fput;
goto out_abort;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other Reviewer note: This took me a hot minute to figure out what was going on even with the description and the commit links.

its best to full unwind the context lines here if you're going to dig into it

PlaidCat
PlaidCat previously approved these changes Apr 15, 2026
Copy link
Copy Markdown
Collaborator

@PlaidCat PlaidCat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@PlaidCat PlaidCat requested a review from a team April 15, 2026 16:51
Copy link
Copy Markdown
Collaborator

@bmastbergen bmastbergen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wrt 26eae07

There are still a couple of references to sqd->thread not using rcu accessors in this kernel after this change. Those references were removed upstream prior to c538f40 in this commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bd2703b42decebdcddf76e277ba76b4c4a142d73

I wonder if we should also pick that up to prevent unprotected accesses to sqd->thread there.

@pvts-mat
Copy link
Copy Markdown
Contributor Author

wrt 26eae07

There are still a couple of references to sqd->thread not using rcu accessors in this kernel after this change. Those references were removed upstream prior to c538f40 in this commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bd2703b42decebdcddf76e277ba76b4c4a142d73

I wonder if we should also pick that up to prevent unprotected accesses to sqd->thread there.

Good point, I didn't check if the official fix is complete, will take a look

jira VULN-162982
cve-bf CVE-2025-38106
commit-author Pavel Begunkov <asml.silence@gmail.com>
commit bd2703b
upstream-diff Used `io_kiocb::task' instead of `io_uring_task::task'.
  It's the same object, moved in the non-backported commit
  b6f58a3 ("io_uring: move struct
  io_kiocb from task_struct to io_uring_task").

With IORING_SETUP_SQPOLL all requests are created by the SQPOLL task,
which means that req->task should always match sqd->thread. Since
accesses to sqd->thread should be separately protected, use req->task
in io_req_normal_work_add() instead.

Note, in the eyes of io_req_normal_work_add(), the SQPOLL task struct
is always pinned and alive, and sqd->thread can either be the task or
NULL. It's only problematic if the compiler decides to reload the value
after the null check, which is not so likely.

	Cc: stable@vger.kernel.org
	Cc: Bui Quang Minh <minhquangbui99@gmail.com>
	Reported-by: lizetao <lizetao1@huawei.com>
Fixes: 78f9b61 ("io_uring: wake SQPOLL task when task_work is added to an empty queue")
	Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/1cbbe72cf32c45a8fee96026463024cd8564a7d7.1736541357.git.asml.silence@gmail.com
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit bd2703b)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162982
cve-bf CVE-2025-38106
commit-author Bui Quang Minh <minhquangbui99@gmail.com>
commit a13030f
upstream-diff Accounted for the missing commit
  f03baec ("io_uring: move cancelations
  to be io_uring_task based") - resolution of what were basically just
  context conflicts.

In io_uring_try_cancel_requests, we check whether sq_data->thread ==
current to determine if the function is called by the SQPOLL thread to do
iopoll when IORING_SETUP_SQPOLL is set. This check can race with the SQPOLL
thread termination.

io_uring_cancel_generic is used in 2 places: io_uring_cancel_generic and
io_ring_exit_work. In io_uring_cancel_generic, we have the information
whether the current is SQPOLL thread already. And the SQPOLL thread never
reaches io_ring_exit_work.

So to avoid the racy check, this commit adds a boolean flag to
io_uring_try_cancel_requests to determine if the caller is SQPOLL thread.

	Reported-by: syzbot+3c750be01dab672c513d@syzkaller.appspotmail.com
	Reported-by: Li Zetao <lizetao1@huawei.com>
	Reviewed-by: Li Zetao <lizetao1@huawei.com>
	Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
	Reviewed-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/20250113160331.44057-1-minhquangbui99@gmail.com
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit a13030f)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162982
cve CVE-2025-38106
commit-author Penglei Jiang <superman.xpt@gmail.com>
commit ac0b8b3

syzbot reports:

BUG: KASAN: slab-use-after-free in getrusage+0x1109/0x1a60
Read of size 8 at addr ffff88810de2d2c8 by task a.out/304

CPU: 0 UID: 0 PID: 304 Comm: a.out Not tainted 6.16.0-rc1 ctrliq#1 PREEMPT(voluntary)
Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
Call Trace:
 <TASK>
 dump_stack_lvl+0x53/0x70
 print_report+0xd0/0x670
 ? __pfx__raw_spin_lock_irqsave+0x10/0x10
 ? getrusage+0x1109/0x1a60
 kasan_report+0xce/0x100
 ? getrusage+0x1109/0x1a60
 getrusage+0x1109/0x1a60
 ? __pfx_getrusage+0x10/0x10
 __io_uring_show_fdinfo+0x9fe/0x1790
 ? ksys_read+0xf7/0x1c0
 ? do_syscall_64+0xa4/0x260
 ? vsnprintf+0x591/0x1100
 ? __pfx___io_uring_show_fdinfo+0x10/0x10
 ? __pfx_vsnprintf+0x10/0x10
 ? mutex_trylock+0xcf/0x130
 ? __pfx_mutex_trylock+0x10/0x10
 ? __pfx_show_fd_locks+0x10/0x10
 ? io_uring_show_fdinfo+0x57/0x80
 io_uring_show_fdinfo+0x57/0x80
 seq_show+0x38c/0x690
 seq_read_iter+0x3f7/0x1180
 ? inode_set_ctime_current+0x160/0x4b0
 seq_read+0x271/0x3e0
 ? __pfx_seq_read+0x10/0x10
 ? __pfx__raw_spin_lock+0x10/0x10
 ? __mark_inode_dirty+0x402/0x810
 ? selinux_file_permission+0x368/0x500
 ? file_update_time+0x10f/0x160
 vfs_read+0x177/0xa40
 ? __pfx___handle_mm_fault+0x10/0x10
 ? __pfx_vfs_read+0x10/0x10
 ? mutex_lock+0x81/0xe0
 ? __pfx_mutex_lock+0x10/0x10
 ? fdget_pos+0x24d/0x4b0
 ksys_read+0xf7/0x1c0
 ? __pfx_ksys_read+0x10/0x10
 ? do_user_addr_fault+0x43b/0x9c0
 do_syscall_64+0xa4/0x260
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7f0f74170fc9
Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 8
RSP: 002b:00007fffece049e8 EFLAGS: 00000206 ORIG_RAX: 0000000000000000
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f0f74170fc9
RDX: 0000000000001000 RSI: 00007fffece049f0 RDI: 0000000000000004
RBP: 00007fffece05ad0 R08: 0000000000000000 R09: 00007fffece04d90
R10: 0000000000000000 R11: 0000000000000206 R12: 00005651720a1100
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
 </TASK>

Allocated by task 298:
 kasan_save_stack+0x33/0x60
 kasan_save_track+0x14/0x30
 __kasan_slab_alloc+0x6e/0x70
 kmem_cache_alloc_node_noprof+0xe8/0x330
 copy_process+0x376/0x5e00
 create_io_thread+0xab/0xf0
 io_sq_offload_create+0x9ed/0xf20
 io_uring_setup+0x12b0/0x1cc0
 do_syscall_64+0xa4/0x260
 entry_SYSCALL_64_after_hwframe+0x77/0x7f

Freed by task 22:
 kasan_save_stack+0x33/0x60
 kasan_save_track+0x14/0x30
 kasan_save_free_info+0x3b/0x60
 __kasan_slab_free+0x37/0x50
 kmem_cache_free+0xc4/0x360
 rcu_core+0x5ff/0x19f0
 handle_softirqs+0x18c/0x530
 run_ksoftirqd+0x20/0x30
 smpboot_thread_fn+0x287/0x6c0
 kthread+0x30d/0x630
 ret_from_fork+0xef/0x1a0
 ret_from_fork_asm+0x1a/0x30

Last potentially related work creation:
 kasan_save_stack+0x33/0x60
 kasan_record_aux_stack+0x8c/0xa0
 __call_rcu_common.constprop.0+0x68/0x940
 __schedule+0xff2/0x2930
 __cond_resched+0x4c/0x80
 mutex_lock+0x5c/0xe0
 io_uring_del_tctx_node+0xe1/0x2b0
 io_uring_clean_tctx+0xb7/0x160
 io_uring_cancel_generic+0x34e/0x760
 do_exit+0x240/0x2350
 do_group_exit+0xab/0x220
 __x64_sys_exit_group+0x39/0x40
 x64_sys_call+0x1243/0x1840
 do_syscall_64+0xa4/0x260
 entry_SYSCALL_64_after_hwframe+0x77/0x7f

The buggy address belongs to the object at ffff88810de2cb00
 which belongs to the cache task_struct of size 3712
The buggy address is located 1992 bytes inside of
 freed 3712-byte region [ffff88810de2cb00, ffff88810de2d980)

which is caused by the task_struct pointed to by sq->thread being
released while it is being used in the function
__io_uring_show_fdinfo(). Holding ctx->uring_lock does not prevent ehre
relase or exit of sq->thread.

Fix this by assigning and looking up ->thread under RCU, and grabbing a
reference to the task_struct. This ensures that it cannot get released
while fdinfo is using it.

	Reported-by: syzbot+531502bbbe51d2f769f4@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/all/682b06a5.a70a0220.3849cf.00b3.GAE@google.com
Fixes: 3fcb9d1 ("io_uring/sqpoll: statistics of the true utilization of sq threads")
	Signed-off-by: Penglei Jiang <superman.xpt@gmail.com>
Link: https://lore.kernel.org/r/20250610171801.70960-1-superman.xpt@gmail.com
[axboe: massage commit message]
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit ac0b8b3)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162982
cve-bf CVE-2025-38106
commit-author Keith Busch <kbusch@kernel.org>
commit c538f40

The sqpoll thread is dereferenced with rcu read protection in one place,
so it needs to be annotated as an __rcu type, and should consistently
use rcu helpers for access and assignment to make sparse happy.

Since most of the accesses occur under the sqd->lock, we can use
rcu_dereference_protected() without declaring an rcu read section.
Provide a simple helper to get the thread from a locked context.

Fixes: ac0b8b3 ("io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()")
	Signed-off-by: Keith Busch <kbusch@kernel.org>
Link: https://lore.kernel.org/r/20250611205343.1821117-1-kbusch@meta.com
[axboe: fold in fix for register.c]
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit c538f40)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
jira VULN-162982
cve-bf CVE-2025-38106
commit-author Jens Axboe <axboe@kernel.dk>
commit f2320f1

A recent commit moved the error handling of sqpoll thread and tctx
failures into the thread itself, as part of fixing an issue. However, it
missed that tctx allocation may also fail, and that
io_sq_offload_create() does its own error handling for the task_struct
in that case.

Remove the manual task putting in io_sq_offload_create(), as
io_sq_thread() will notice that the tctx did not get setup and hence it
should put itself and exit.

	Reported-by: syzbot+763e12bbf004fb1062e4@syzkaller.appspotmail.com
Fixes: ac0b8b3 ("io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()")
	Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit f2320f1)
	Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
@pvts-mat
Copy link
Copy Markdown
Contributor Author

Assessment of the access protection of io_sq_data::thread in ciqlts9_6:

io_uring_show_fdinfo()

if (sq->thread) {
sq_pid = sq->task_pid;
sq_cpu = sq->sq_cpu;
getrusage(sq->thread, RUSAGE_SELF, &sq_usage);
sq_total_time = (sq_usage.ru_stime.tv_sec * 1000000
+ sq_usage.ru_stime.tv_usec);
sq_work_time = sq->work_time;
}

Addresed in the backported ac0b8b3 io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()

io_req_normal_work_add()

if (sqd->thread)
__set_notify_signal(sqd->thread);

Addresed in the backported bd2703b io_uring: don't touch sqd->thread off tw add

io_ring_exit_work()

tsk = sqd->thread;

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_uring_try_cancel_requests()

if ((!(ctx->flags & IORING_SETUP_SQPOLL) && cancel_all) ||
(ctx->sq_data && ctx->sq_data->thread == current)) {
while (!wq_list_empty(&ctx->iopoll_list)) {
io_iopoll_try_reap_events(ctx);
ret = true;
cond_resched();
}
}

Addresed in the backported a13030f io_uring: simplify the SQPOLL thread check when cancelling requests

io_uring_cancel_generic()

WARN_ON_ONCE(sqd && sqd->thread != current);

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_uring_enter()

if (unlikely(ctx->sq_data->thread == NULL)) {
ret = -EOWNERDEAD;
goto out;
}

This usage doesn't require protection, see the most recent upstream

if (unlikely(ctx->sq_data->thread == NULL)) {
ret = -EOWNERDEAD;
goto out;
}

io_sq_thread_unpark()

WARN_ON_ONCE(sqd->thread == current);

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_sq_thread_park()

{
WARN_ON_ONCE(sqd->thread == current);
atomic_inc(&sqd->park_pending);
set_bit(IO_SQ_THREAD_SHOULD_PARK, &sqd->state);
mutex_lock(&sqd->lock);
if (sqd->thread)
wake_up_process(sqd->thread);
}

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_sq_thread_stop()

{
WARN_ON_ONCE(sqd->thread == current);
WARN_ON_ONCE(test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state));
set_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
mutex_lock(&sqd->lock);
if (sqd->thread)
wake_up_process(sqd->thread);
mutex_unlock(&sqd->lock);
wait_for_completion(&sqd->exited);
}

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_sq_thread()

sqd->thread = NULL;

sqd->thread = NULL;

Addresed in the backported ac0b8b3 io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()

io_sq_offload_create()

ret = (attached && !sqd->thread) ? -ENXIO : 0;

This usage doesn't require protection, see the most recent upstream

ret = (attached && !sqd->thread) ? -ENXIO : 0;

io_sq_offload_create()

sqd->thread = tsk;

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_sqpoll_wq_cpu_affinity()

if (sqd->thread)
ret = io_wq_cpu_affinity(sqd->thread->io_uring, mask);

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

io_register_iowq_max_workers()

if (sqd->thread)
tctx = sqd->thread->io_uring;

Addresed in the backported c538f40 io_uring: consistently use rcu semantics with sqpoll thread

@pvts-mat pvts-mat requested a review from bmastbergen April 20, 2026 23:19
Copy link
Copy Markdown
Collaborator

@bmastbergen bmastbergen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @pvts-mat for the extra look at the sqd->thread references. LGTM.

🥌

@github-actions
Copy link
Copy Markdown

🤖 Validation Checks In Progress Workflow run: https://github.com/ctrliq/kernel-src-tree/actions/runs/24726614351

@github-actions
Copy link
Copy Markdown

🔍 Upstream Linux Kernel Commit Check

  • ⚠️ PR commit b30621f5cf6 (io_uring/sqpoll: fix sqpoll error handling races) does not reference a CVE but
    upstream commit e33ac68e5e21 is associated with CVE-2024-56762

This is an automated message from the kernel commit checker workflow.

@github-actions
Copy link
Copy Markdown

🔍 Interdiff Analysis

  • ⚠️ PR commit 15b62393d32 (iommufd: Fix race during abort for file descriptors) → upstream 4e034bf045b1
    Differences found:
================================================================================
*    DELTA DIFFERENCES - code changes that differ between the patches          *
================================================================================

--- b/drivers/iommu/iommufd/main.c
+++ b/drivers/iommu/iommufd/main.c
@@ -545,7 +544,7 @@
 	},
 	[IOMMUFD_OBJ_FAULT] = {
 		.destroy = iommufd_fault_destroy,
-		IOMMUFD_FILE_OFFSET(struct iommufd_fault, filep, obj),
+		IOMMUFD_FILE_OFFSET(struct iommufd_fault, common.filep, common.obj),
 	},
 #ifdef CONFIG_IOMMUFD_TEST
 	[IOMMUFD_OBJ_SELFTEST] = {

################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/drivers/iommu/iommufd/main.c
+++ b/drivers/iommu/iommufd/main.c
@@ -23,6 +23,7 @@
 #include "iommufd_test.h"
 
 struct iommufd_object_ops {
+	size_t file_offset;
 	void (*pre_destroy)(struct iommufd_object *obj);
 	void (*destroy)(struct iommufd_object *obj);
 	void (*abort)(struct iommufd_object *obj);
@@ -718,6 +746,7 @@
 	[IOMMUFD_OBJ_VEVENTQ] = {
 		.destroy = iommufd_veventq_destroy,
 		.abort = iommufd_veventq_abort,
+		IOMMUFD_FILE_OFFSET(struct iommufd_veventq, common.filep, common.obj),
 	},
 	[IOMMUFD_OBJ_VIOMMU] = {
 		.destroy = iommufd_viommu_destroy,

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/drivers/iommu/iommufd/main.c
+++ b/drivers/iommu/iommufd/main.c
@@ -24,4 +24,5 @@
 
 struct iommufd_object_ops {
+	void (*pre_destroy)(struct iommufd_object *obj);
 	void (*destroy)(struct iommufd_object *obj);
 	void (*abort)(struct iommufd_object *obj);
@@ -495,6 +529,6 @@
 }
-EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, IOMMUFD);
+EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, "IOMMUFD");
 
 static const struct iommufd_object_ops iommufd_object_ops[] = {
 	[IOMMUFD_OBJ_ACCESS] = {
 		.destroy = iommufd_access_destroy_object,
@@ -515,6 +685,3 @@
 	},
-	[IOMMUFD_OBJ_FAULT] = {
-		.destroy = iommufd_fault_destroy,
-	},
-#ifdef CONFIG_IOMMUFD_TEST
-	[IOMMUFD_OBJ_SELFTEST] = {
+	[IOMMUFD_OBJ_VIOMMU] = {
+		.destroy = iommufd_viommu_destroy,

================================================================================
*    ONLY IN PATCH1 - files not modified by patch2                             *
================================================================================

--- b/drivers/iommu/iommufd/fault.c
+++ a/drivers/iommu/iommufd/fault.c
@@ -402,7 +402,6 @@
 	spin_lock_init(&fault->lock);
 	init_waitqueue_head(&fault->wait_queue);
 
-	/* The filep is fput() by the core code during failure */
 	filep = anon_inode_getfile("[iommufd-pgfault]", &iommufd_fault_fops,
 				   fault, O_RDWR);
 	if (IS_ERR(filep)) {
@@ -417,7 +416,7 @@
 	fdno = get_unused_fd_flags(O_CLOEXEC);
 	if (fdno < 0) {
 		rc = fdno;
+		goto out_fput;
-		goto out_abort;
 	}
 
 	cmd->out_fault_id = fault->obj.id;
@@ -433,6 +432,8 @@
 	return 0;
 out_put_fdno:
 	put_unused_fd(fdno);
+out_fput:
+	fput(filep);
 out_abort:
 	iommufd_object_abort_and_destroy(ucmd->ictx, &fault->obj);
 

================================================================================
*    ONLY IN PATCH2 - files not modified by patch1                             *
================================================================================

--- a/drivers/iommu/iommufd/eventq.c
+++ b/drivers/iommu/iommufd/eventq.c
@@ -393,12 +393,12 @@ static int iommufd_eventq_init(struct iommufd_eventq *eventq, char *name,
 			       const struct file_operations *fops)
 {
 	struct file *filep;
-	int fdno;
 
 	spin_lock_init(&eventq->lock);
 	INIT_LIST_HEAD(&eventq->deliver);
 	init_waitqueue_head(&eventq->wait_queue);
 
+	/* The filep is fput() by the core code during failure */
 	filep = anon_inode_getfile(name, fops, eventq, O_RDWR);
 	if (IS_ERR(filep))
 		return PTR_ERR(filep);
@@ -408,10 +408,7 @@ static int iommufd_eventq_init(struct iommufd_eventq *eventq, char *name,
 	eventq->filep = filep;
 	refcount_inc(&eventq->obj.users);
 
-	fdno = get_unused_fd_flags(O_CLOEXEC);
-	if (fdno < 0)
-		fput(filep);
-	return fdno;
+	return get_unused_fd_flags(O_CLOEXEC);
 }
 
 static const struct file_operations iommufd_fault_fops =
@@ -452,7 +449,6 @@ int iommufd_fault_alloc(struct iommufd_ucmd *ucmd)
 	return 0;
 out_put_fdno:
 	put_unused_fd(fdno);
-	fput(fault->common.filep);
 	return rc;
 }
 
@@ -536,7 +532,6 @@ int iommufd_veventq_alloc(struct iommufd_ucmd *ucmd)
 
 out_put_fdno:
 	put_unused_fd(fdno);
-	fput(veventq->common.filep);
 out_abort:
 	iommufd_object_abort_and_destroy(ucmd->ictx, &veventq->common.obj);
 out_unlock_veventqs:
  • ⚠️ PR commit b9c38ea8cc5 (page_pool: Fix use-after-free in page_pool_recycle_in_ring) → upstream 271683bb2cf3
    Differences found:
================================================================================
*    DELTA DIFFERENCES - code changes that differ between the patches          *
================================================================================

--- b/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -678,11 +678,16 @@
 
 static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page)
 {
-	bool in_softirq, ret;
+	int ret;
+	/* BH protection not needed if current is softirq */
+	if (in_softirq())
+		ret = ptr_ring_produce(&pool->ring, page);
+	else
+		ret = ptr_ring_produce_bh(&pool->ring, page);
 
 	/* BH protection not needed if current is softirq */
 	in_softirq = page_pool_producer_lock(pool);
-	ret = !__ptr_ring_produce(&pool->ring, page);
+	ret = !__ptr_ring_produce(&pool->ring, (__force void *)netmem);
 	if (ret)
 		recycle_stat_inc(pool, ring);
 	page_pool_producer_unlock(pool, in_softirq);

################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -741,12 +741,7 @@
 
 static bool page_pool_recycle_in_ring(struct page_pool *pool, netmem_ref netmem)
 {
-	int ret;
-	/* BH protection not needed if current is softirq */
-	if (in_softirq())
-		ret = ptr_ring_produce(&pool->ring, (__force void *)netmem);
-	else
-		ret = ptr_ring_produce_bh(&pool->ring, (__force void *)netmem);
+	bool in_softirq, ret;
 
 	if (!ret) {
 		recycle_stat_inc(pool, ring);

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -675,12 +684,12 @@
 
-static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page)
+static bool page_pool_recycle_in_ring(struct page_pool *pool, netmem_ref netmem)
 {
 	int ret;
 	/* BH protection not needed if current is softirq */
 	if (in_softirq())
-		ret = ptr_ring_produce(&pool->ring, page);
+		ret = ptr_ring_produce(&pool->ring, (__force void *)netmem);
 	else
-		ret = ptr_ring_produce_bh(&pool->ring, page);
+		ret = ptr_ring_produce_bh(&pool->ring, (__force void *)netmem);
 
 	if (!ret) {
 		recycle_stat_inc(pool, ring);
  • ⚠️ PR commit ad0a14ad80c (kernfs: Fix UAF in polling when open file is released) → upstream 3c9ba2777d6c
    Differences found:
################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -893,7 +911,7 @@
 	 * the ops aren't called concurrently for the same open file.
 	 */
 	mutex_lock(&of->mutex);
-	if (!kernfs_get_active(of->kn)) {
+	if (!kernfs_get_active_of(of)) {
 		mutex_unlock(&of->mutex);
 		return -ENODEV;
 	}
@@ -904,7 +922,7 @@
 	else
 		ret = generic_file_llseek(file, offset, whence);
 
-	kernfs_put_active(of->kn);
+	kernfs_put_active_of(of);
 	mutex_unlock(&of->mutex);
 	return ret;
 }

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -490,4 +485,4 @@
-	of->vm_ops = vma->vm_ops;
+	}
 	vma->vm_ops = &kernfs_vm_ops;
 out_put:
 	kernfs_put_active(of->kn);
  • ⚠️ PR commit 792f63b13e8 (io_uring: don't touch sqd->thread off tw add) → upstream bd2703b42dec
    Differences found:
================================================================================
*    DELTA DIFFERENCES - code changes that differ between the patches          *
================================================================================

--- b/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -1262,7 +1262,7 @@
 
 	/* SQPOLL doesn't need the task_work added, it'll run it itself */
 	if (ctx->flags & IORING_SETUP_SQPOLL) {
-		__set_notify_signal(req->task);
+		__set_notify_signal(tctx->task);
 		return;
 	}
  • ⚠️ PR commit 51786e2ecb0 (io_uring: simplify the SQPOLL thread check when cancelling requests) → upstream a13030fd194c
    Differences found:
================================================================================
*    DELTA DIFFERENCES - code changes that differ between the patches          *
================================================================================

--- b/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -3092,16 +3090,13 @@
 				if (node->ctx->sq_data)
 					continue;
 				loop |= io_uring_try_cancel_requests(node->ctx,
-								     current,
-								     cancel_all,
-								     false);
+							current, cancel_all);
 			}
 		} else {
 			list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
 				loop |= io_uring_try_cancel_requests(ctx,
 								     current,
-								     cancel_all,
-								     true);
+								     cancel_all);
 		}
 
 		if (loop) {

################################################################################
!    REJECTED PATCH2 HUNKS - could not be compared; manual review needed       !
################################################################################

--- b/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -143,7 +143,8 @@
 
 static bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
 					 struct io_uring_task *tctx,
-					 bool cancel_all);
+					 bool cancel_all,
+					 bool is_sqpoll_thread);
 
 static void io_queue_sqe(struct io_kiocb *req);
 
@@ -3038,7 +3040,8 @@
 
 static __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
 						struct io_uring_task *tctx,
-						bool cancel_all)
+						bool cancel_all,
+						bool is_sqpoll_thread)
 {
 	struct io_task_cancel cancel = { .tctx = tctx, .all = cancel_all, };
 	enum io_wq_cancel cret;
@@ -3141,7 +3144,8 @@
 					continue;
 				loop |= io_uring_try_cancel_requests(node->ctx,
 							current->io_uring,
-							cancel_all);
+							cancel_all,
+							false);
 			}
 		} else {
 			list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
@@ -3145,7 +3149,8 @@
 			list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
 				loop |= io_uring_try_cancel_requests(ctx,
 								     current->io_uring,
-								     cancel_all);
+								     cancel_all,
+								     true);
 		}
 
 		if (loop) {

================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -140,6 +140,6 @@
 
 static bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
-					 struct task_struct *task,
+					 struct io_uring_task *tctx,
 					 bool cancel_all);
 
 static void io_queue_sqe(struct io_kiocb *req);
@@ -2985,5 +3036,5 @@
 
 static __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
-						struct task_struct *task,
+						struct io_uring_task *tctx,
 						bool cancel_all)
 {
@@ -3087,11 +3136,12 @@
 					continue;
 				loop |= io_uring_try_cancel_requests(node->ctx,
-							current, cancel_all);
+							current->io_uring,
+							cancel_all);
 			}
 		} else {
 			list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
 				loop |= io_uring_try_cancel_requests(ctx,
-								     current,
+								     current->io_uring,
 								     cancel_all);
 		}
  • ⚠️ PR commit 76ffda72f86 (io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()) → upstream ac0b8b327a56
    Differences found:
================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/io_uring/fdinfo.c
+++ b/io_uring/fdinfo.c
@@ -138,5 +138,5 @@
 
-	if (has_lock && (ctx->flags & IORING_SETUP_SQPOLL)) {
+	if (ctx->flags & IORING_SETUP_SQPOLL) {
 		struct io_sq_data *sq = ctx->sq_data;
 
 		/*

This is an automated interdiff check for backported commits.

@github-actions
Copy link
Copy Markdown

JIRA PR Check Results

10 commit(s) with issues found:

Commit 4ca80a4116b7

Summary: io_uring/sqpoll: don't put task_struct on tctx setup failure

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 9fdd120421dd

Summary: io_uring: consistently use rcu semantics with sqpoll thread

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 76ffda72f866

Summary: io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 51786e2ecb00

Summary: io_uring: simplify the SQPOLL thread check when cancelling requests

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 792f63b13e8a

Summary: io_uring: don't touch sqd->thread off tw add

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit b30621f5cf6a

Summary: io_uring/sqpoll: fix sqpoll error handling races

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit 21cbc13ba4c1

Summary: io_uring/sqpoll: annotate debug task == current with data_race()

❌ Errors:

  • VULN-162982: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162982: No time logged - please log time manually

Commit ad0a14ad80cb

Summary: kernfs: Fix UAF in polling when open file is released

❌ Errors:

  • VULN-161581: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-161581: No time logged - please log time manually

Commit b9c38ea8cc58

Summary: page_pool: Fix use-after-free in page_pool_recycle_in_ring

❌ Errors:

  • VULN-162992: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-162992: No time logged - please log time manually

Commit 15b62393d325

Summary: iommufd: Fix race during abort for file descriptors

❌ Errors:

  • VULN-161965: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-161965: No time logged - please log time manually

Summary: Checked 10 commit(s) total.

@github-actions
Copy link
Copy Markdown

Validation checks completed with issues View full results: https://github.com/ctrliq/kernel-src-tree/actions/runs/24726614351

Copy link
Copy Markdown
Collaborator

@PlaidCat PlaidCat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@PlaidCat PlaidCat merged commit bfdaea2 into ctrliq:ciqlts9_6 Apr 21, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants