Linux 6.12.108
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.12.108 kernel.
All users of the 6.12 kernel series must upgrade.
The updated 6.12.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.12.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/filesystems/fscrypt.rst | 4 Makefile | 2 arch/arm64/kvm/arm.c | 6 arch/powerpc/perf/hv-gpci.c | 24 arch/riscv/kernel/compat_signal.c | 2 arch/riscv/kernel/ptrace.c | 4 arch/s390/kvm/vsie.c | 1 arch/x86/kernel/cpu/amd.c | 1 arch/x86/kvm/mmu/page_track.c | 32 + drivers/accessibility/speakup/main.c | 1 drivers/base/power/main.c | 6 drivers/crypto/Kconfig | 1 drivers/crypto/atmel-tdes.c | 5 drivers/crypto/mxs-dcp.c | 2 drivers/crypto/qce/aead.c | 58 -- drivers/crypto/qce/common.c | 55 -- drivers/crypto/qce/common.h | 16 drivers/crypto/qce/regs-v5.h | 4 drivers/crypto/qce/sha.c | 30 - drivers/crypto/qce/sha.h | 1 drivers/crypto/qce/skcipher.c | 97 --- drivers/crypto/qcom-rng.c | 156 +----- drivers/fpga/dfl-fme-perf.c | 2 drivers/hid/hid-asus.c | 52 -- drivers/hid/hid-ft260.c | 41 + drivers/hid/hid-magicmouse.c | 25 - drivers/hid/hid-uclogic-core.c | 12 drivers/hid/uhid.c | 8 drivers/hid/usbhid/hid-pidff.c | 106 ++-- drivers/infiniband/sw/rxe/rxe_qp.c | 18 drivers/isdn/hardware/mISDN/hfcpci.c | 12 drivers/media/platform/samsung/exynos4-is/fimc-is-regs.c | 1 drivers/net/ethernet/ibm/ibmvnic.c | 30 - drivers/net/gtp.c | 21 drivers/net/veth.c | 3 drivers/net/vxlan/vxlan_core.c | 9 drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 4 drivers/nvme/host/tcp.c | 8 drivers/target/target_core_fabric_configfs.c | 8 drivers/usb/c67x00/c67x00-sched.c | 4 drivers/usb/core/devio.c | 2 drivers/usb/core/hub.c | 7 drivers/usb/gadget/function/f_tcm.c | 2 drivers/usb/host/xhci-dbgtty.c | 15 drivers/usb/host/xhci-ring.c | 2 drivers/usb/misc/usbtest.c | 1 drivers/usb/serial/option.c | 20 drivers/usb/serial/spcp8x5.c | 13 fs/exfat/nls.c | 1 fs/ext4/crypto.c | 40 - fs/ext4/ialloc.c | 4 fs/fuse/dir.c | 9 fs/fuse/file.c | 4 fs/jfs/inode.c | 2 fs/jfs/jfs_discard.c | 3 fs/jfs/jfs_extent.c | 10 fs/nilfs2/ioctl.c | 253 ++++------ fs/smb/server/smb2pdu.c | 6 fs/smb/server/vfs_cache.c | 179 ++++++- fs/smb/server/vfs_cache.h | 4 include/linux/skbuff.h | 24 include/target/target_core_fabric.h | 2 io_uring/io-wq.c | 9 kernel/bpf/offload.c | 10 kernel/events/core.c | 10 kernel/trace/ring_buffer.c | 2 mm/swapfile.c | 7 net/batman-adv/tvlv.c | 5 net/bluetooth/hci_sync.c | 48 + net/bridge/br_multicast.c | 4 net/can/j1939/j1939-priv.h | 1 net/can/j1939/main.c | 5 net/can/j1939/socket.c | 55 ++ net/ipv4/tcp_ao.c | 19 net/ipv6/ah6.c | 29 - net/ipv6/seg6_local.c | 7 net/netfilter/nf_tables_api.c | 36 - net/nfc/nci/ntf.c | 26 - net/smc/smc_clc.c | 67 +- net/smc/smc_core.c | 27 - net/smc/smc_pnet.c | 43 - net/tls/tls_device.c | 3 net/xfrm/espintcp.c | 9 net/xfrm/xfrm_nat_keepalive.c | 53 +- net/xfrm/xfrm_user.c | 2 security/selinux/include/security.h | 1 security/selinux/ss/avtab.c | 43 + security/selinux/ss/avtab.h | 21 security/selinux/ss/conditional.c | 47 - security/selinux/ss/conditional.h | 6 security/selinux/ss/constraint.h | 1 security/selinux/ss/ebitmap.c | 4 security/selinux/ss/ebitmap.h | 5 security/selinux/ss/mls.c | 6 security/selinux/ss/policydb.c | 375 ++++++++++----- security/selinux/ss/policydb.h | 51 +- security/selinux/ss/services.c | 8 sound/soc/codecs/nau8821.c | 13 sound/usb/card.c | 14 sound/usb/midi.c | 2 100 files changed, 1483 insertions(+), 1066 deletions(-)
Aboorva Devarajan (1):
powerpc/hv-gpci: fix preempt count leak in sysfs show paths
Aleksandr Nogikh (1):
usb: usbtest: disable dynamic ID support
Ankit Khushwaha (1):
ring buffer: Propagate __rb_map_vma return value to caller
Antheas Kapenekakis (1):
HID: asus: simplify RGB init sequence
Asim Viladi Oglu Manizada (1):
xfrm: ah6: validate routing header segments_left
Baokun Li (2):
fuse: fix invalidate lock leak on setattr writeback failure
fuse: fix invalidate lock leak on open O_TRUNC DAX failure
Bartosz Golaszewski (1):
crypto: qce - Remove unsafe/deprecated algorithms
Baul Lee (1):
HID: pidff: fix OOB write when hid->inputs is empty
Bryam Vargas (3):
selinux: reject a permission value exceeding the class permission count
selinux: require a class's permission values to cover its permission count
nfc: nci: add data_len bound checks to activation parameter extractors
Carlos Llamas (1):
HID: uhid: convert to hid_safe_input_report()
Chengfeng Ye (1):
Bluetooth: hci_sync: Fix accept list UAF during suspend
Christian Borntraeger (1):
KVM: s390: vsie: zero stale crypto bits
Christian Göttsche (5):
selinux: use known type instead of void pointer
selinux: avoid unnecessary indirection in struct level_datum
selinux: make more use of str_read() when loading the policy
selinux: use u16 for security classes
selinux: more strict policy parsing
Cristian Ciocaltea (2):
ASoC: nau8821: Cancel delayed work on component remove
ASoC: nau8821: Cancel pending work before suspend
DaeMyung Kang (1):
ksmbd: harden file lifetime during session teardown
Devin Wittmayer (1):
wifi: mt76: mt7925: ensure tx headroom in usb_sdio_tx_prepare_skb
Dmitry Bogdanov (1):
nvme-tcp: fix usage of page_frag_cache
Dylan Wolff (1):
jfs: Fix null-ptr-deref in jfs_ioc_trim
Eric Biggers (5):
ext4: don't enable DAX on new encrypted files mm/swap: reject swapon() on filesystem-level encrypted files
crypto: qcom-rng - Enable clock in hwrng case
crypto: qcom-rng - Allow zero as a random number
crypto: qcom-rng - Remove crypto_rng interface
Fourie Zhang (1):
netfilter: nf_tables: don't queue packet path object notifications
Greg Kroah-Hartman (1):
Linux 6.12.108
Griffin Kroah-Hartman (3):
fpga: dfl: fme: add error handling
usb: core: Add lock to usb_wakeup_notification()
usb: core: Strengthen error handling in hub_hub_status()
Haoxiang Li (1):
accessibility: speakup: unregister tty ldisc on later init failures
Hyunwoo Kim (1):
net/tcp-ao: fix use-after-free of current_key on reconnect to another peer
Ibrahim Hashimov (2):
RDMA/rxe: Fix responder UAF on IB_QP_MAX_DEST_RD_ATOMIC modify_qp
HID: uclogic: fix use-after-free of inrange_timer on remove
Jann Horn (1):
HID: asus: fix missing hid_is_usb() check
Jesper Dangaard Brouer (1):
veth: fix OOB txq access in veth_poll() with asymmetric queue counts
Jiale Yao (1):
USB: serial: option: fix slab OOB read in interrupt URB callback
Jiayuan Chen (2):
bpf: Fix use-after-free in offloaded map/prog info fill
tls: device: fix out-of-bounds write in tls_append_frag()
Jinu Kim (1):
KVM: x86/mmu: Check write tracking in all address spaces
Johan Hovold (1):
USB: serial: spcp8x5: drop broken carrier detect support
Jose Villaseñor Montfort (1):
HID: magicmouse: prevent unbounded recursion in magicmouse_raw_event()
Kuniyuki Iwashima (4):
smc: Fix use-after-free in __pnet_find_base_ndev().
smc: Use __sk_dst_get() and dst_dev_rcu() in in smc_clc_prfx_set().
smc: Use __sk_dst_get() and dst_dev_rcu() in smc_clc_prfx_match().
smc: Use __sk_dst_get() and dst_dev_rcu() in smc_vlan_by_tcpsk().Kyle Zeng (4):
perf: Reject exited events as group leaders
ipv6: seg6: clear IPv4 control block on IPIP decapsulation
batman-adv: reject unrepresentable multicast TVLV offsets
vxlan: keep the last remote linked during FDB flush
Lucas De Marchi (2):
xhci: dbgtty: Fix unregister on tty_register_driver() failure
xhci: dbgtty: Fix unregister on tty_alloc_driver() failure
Marouane El Moufid (1):
ALSA: usb-audio: fix OOB write in snd_usbmidi_novation_output()
Md Sadre Alam (1):
crypto: qce - fix CCM AAD buffer underallocation
Michael Neuling (1):
riscv: Fix register corruption from uninitialized cregs on error
Michael Zaidman (1):
HID: ft260: validate i2c input report length
Miguel Peñaranda (1):
usb: usbfs: fix use-after-free of usb_device in usbdev_release()
Namjae Jeon (1):
exfat: fix double free in delayed_free
Nick Child (1):
ibmvnic: Use kernel helpers for hex dumps
Norbert Szetei (1):
net: bridge: mcast: fix use-after-free of a master VLAN's multicast context
Oliver Upton (1):
KVM: arm64: Prevent access to vCPU events before init
Peiyang He (1):
RDMA/rxe: Fix OOB in free_rd_atomic_resources()
Pratik Vishwakarma (1):
x86/CPU/AMD: Carve out a Zen5 models range
Qing Ming (2):
gtp: serialize PDP context updates
tcp: fix AO info use-after-free in tcp_ao_connect_init()
Raman Varabets (1):
HID: ft260: fix stack-use-after-return write in I2C read race
Rastislav Szabo (1):
net/tcp: fix TCP-AO key deletion in VRFs
Ryusuke Konishi (2):
nilfs2: correct return value kernel-doc descriptions for ioctl functions
nilfs2: reject invalid block index in GC ioctl
Sabrina Dubroca (1):
xfrm: espintcp: fix UAF during close
Sasha Levin (1):
Revert "PM: sleep: Use complete() in device_pm_sleep_init()"
Semih Baskan (1):
usb: xhci: Handle USB3 port events when there is one roothub
Shuangpeng Bai (2):
usb: gadget: f_tcm: keep port count until LUN teardown completes
USB: c67x00: fix use-after-free in c67x00_add_iso_urb()
Stephen Smalley (1):
selinux: switch two allocations to use kzalloc_objs()
Tetsuo Handa (3):
can: j1939: implement NETDEV_UNREGISTER notification handler
can: j1939: add missing calls in NETDEV_UNREGISTER notification handler
can: j1939: make j1939_sk_bind() fail if device is no longer registered
Thorsten Blum (2):
crypto: atmel-tdes - use scatterlist length before DMA mapping
crypto: mxs-dcp - fix source scatterlist length access
Tomasz Pakuła (3):
HID: pidff: Rework pidff_set_time() to fix warnings
HID: pidff: Use ARRAY_SIZE macro instead of sizeof
HID: pidff: clang-format pass
Vasiliy Kovalev (2):
jfs: add check read-only before truncation in jfs_truncate_nolock()
jfs: add check read-only before txBeginAnon() call
Vishnu Razdan (1):
io_uring/io-wq: fix worker accounting when canceling creation callbacks
Vladimir Riabchun (1):
mISDN: hfcpci: Fix warning when deleting uninitialized timer
Wentao Liang (1):
media: platform: exynos4-is: Add hardware sync wait to fimc_is_hw_change_mode()
Will Porter (1):
ALSA: usb-audio: Complete cleanup after system-resume errors
Zhiling Zou (1):
xfrm: drop ESP-in-TCP packets with no ingress device
Zihan Xi (3):
xfrm: avoid lock inversion in nat keepalive work
xfrm: fix xfrm_state_construct() auth-trunc leak
xfrm: bound nat keepalive state collection
Zijun Hu (1):
Bluetooth: hci_sync: Use bt_dev_err() to log error message in hci_update_event_filter_sync()
Greg Kroah-Hartman
maintainerDocumentation/filesystems/fscrypt.rst +4 -0
@@ -1216,6 +1216,10 @@ astute users may notice some differences in behavior: - DAX (Direct Access) is not supported on encrypted files. +- Encrypted files cannot be used directly as swap files. To swap to + an encrypted file, set up a loopback device on top of it. + Alternatively, encrypted swap can use a dm-crypt device. + - The maximum length of an encrypted symlink is 2 bytes shorter than the maximum length of an unencrypted symlink. For example, on an EXT4 filesystem with a 4K block size, unencrypted symlinks can be up
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 107 +SUBLEVEL = 108 EXTRAVERSION = NAME = Baby Opossum Posse
arch/arm64/kvm/arm.c +6 -0
@@ -1767,6 +1767,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_GET_VCPU_EVENTS : {struct kvm_vcpu_events events; +if (!kvm_vcpu_initialized (vcpu)) +return -ENOEXEC ; +if (kvm_arm_vcpu_get_events (vcpu, &events))return -EINVAL ;
@@ -1778,6 +1781,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_SET_VCPU_EVENTS : {struct kvm_vcpu_events events; +if (!kvm_vcpu_initialized (vcpu)) +return -ENOEXEC ; +if (copy_from_user (&events, argp,sizeof (events)))return -EFAULT ;
arch/powerpc/perf/hv-gpci.c +16 -8
@@ -210,7 +210,7 @@ static ssize_t processor_bus_topology_show(struct device *dev, struct device_att 0, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out;
@@ -244,12 +244,14 @@ static ssize_t processor_bus_topology_show(struct device *dev, struct device_att starting_index, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out; } +out_success: +put_cpu_var (hv_gpci_reqb);return n; out:
@@ -278,7 +280,7 @@ static ssize_t processor_config_show(struct device *dev, struct device_attribute 0, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out;
@@ -312,12 +314,14 @@ static ssize_t processor_config_show(struct device *dev, struct device_attribute starting_index, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out; } +out_success: +put_cpu_var (hv_gpci_reqb);return n; out:
@@ -346,7 +350,7 @@ static ssize_t affinity_domain_via_virtual_processor_show(struct device *dev, 0, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out;
@@ -382,12 +386,14 @@ static ssize_t affinity_domain_via_virtual_processor_show(struct device *dev, starting_index, secondary_index, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out; } +out_success: +put_cpu_var (hv_gpci_reqb);return n; out:
@@ -416,7 +422,7 @@ static ssize_t affinity_domain_via_domain_show(struct device *dev, struct device 0, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out;
@@ -448,12 +454,14 @@ static ssize_t affinity_domain_via_domain_show(struct device *dev, struct device starting_index, 0, buf, &n, arg);if (!ret) -return n; + goto out_success;if (ret !=H_PARAMETER ) goto out; } +out_success: +put_cpu_var (hv_gpci_reqb);return n; out:
arch/riscv/kernel/compat_signal.c +2 -0
@@ -107,6 +107,8 @@ static long compat_restore_sigcontext(struct pt_regs *regs,/* sc_regs is structured the same as the start of pt_regs */ err =__copy_from_user (&cregs, &sc->sc_regs,sizeof (sc->sc_regs)); +if (unlikely (err)) +return err;cregs_to_regs (&cregs, regs);
arch/riscv/kernel/ptrace.c +2 -2
@@ -330,8 +330,8 @@ static int compat_riscv_gpr_set(struct task_struct *target,struct compat_user_regs_struct cregs; ret =user_regset_copyin (&pos, &count, &kbuf, &ubuf, &cregs,0 ,-1 ); - -cregs_to_regs (&cregs,task_pt_regs (target)); +if (!ret) +cregs_to_regs (&cregs,task_pt_regs (target));return ret; }
arch/s390/kvm/vsie.c +1 -0
@@ -150,6 +150,7 @@ static int setup_apcb10(struct kvm_vcpu *vcpu, struct kvm_s390_apcb1 *apcb_s, sizeof(struct kvm_s390_apcb0)))return -EFAULT ; +memset (apcb_s,0 ,sizeof (*apcb_s)); apcb_s->apm[0 ] = apcb_h->apm[0 ] & tmp.apm[0 ]; apcb_s->aqm[0 ] = apcb_h->aqm[0 ] & tmp.aqm[0 ] &0xffff000000000000UL ; apcb_s->adm[0 ] = apcb_h->adm[0 ] & tmp.adm[0 ] &0xffff000000000000UL ;
arch/x86/kernel/cpu/amd.c +1 -0
@@ -523,6 +523,7 @@ static void bsp_init_amd(struct cpuinfo_x86 *c) case 0x00 ... 0x2f: case 0x40 ... 0x4f: case 0x60 ... 0x7f: + case 0xd0 ... 0xd7:setup_force_cpu_cap (X86_FEATURE_ZEN5 );break ;default :
arch/x86/kvm/mmu/page_track.c +26 -6
@@ -130,13 +130,23 @@ void __kvm_write_track_remove_gfn(struct kvm *kvm,kvm_mmu_gfn_allow_lpage (slot, gfn); } -/* -* check if the corresponding access on the specified guest page is tracked. -*/ +static bool __kvm_gfn_is_write_tracked (const struct kvm_memory_slot *slot, +gfn_t gfn) +{ +int index; + +if (!slot) +return false; + + index =gfn_to_index (gfn, slot->base_gfn,PG_LEVEL_4K ); +return !!READ_ONCE (slot->arch.gfn_write_track[index]); +} + +/* check if write access is tracked on the specified guest page. */ bool kvm_gfn_is_write_tracked (struct kvm *kvm,const struct kvm_memory_slot *slot,gfn_t gfn) { -int index; +const struct kvm_memory_slot *other_slot;if (!slot)return false;
@@ -144,8 +154,18 @@ bool kvm_gfn_is_write_tracked(struct kvm *kvm,if (!kvm_page_track_write_tracking_enabled (kvm))return false; - index =gfn_to_index (gfn, slot->base_gfn,PG_LEVEL_4K ); -return !!READ_ONCE (slot->arch.gfn_write_track[index]); +BUILD_BUG_ON (KVM_MAX_NR_ADDRESS_SPACES >2 ); + +if (__kvm_gfn_is_write_tracked (slot, gfn)) +return true; + +if (kvm_arch_nr_memslot_as_ids (kvm) >1 ) { + other_slot =__gfn_to_memslot (__kvm_memslots (kvm, slot->as_id ^1 ), gfn); +if (__kvm_gfn_is_write_tracked (other_slot, gfn)) +return true; + } + +return false; }#ifdef CONFIG_KVM_EXTERNAL_WRITE_TRACKING
drivers/accessibility/speakup/main.c +1 -0
@@ -2444,6 +2444,7 @@ static int __init speakup_init(void)mutex_lock (&spk_mutex);synth_release ();mutex_unlock (&spk_mutex); +spk_ttyio_unregister_ldisc ();speakup_kobj_exit (); error_kobjects:
drivers/base/power/main.c +1 -5
@@ -100,7 +100,7 @@ void device_pm_sleep_init(struct device *dev) dev->power.is_noirq_suspended = false; dev->power.is_late_suspended = false;init_completion (&dev->power.completion); -complete (&dev->power.completion); +complete_all (&dev->power.completion); dev->power.wakeup =NULL ;INIT_LIST_HEAD (&dev->power.entry); }
@@ -237,10 +237,6 @@ static void dpm_wait(struct device *dev, bool async)if (!dev)return ; -/* Devices with no PM support don't use the completion. */ -if (dev->power.no_pm) -return ; -if (async || (pm_async_enabled && dev->power.async_suspend))wait_for_completion (&dev->power.completion); }
drivers/crypto/Kconfig +0 -1
@@ -648,7 +648,6 @@ config CRYPTO_DEV_QCOM_RNG tristate "Qualcomm Random Number Generator Driver" depends on ARCH_QCOM || COMPILE_TEST depends on HW_RANDOM - select CRYPTO_RNG help This driver provides support for the Random Number Generator hardware found on Qualcomm SoCs.
drivers/crypto/atmel-tdes.c +2 -3
@@ -463,14 +463,13 @@ static int atmel_tdes_crypt_start(struct atmel_tdes_dev *dd)IS_ALIGNED (dd->out_sg->length, dd->ctx->block_size); fast = in && out; -if (sg_dma_len (dd->in_sg) !=sg_dma_len (dd->out_sg)) +if (dd->in_sg->length != dd->out_sg->length) fast =0 ; }if (fast) { - count =min_t (size_t, dd->total,sg_dma_len (dd->in_sg)); - count =min_t (size_t, count,sg_dma_len (dd->out_sg)); + count =min_t (size_t, dd->total, dd->in_sg->length); err =dma_map_sg (dd->dev, dd->in_sg,1 ,DMA_TO_DEVICE );if (!err) {
drivers/crypto/mxs-dcp.c +1 -1
@@ -353,7 +353,7 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)for_each_sg (req->src, src,sg_nents (req->src), i) { src_buf =sg_virt (src); - len =sg_dma_len (src); + len = src->length; tlen += len; limit_hit = tlen > req->cryptlen;
drivers/crypto/qce/aead.c +2 -56
88 lines not on this page · raw message
drivers/crypto/qce/common.c +12 -43
113 lines not on this page · raw message
drivers/crypto/qce/common.h +3 -13
@@ -22,7 +22,7 @@/* IV length in bytes */ #define QCE_AES_IV_LENGTH AES_BLOCK_SIZE -/* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */ +/* max of AES_BLOCK_SIZE */ #define QCE_MAX_IV_SIZE AES_BLOCK_SIZE/* maximum nonce bytes */
@@ -33,14 +33,10 @@#define QCE_MAX_ALIGN_SIZE 64/* cipher algorithms */ -#define QCE_ALG_DES BIT(0) -#define QCE_ALG_3DES BIT(1)#define QCE_ALG_AES BIT(2)/* hash and hmac algorithms */ -#define QCE_HASH_SHA1 BIT(3)#define QCE_HASH_SHA256 BIT(4) -#define QCE_HASH_SHA1_HMAC BIT(5)#define QCE_HASH_SHA256_HMAC BIT(6)#define QCE_HASH_AES_CMAC BIT(7)
@@ -58,21 +54,15 @@#define QCE_ENCRYPT BIT(30)#define QCE_DECRYPT BIT(31) -#define IS_DES (flags) (flags & QCE_ALG_DES) -#define IS_3DES (flags) (flags & QCE_ALG_3DES)#define IS_AES (flags) (flags & QCE_ALG_AES) -#define IS_SHA1 (flags) (flags & QCE_HASH_SHA1)#define IS_SHA256 (flags) (flags & QCE_HASH_SHA256) -#define IS_SHA1_HMAC (flags) (flags & QCE_HASH_SHA1_HMAC)#define IS_SHA256_HMAC (flags) (flags & QCE_HASH_SHA256_HMAC)#define IS_CMAC (flags) (flags & QCE_HASH_AES_CMAC) -#define IS_SHA (flags) (IS_SHA1(flags) || IS_SHA256(flags)) -#define IS_SHA_HMAC (flags) \ - (IS_SHA1_HMAC(flags) || IS_SHA256_HMAC(flags)) +#define IS_SHA (flags) IS_SHA256(flags) +#define IS_SHA_HMAC (flags) IS_SHA256_HMAC(flags)#define IS_CBC (mode) (mode & QCE_MODE_CBC) -#define IS_ECB (mode) (mode & QCE_MODE_ECB)#define IS_CTR (mode) (mode & QCE_MODE_CTR)#define IS_XTS (mode) (mode & QCE_MODE_XTS)#define IS_CCM (mode) (mode & QCE_MODE_CCM)
drivers/crypto/qce/regs-v5.h +0 -4
@@ -203,7 +203,6 @@#define AUTH_SIZE_SHIFT 9#define AUTH_SIZE_MASK GENMASK(13, 9) -#define AUTH_SIZE_SHA1 0#define AUTH_SIZE_SHA256 1#define AUTH_SIZE_ENUM_1_BYTES 0#define AUTH_SIZE_ENUM_2_BYTES 1
@@ -284,15 +283,12 @@#define ENCR_KEY_SZ_SHIFT 3#define ENCR_KEY_SZ_MASK GENMASK(5, 3) -#define ENCR_KEY_SZ_DES 0 -#define ENCR_KEY_SZ_3DES 1#define ENCR_KEY_SZ_AES128 0#define ENCR_KEY_SZ_AES256 2#define ENCR_ALG_SHIFT 0#define ENCR_ALG_MASK GENMASK(2, 0)#define ENCR_ALG_NONE 0 -#define ENCR_ALG_DES 1#define ENCR_ALG_AES 2#define ENCR_ALG_KASUMI 4#define ENCR_ALG_SNOW_3G 5
drivers/crypto/qce/sha.c +2 -28
@@ -24,10 +24,6 @@ struct qce_sha_saved_state {static LIST_HEAD (ahash_algs); -static const u32 std_iv_sha1[SHA256_DIGEST_SIZE /sizeof (u32)] = { -SHA1_H0 ,SHA1_H1 ,SHA1_H2 ,SHA1_H3 ,SHA1_H4 ,0 ,0 ,0 -}; -static const u32 std_iv_sha256[SHA256_DIGEST_SIZE /sizeof (u32)] = {SHA256_H0 ,SHA256_H1 ,SHA256_H2 ,SHA256_H3 ,SHA256_H4 ,SHA256_H5 ,SHA256_H6 ,SHA256_H7
@@ -348,9 +344,7 @@ static int qce_ahash_hmac_setkey(struct crypto_ahash *tfm, const u8 *key,return 0 ; } -if (digestsize ==SHA1_DIGEST_SIZE ) - alg_name ="sha1-qce" ; -else if (digestsize ==SHA256_DIGEST_SIZE ) +if (digestsize ==SHA256_DIGEST_SIZE ) alg_name ="sha256-qce" ;else return -EINVAL ;
@@ -411,15 +405,6 @@ struct qce_ahash_def { };static const struct qce_ahash_def ahash_def[] = { - { - .flags =QCE_HASH_SHA1 , - .name ="sha1" , - .drv_name ="sha1-qce" , - .digestsize =SHA1_DIGEST_SIZE , - .blocksize =SHA1_BLOCK_SIZE , - .statesize =sizeof (struct qce_sha_saved_state ), - .std_iv = std_iv_sha1, - }, { .flags =QCE_HASH_SHA256 , .name ="sha256" ,
@@ -429,15 +414,6 @@ static const struct qce_ahash_def ahash_def[] = { .statesize = sizeof(struct qce_sha_saved_state), .std_iv = std_iv_sha256, }, - { - .flags = QCE_HASH_SHA1_HMAC, - .name = "hmac(sha1)", - .drv_name = "hmac-sha1-qce", - .digestsize = SHA1_DIGEST_SIZE, - .blocksize = SHA1_BLOCK_SIZE, - .statesize = sizeof(struct qce_sha_saved_state), - .std_iv = std_iv_sha1, - }, { .flags = QCE_HASH_SHA256_HMAC, .name = "hmac(sha256)",
@@ -475,9 +451,7 @@ static int qce_ahash_register_one(const struct qce_ahash_def *def, alg->halg.digestsize = def->digestsize; alg->halg.statesize = def->statesize; -if (IS_SHA1 (def->flags)) - tmpl->hash_zero = sha1_zero_message_hash; -else if (IS_SHA256 (def->flags)) +if (IS_SHA256 (def->flags)) tmpl->hash_zero = sha256_zero_message_hash; base = &alg->halg.base;
drivers/crypto/qce/sha.h +0 -1
@@ -7,7 +7,6 @@#define _SHA_H_#include <crypto/scatterwalk.h> -#include <crypto/sha1.h> #include <crypto/sha2.h> #include "common.h"
drivers/crypto/qce/skcipher.c +2 -95
133 lines not on this page · raw message
drivers/crypto/qcom-rng.c +25 -131
236 lines not on this page · raw message
drivers/fpga/dfl-fme-perf.c +2 -0
@@ -925,6 +925,8 @@ static int fme_perf_pmu_register(struct platform_device *pdev,PERF_PMU_CAP_NO_EXCLUDE ; name =devm_kasprintf (priv->dev,GFP_KERNEL ,"dfl_fme%d" , pdev->id); +if (!name) +return -ENOMEM ; ret =perf_pmu_register (pmu, name,-1 );if (ret)
drivers/hid/hid-asus.c +22 -30
69 lines not on this page · raw message
drivers/hid/hid-ft260.c +38 -3
101 lines not on this page · raw message
drivers/hid/hid-magicmouse.c +20 -5
@@ -380,8 +380,8 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda } } -static int magicmouse_raw_event (struct hid_device *hdev, -struct hid_report *report,u8 *data,int size) +static int __magicmouse_raw_event (struct hid_device *hdev, +struct hid_report *report,u8 *data,int size,bool nested) {struct magicmouse_sc *msc =hid_get_drvdata (hdev);struct input_dev *input = msc->input;
@@ -492,6 +492,15 @@ static int magicmouse_raw_event(struct hid_device *hdev,* packet. */ +/* +* A double report only ever wraps two normal reports, so it is +* never nested. Refuse to recurse a second time; otherwise a +* malicious device could chain DOUBLE_REPORT_ID packets to drive +* unbounded recursion and overflow the kernel stack. +*/ +if (nested) +return 0 ; +/* Ensure that we have at least 2 elements (report type and size) */ if (size <2 )return 0 ;
@@ -503,9 +512,9 @@ static int magicmouse_raw_event(struct hid_device *hdev,return 0 ; } -magicmouse_raw_event (hdev, report, data +2 , data[1 ]); -magicmouse_raw_event (hdev, report, data +2 + data[1 ], - size -2 - data[1 ]); +__magicmouse_raw_event (hdev, report, data +2 , data[1 ], true); +__magicmouse_raw_event (hdev, report, data +2 + data[1 ], + size -2 - data[1 ], true);return 0 ;default :return 0 ;
@@ -530,6 +539,12 @@ static int magicmouse_raw_event(struct hid_device *hdev,return 1 ; } +static int magicmouse_raw_event (struct hid_device *hdev, +struct hid_report *report,u8 *data,int size) +{ +return __magicmouse_raw_event (hdev, report, data, size, false); +} +static int magicmouse_event (struct hid_device *hdev,struct hid_field *field,struct hid_usage *usage,__s32 value) {
drivers/hid/hid-uclogic-core.c +11 -1
@@ -477,7 +477,17 @@ static void uclogic_remove(struct hid_device *hdev) {struct uclogic_drvdata *drvdata =hid_get_drvdata (hdev); -del_timer_sync (&drvdata->inrange_timer); +/* +* Shut the in-range timer down before stopping the device. +* uclogic_raw_event_pen() re-arms inrange_timer on every pen report +* and keeps running until hid_hw_stop() stops the transport, so a +* plain timer_delete_sync() here can be undone by a report landing in +* the window before hid_hw_stop(). timer_shutdown_sync() cancels the +* timer and makes any later re-arm a no-op, so it is provably dead +* before hid_hw_stop() frees the input device drvdata->pen_input +* points at. +*/ +timer_shutdown_sync (&drvdata->inrange_timer);hid_hw_stop (hdev);kfree (drvdata->desc_ptr);uclogic_params_cleanup (&drvdata->params);
drivers/hid/uhid.c +4 -4
@@ -595,8 +595,8 @@ static int uhid_dev_input(struct uhid_device *uhid, struct uhid_event *ev)if (!READ_ONCE (uhid->running))return -EINVAL ; -hid_input_report (uhid->hid,HID_INPUT_REPORT , ev->u.input.data, -min_t (size_t, ev->u.input.size,UHID_DATA_MAX ),0 ); +hid_safe_input_report (uhid->hid,HID_INPUT_REPORT , ev->u.input.data,UHID_DATA_MAX , +min_t (size_t, ev->u.input.size,UHID_DATA_MAX ),0 );return 0 ; }
@@ -606,8 +606,8 @@ static int uhid_dev_input2(struct uhid_device *uhid, struct uhid_event *ev)if (!READ_ONCE (uhid->running))return -EINVAL ; -hid_input_report (uhid->hid,HID_INPUT_REPORT , ev->u.input2.data, -min_t (size_t, ev->u.input2.size,UHID_DATA_MAX ),0 ); +hid_safe_input_report (uhid->hid,HID_INPUT_REPORT , ev->u.input2.data,UHID_DATA_MAX , +min_t (size_t, ev->u.input2.size,UHID_DATA_MAX ),0 );return 0 ; }
drivers/hid/usbhid/hid-pidff.c +55 -51
272 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_qp.c +15 -3
@@ -124,6 +124,7 @@ static void free_rd_atomic_resources(struct rxe_qp *qp) }kfree (qp->resp.resources); qp->resp.resources =NULL ; + qp->resp.res =NULL ; } }
@@ -658,13 +659,24 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,int max_dest_rd_atomic = attr->max_dest_rd_atomic ?roundup_pow_of_two (attr->max_dest_rd_atomic) :0 ; - qp->attr.max_dest_rd_atomic = max_dest_rd_atomic; - +/* +* Not gated by IB_QP_STATE, so the responder task is live. +* Quiesce recv_task like rxe_qp_reset() before swapping the +* rd_atomic array, so rxe_receiver() cannot race the free/ +* realloc. +*/ +rxe_disable_task (&qp->recv_task);free_rd_atomic_resources (qp); - + qp->attr.max_dest_rd_atomic = max_dest_rd_atomic; err =alloc_rd_atomic_resources (qp, max_dest_rd_atomic); +/* +* On ENOMEM leave recv_task quiesced: qp->resp.resources is +* NULL and rxe_prepare_res()/find_resource() would deref it. +* Re-enable only after a fresh array is installed. +*/ if (err)return err; +rxe_enable_task (&qp->recv_task); }if (mask &IB_QP_EN_SQD_ASYNC_NOTIFY )
drivers/isdn/hardware/mISDN/hfcpci.c +5 -7
@@ -39,12 +39,13 @@#include "hfc_pci.h" +static void hfcpci_softirq (struct timer_list *unused);static const char *hfcpci_revision ="2.0" ;static int HFC_cnt;static uint debug;static uint poll, tics; -static struct timer_list hfc_tl; +static DEFINE_TIMER(hfc_tl, hfcpci_softirq);static unsigned long hfc_jiffies;MODULE_AUTHOR ("Karsten Keil" );
@@ -2305,8 +2306,7 @@ hfcpci_softirq(struct timer_list *unused) hfc_jiffies = jiffies +1 ; else hfc_jiffies += tics; - hfc_tl.expires = hfc_jiffies; -add_timer (&hfc_tl); +mod_timer (&hfc_tl, hfc_jiffies); } static int __init
@@ -2332,10 +2332,8 @@ HFC_init(void)if (poll !=HFCPCI_BTRANS_THRESHOLD ) {printk (KERN_INFO "%s: Using alternative poll value of %d\n" , __func__, poll); -timer_setup (&hfc_tl, hfcpci_softirq,0 ); - hfc_tl.expires = jiffies + tics; - hfc_jiffies = hfc_tl.expires; -add_timer (&hfc_tl); + hfc_jiffies = jiffies + tics; +mod_timer (&hfc_tl, hfc_jiffies); }else tics =0 ;/* indicate the use of controller's timer */
drivers/media/platform/samsung/exynos4-is/fimc-is-regs.c +1 -0
@@ -164,6 +164,7 @@ int fimc_is_hw_change_mode(struct fimc_is *is)if (WARN_ON (is->config_index >=ARRAY_SIZE (cmd)))return -EINVAL ; +fimc_is_hw_wait_intmsr0_intmsd0 (is);mcuctl_write (cmd[is->config_index], is,MCUCTL_REG_ISSR (0 ));mcuctl_write (is->sensor_index, is,MCUCTL_REG_ISSR (1 ));mcuctl_write (is->setfile.sub_index, is,MCUCTL_REG_ISSR (2 ));
drivers/net/ethernet/ibm/ibmvnic.c +18 -12
@@ -4841,6 +4841,18 @@ static void vnic_add_client_data(struct ibmvnic_adapter *adapter,strscpy (vlcd->name, adapter->netdev->name, len); } +static void ibmvnic_print_hex_dump (struct net_device *dev,void *buf, +size_t len) +{ +unsigned char hex_str[16 *3 ]; + +for (size_t i =0 ; i < len; i +=16 ) { +hex_dump_to_buffer ((unsigned char *)buf + i, len - i,16 ,8 , + hex_str,sizeof (hex_str), false); +netdev_dbg (dev,"%s\n" , hex_str); + } +} +static int send_login (struct ibmvnic_adapter *adapter) {struct ibmvnic_login_rsp_buffer *login_rsp_buffer;
@@ -4951,10 +4963,8 @@ static int send_login(struct ibmvnic_adapter *adapter)vnic_add_client_data (adapter, vlcd);netdev_dbg (adapter->netdev,"Login Buffer:\n" ); -for (i =0 ; i < (adapter->login_buf_sz -1 ) /8 +1 ; i++) { -netdev_dbg (adapter->netdev,"%016lx\n" , - ((unsigned long *)(adapter->login_buf))[i]); - } +ibmvnic_print_hex_dump (adapter->netdev, adapter->login_buf, + adapter->login_buf_sz);memset (&crq,0 ,sizeof (crq)); crq.login.first =IBMVNIC_CRQ_CMD ;
@@ -5331,15 +5341,13 @@ static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter) {struct device *dev = &adapter->vdev->dev;struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; -int i;dma_unmap_single (dev, adapter->ip_offload_tok,sizeof (adapter->ip_offload_buf),DMA_FROM_DEVICE );netdev_dbg (adapter->netdev,"Query IP Offload Buffer:\n" ); -for (i =0 ; i < (sizeof (adapter->ip_offload_buf) -1 ) /8 +1 ; i++) -netdev_dbg (adapter->netdev,"%016lx\n" , - ((unsigned long *)(buf))[i]); +ibmvnic_print_hex_dump (adapter->netdev, buf, +sizeof (adapter->ip_offload_buf));netdev_dbg (adapter->netdev,"ipv4_chksum = %d\n" , buf->ipv4_chksum);netdev_dbg (adapter->netdev,"ipv6_chksum = %d\n" , buf->ipv6_chksum);
@@ -5570,10 +5578,8 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq, netdev->mtu = adapter->req_mtu -ETH_HLEN ;netdev_dbg (adapter->netdev,"Login Response Buffer:\n" ); -for (i =0 ; i < (adapter->login_rsp_buf_sz -1 ) /8 +1 ; i++) { -netdev_dbg (adapter->netdev,"%016lx\n" , - ((unsigned long *)(adapter->login_rsp_buf))[i]); - } +ibmvnic_print_hex_dump (netdev, adapter->login_rsp_buf, + adapter->login_rsp_buf_sz);/* Sanity checks */ if (login->num_txcomp_subcrqs != login_rsp->num_txsubm_subcrqs ||
drivers/net/gtp.c +17 -4
@@ -12,6 +12,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/module.h> +#include <linux/mutex.h> #include <linux/skbuff.h> #include <linux/udp.h> #include <linux/rculist.h>
@@ -105,6 +106,7 @@ struct gtp_net { };static u32 gtp_h_initval; +static DEFINE_MUTEX (gtp_pdp_lock);static struct genl_family gtp_genl_family;
@@ -148,7 +150,8 @@ static struct pdp_ctx *gtp0_pdp_find(struct gtp_dev *gtp, u64 tid, u16 family) head = >p->tid_hash[gtp0_hashfn (tid) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_tid) { +hlist_for_each_entry_rcu (pdp, head, hlist_tid, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af == family && pdp->gtp_version ==GTP_V0 && pdp->u.v0.tid == tid)
@@ -165,7 +168,8 @@ static struct pdp_ctx *gtp1_pdp_find(struct gtp_dev *gtp, u32 tid, u16 family) head = >p->tid_hash[gtp1u_hashfn (tid) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_tid) { +hlist_for_each_entry_rcu (pdp, head, hlist_tid, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af == family && pdp->gtp_version ==GTP_V1 && pdp->u.v1.i_tei == tid)
@@ -182,7 +186,8 @@ static struct pdp_ctx *ipv4_pdp_find(struct gtp_dev *gtp, __be32 ms_addr) head = >p->addr_hash[ipv4_hashfn (ms_addr) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_addr) { +hlist_for_each_entry_rcu (pdp, head, hlist_addr, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af ==AF_INET && pdp->ms.addr.s_addr == ms_addr)return pdp;
@@ -217,7 +222,8 @@ static struct pdp_ctx *ipv6_pdp_find(struct gtp_dev *gtp, head = >p->addr_hash[ipv6_hashfn (ms_addr) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_addr) { +hlist_for_each_entry_rcu (pdp, head, hlist_addr, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af ==AF_INET6 &&ipv6_pdp_addr_equal (&pdp->ms.addr6, ms_addr))return pdp;
@@ -1550,9 +1556,11 @@ static void gtp_dellink(struct net_device *dev, struct list_head *head)struct pdp_ctx *pctx;int i; +mutex_lock (>p_pdp_lock);for (i =0 ; i < gtp->hash_size; i++)hlist_for_each_entry_safe (pctx, next, >p->tid_hash[i], hlist_tid)pdp_context_delete (pctx); +mutex_unlock (>p_pdp_lock);list_del (>p->list);unregister_netdevice_queue (dev, head);
@@ -2051,6 +2059,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) goto out_unlock; } +mutex_lock (>p_pdp_lock); pctx =gtp_pdp_add (gtp, sk, info);if (IS_ERR (pctx)) { err =PTR_ERR (pctx);
@@ -2058,6 +2067,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)gtp_tunnel_notify (pctx,GTP_CMD_NEWPDP ,GFP_KERNEL ); err =0 ; } +mutex_unlock (>p_pdp_lock); out_unlock:rtnl_unlock ();
@@ -2135,6 +2145,8 @@ static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info)if (!info->attrs[GTPA_VERSION ])return -EINVAL ; +mutex_lock (>p_pdp_lock); +rcu_read_lock (); pctx =gtp_find_pdp (sock_net (skb->sk), info->attrs);
@@ -2155,6 +2167,7 @@ static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info) out_unlock:rcu_read_unlock (); +mutex_unlock (>p_pdp_lock);return err; }
drivers/net/veth.c +2 -1
@@ -978,7 +978,8 @@ static int veth_poll(struct napi_struct *napi, int budget)/* NAPI functions as RCU section */ peer_dev =rcu_dereference_check (priv->peer,rcu_read_lock_bh_held ()); - peer_txq = peer_dev ?netdev_get_tx_queue (peer_dev, queue_idx) :NULL ; + peer_txq = (peer_dev && queue_idx < peer_dev->real_num_tx_queues) ? +netdev_get_tx_queue (peer_dev, queue_idx) :NULL ;xdp_set_return_frame_no_direct (); done =veth_xdp_rcv (rq, budget, &bq, &stats);
drivers/net/vxlan/vxlan_core.c +5 -4
@@ -3062,18 +3062,19 @@ vxlan_fdb_flush_match_remotes(struct vxlan_fdb *f, struct vxlan_dev *vxlan,const struct vxlan_fdb_flush_desc *desc, bool *p_destroy_fdb) { - bool remotes_flushed = false; struct vxlan_rdst *rd, *tmp;list_for_each_entry_safe (rd, tmp, &f->remotes, list) {if (!vxlan_fdb_flush_remote_matches (desc, rd))continue ; +if (list_is_singular (&f->remotes)) { + *p_destroy_fdb = true; +return ; + } +vxlan_fdb_dst_destroy (vxlan, f, rd, true); - remotes_flushed = true; } - - *p_destroy_fdb = remotes_flushed &&list_empty (&f->remotes); }/* Purge the forwarding table */
drivers/net/wireless/mediatek/mt76/mt7925/mac.c +4 -0
@@ -1432,6 +1432,10 @@ int mt7925_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,if (!wcid) wcid = &dev->mt76.global_wcid; + err =skb_cow_head (skb,MT_SDIO_TXD_SIZE +MT_SDIO_HDR_SIZE ); +if (err) +return err; +if (sta) {struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
drivers/nvme/host/tcp.c +8 -0
@@ -146,6 +146,7 @@ struct nvme_tcp_queue {struct mutex queue_lock;struct mutex send_mutex; +struct mutex pf_cache_lock;struct llist_head req_list;struct list_head send_list;
@@ -552,9 +553,11 @@ static int nvme_tcp_init_request(struct blk_mq_tag_set *set,struct nvme_tcp_queue *queue = &ctrl->queues[queue_idx];u8 hdgst =nvme_tcp_hdgst_len (queue); +mutex_lock (&queue->pf_cache_lock); req->pdu =page_frag_alloc (&queue->pf_cache,sizeof (struct nvme_tcp_cmd_pdu ) + hdgst,GFP_KERNEL | __GFP_ZERO); +mutex_unlock (&queue->pf_cache_lock);if (!req->pdu)return -ENOMEM ;
@@ -1452,9 +1455,11 @@ static int nvme_tcp_alloc_async_req(struct nvme_tcp_ctrl *ctrl)struct nvme_tcp_request *async = &ctrl->async_req;u8 hdgst =nvme_tcp_hdgst_len (queue); +mutex_lock (&queue->pf_cache_lock); async->pdu =page_frag_alloc (&queue->pf_cache,sizeof (struct nvme_tcp_cmd_pdu ) + hdgst,GFP_KERNEL | __GFP_ZERO); +mutex_unlock (&queue->pf_cache_lock);if (!async->pdu)return -ENOMEM ;
@@ -1485,6 +1490,7 @@ static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid)kfree (queue->pdu);mutex_destroy (&queue->send_mutex);mutex_destroy (&queue->queue_lock); +mutex_destroy (&queue->pf_cache_lock); }static int nvme_tcp_init_connection (struct nvme_tcp_queue *queue)
@@ -1807,6 +1813,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,INIT_LIST_HEAD (&queue->send_list);mutex_init (&queue->send_mutex);INIT_WORK (&queue->io_work, nvme_tcp_io_work); +mutex_init (&queue->pf_cache_lock);if (qid >0 ) queue->cmnd_capsule_len = nctrl->ioccsz *16 ;
@@ -1946,6 +1953,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, err_destroy_mutex:mutex_destroy (&queue->send_mutex);mutex_destroy (&queue->queue_lock); +mutex_destroy (&queue->pf_cache_lock);return ret; }
drivers/target/target_core_fabric_configfs.c +8 -0
@@ -690,6 +690,14 @@ static void target_fabric_port_unlink( }core_dev_del_lun (se_tpg, lun); + +if (tf->tf_ops->fabric_post_unlink) { +/* +* Allow fabrics to release state that must remain valid until +* core_dev_del_lun() has drained all active LUN references. +*/ + tf->tf_ops->fabric_post_unlink (se_tpg, lun); + } }static void target_fabric_port_release (struct config_item *item)
drivers/usb/c67x00/c67x00-sched.c +2 -2
@@ -761,13 +761,13 @@ static int c67x00_add_iso_urb(struct c67x00_hcd *c67x00, struct urb *urb) ret); urb->iso_frame_desc[urbp->cnt].actual_length =0 ; urb->iso_frame_desc[urbp->cnt].status = ret; -if (urbp->cnt +1 == urb->number_of_packets) -c67x00_giveback_urb (c67x00, urb,0 ); } urbp->ep_data->next_frame =frame_add (urbp->ep_data->next_frame, urb->interval); urbp->cnt++; +if (ret && urbp->cnt == urb->number_of_packets) +c67x00_giveback_urb (c67x00, urb,0 ); }return 0 ; }
drivers/usb/core/devio.c +1 -1
@@ -1110,7 +1110,6 @@ static int usbdev_release(struct inode *inode, struct file *file)if (!ps->suspend_allowed)usb_autosuspend_device (dev);usb_unlock_device (dev); -usb_put_dev (dev);put_pid (ps->disc_pid);put_cred (ps->cred);
@@ -1119,6 +1118,7 @@ static int usbdev_release(struct inode *inode, struct file *file)free_async (as); as =async_getcompleted (ps); } +usb_put_dev (dev);kfree (ps);return 0 ;
drivers/usb/core/hub.c +6 -1
@@ -756,10 +756,12 @@ void usb_wakeup_notification(struct usb_device *hdev, {struct usb_hub *hub;struct usb_port *port_dev; +unsigned long flags;if (!hdev)return ; +spin_lock_irqsave (&device_state_lock, flags); hub =usb_hub_to_struct_hub (hdev);if (hub) { port_dev = hub->ports[portnum -1 ];
@@ -769,6 +771,7 @@ void usb_wakeup_notification(struct usb_device *hdev,set_bit (portnum, hub->wakeup_bits);kick_hub_wq (hub); } +spin_unlock_irqrestore (&device_state_lock, flags); }EXPORT_SYMBOL_GPL (usb_wakeup_notification);
@@ -994,10 +997,12 @@ static int hub_hub_status(struct usb_hub *hub,mutex_lock (&hub->status_mutex); ret =get_hub_status (hub->hdev, &hub->status->hub); -if (ret <0 ) { +if (ret < (int )sizeof (hub->status->hub)) {if (ret != -ENODEV )dev_err (hub->intfdev,"%s failed (err = %d)\n" , __func__, ret); +if (ret >=0 ) + ret = -EIO ; }else { *status =le16_to_cpu (hub->status->hub.wHubStatus); *change =le16_to_cpu (hub->status->hub.wHubChange);
drivers/usb/gadget/function/f_tcm.c +1 -1
@@ -1678,7 +1678,7 @@ static const struct target_core_fabric_ops usbg_ops = { .fabric_enable_tpg = usbg_enable_tpg, .fabric_drop_tpg = usbg_drop_tpg, .fabric_post_link = usbg_port_link, - .fabric_pre_unlink = usbg_port_unlink, + .fabric_post_unlink = usbg_port_unlink, .fabric_init_nodeacl = usbg_init_nodeacl, .tfc_wwn_attrs = usbg_wwn_attrs,
drivers/usb/host/xhci-dbgtty.c +11 -4
@@ -596,8 +596,8 @@ int dbc_tty_init(void) dbc_tty_driver =tty_alloc_driver (64 ,TTY_DRIVER_REAL_RAW |TTY_DRIVER_DYNAMIC_DEV );if (IS_ERR (dbc_tty_driver)) { -idr_destroy (&dbc_tty_minors); -return PTR_ERR (dbc_tty_driver); + ret =PTR_ERR (dbc_tty_driver); + goto fail; } dbc_tty_driver->driver_name ="dbc_serial" ;
@@ -617,10 +617,17 @@ int dbc_tty_init(void) ret =tty_register_driver (dbc_tty_driver);if (ret) {pr_err ("Can't register dbc tty driver\n" ); -tty_driver_kref_put (dbc_tty_driver); -idr_destroy (&dbc_tty_minors); + goto fail_put; } +return ret; + +fail_put: +tty_driver_kref_put (dbc_tty_driver); +fail: +idr_destroy (&dbc_tty_minors); + dbc_tty_driver =NULL ; +return ret; }
drivers/usb/host/xhci-ring.c +1 -1
@@ -1986,7 +1986,7 @@ static void handle_port_status(struct xhci_hcd *xhci, union xhci_trb *event) vdev = xhci->devs[port->slot_id];/* We might get interrupts after shared_hcd is removed */ -if (port->rhub == &xhci->usb3_rhub && xhci->shared_hcd ==NULL ) { +if (port->rhub == &xhci->usb3_rhub &&xhci_get_usb3_hcd (xhci) ==NULL ) {xhci_dbg (xhci,"ignore port event for removed USB3 hcd\n" ); bogus_port_status = true; goto cleanup;
drivers/usb/misc/usbtest.c +1 -0
@@ -3053,6 +3053,7 @@ static struct usb_driver usbtest_driver = { .disconnect = usbtest_disconnect, .suspend = usbtest_suspend, .resume = usbtest_resume, + .no_dynamic_id = 1, };/*-------------------------------------------------------------------------*/
drivers/usb/serial/option.c +17 -3
@@ -2690,12 +2690,26 @@ static void option_instat_callback(struct urb *urb)dev_dbg (dev,"%s: NULL req_pkt\n" , __func__);return ; } + +if (urb->actual_length <sizeof (*req_pkt)) { +dev_err (dev,"%s: short packet: %u bytes\n" , __func__, + urb->actual_length); +return ; + } +if ((req_pkt->bRequestType ==0xA1 ) && (req_pkt->bRequest ==0x20 )) { +unsigned char signals;int old_dcd_state; -unsigned char signals = *((unsigned char *) - urb->transfer_buffer + -sizeof (struct usb_ctrlrequest )); + +if (urb->actual_length <sizeof (*req_pkt) +1 ) { +dev_err (dev,"%s: short interrupt transfer: %u bytes\n" , + __func__, urb->actual_length); +return ; + } + + signals = *((unsigned char *)urb->transfer_buffer + +sizeof (*req_pkt));dev_dbg (dev,"%s: signal x%x\n" , __func__, signals);
drivers/usb/serial/spcp8x5.c +0 -13
@@ -237,18 +237,6 @@ static void spcp8x5_set_work_mode(struct usb_serial_port *port, u16 value,dev_err (&port->dev,"failed to set work mode: %d\n" , ret); } -static int spcp8x5_carrier_raised (struct usb_serial_port *port) -{ -u8 msr; -int ret; - - ret =spcp8x5_get_msr (port, &msr); -if (ret || msr &MSR_STATUS_LINE_DCD ) -return 1 ; - -return 0 ; -} -static void spcp8x5_dtr_rts (struct usb_serial_port *port,int on) {struct spcp8x5_private *priv =usb_get_serial_port_data (port);
@@ -460,7 +448,6 @@ static struct usb_serial_driver spcp8x5_device = { .num_bulk_out = 1, .open = spcp8x5_open, .dtr_rts = spcp8x5_dtr_rts, - .carrier_raised = spcp8x5_carrier_raised, .set_termios = spcp8x5_set_termios, .init_termios = spcp8x5_init_termios, .tiocmget = spcp8x5_tiocmget,
fs/exfat/nls.c +1 -0
@@ -801,4 +801,5 @@ int exfat_create_upcase_table(struct super_block *sb)void exfat_free_upcase_table (struct exfat_sb_info *sbi) {kvfree (sbi->vol_utbl); + sbi->vol_utbl =NULL ; }
fs/ext4/crypto.c +20 -20
@@ -144,7 +144,13 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,if (inode->i_ino ==EXT4_ROOT_INO )return -EPERM ; -if (WARN_ON_ONCE (IS_DAX (inode) &&i_size_read (inode))) +/* +* For new encrypted inodes, S_DAX is never set in the first place. +* +* For existing inodes, this is called only on empty directories. ext4 +* never sets S_DAX on directories. +*/ +if (WARN_ON_ONCE (IS_DAX (inode)))return -EINVAL ;if (ext4_test_inode_flag (inode,EXT4_INODE_DAX ))
@@ -163,6 +169,14 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,*/ if (handle) { +/* +* __ext4_new_inode() should have already set the encrypt flag +* on the inode and avoided enabling inline data. +*/ +if (WARN_ON_ONCE (!IS_ENCRYPTED (inode))) +return -EINVAL ; +if (WARN_ON_ONCE (ext4_test_inode_state (inode,EXT4_STATE_MAY_INLINE_DATA ))) +return -EINVAL ;/* * Since the inode is new it is ok to pass the * XATTR_CREATE flag. This is necessary to match the
@@ -170,21 +184,10 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,* function with the credits allocated for the new * inode. */ - res =ext4_xattr_set_handle (handle, inode, -EXT4_XATTR_INDEX_ENCRYPTION , -EXT4_XATTR_NAME_ENCRYPTION_CONTEXT , - ctx, len,XATTR_CREATE ); -if (!res) { -ext4_set_inode_flag (inode,EXT4_INODE_ENCRYPT ); -ext4_clear_inode_state (inode, -EXT4_STATE_MAY_INLINE_DATA ); -/* -* Update inode->i_flags - S_ENCRYPTED will be enabled, -* S_DAX may be disabled -*/ -ext4_set_inode_flags (inode, false); - } -return res; +return ext4_xattr_set_handle (handle, inode, +EXT4_XATTR_INDEX_ENCRYPTION , +EXT4_XATTR_NAME_ENCRYPTION_CONTEXT , + ctx, len,XATTR_CREATE ); } res =dquot_initialize (inode);
@@ -205,10 +208,7 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len, ctx, len, 0);if (!res) {ext4_set_inode_flag (inode,EXT4_INODE_ENCRYPT ); -/* -* Update inode->i_flags - S_ENCRYPTED will be enabled, -* S_DAX may be disabled -*/ +/* Update inode->i_flags to set S_ENCRYPTED. */ ext4_set_inode_flags (inode, false); res =ext4_mark_inode_dirty (handle, inode);if (res)
fs/ext4/ialloc.c +4 -0
@@ -993,6 +993,8 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, err =fscrypt_prepare_new_inode (dir, inode, &encrypt);if (err) goto out; +if (encrypt) + i_flags |=EXT4_ENCRYPT_FL ; } err =dquot_initialize (inode);
@@ -1303,6 +1305,8 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, ei->i_extra_isize = sbi->s_want_extra_isize; ei->i_inline_off =0 ;if (ext4_has_feature_inline_data (sb) && +/* Encrypted inodes cannot have inline data */ + !(ei->i_flags &EXT4_ENCRYPT_FL ) && (!(ei->i_flags &EXT4_DAX_FL ) ||S_ISDIR (mode)))ext4_set_inode_state (inode,EXT4_STATE_MAY_INLINE_DATA ); ret = inode;
fs/fuse/dir.c +4 -5
@@ -1940,10 +1940,8 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry,filemap_invalidate_lock (mapping); fault_blocked = true; err =fuse_dax_break_layouts (inode,0 ,-1 ); -if (err) { -filemap_invalidate_unlock (mapping); -return err; - } +if (err) + goto unlock; }if (attr->ia_valid &ATTR_OPEN ) {
@@ -1970,7 +1968,7 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry, ATTR_TIMES_SET)) { err =write_inode_now (inode, true);if (err) -return err; + goto unlock;fuse_set_nowrite (inode);fuse_release_nowrite (inode);
@@ -2078,6 +2076,7 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry,clear_bit (FUSE_I_SIZE_UNSTABLE , &fi->state); +unlock:if (fault_blocked)filemap_invalidate_unlock (mapping);return err;
fs/fuse/file.c +2 -2
@@ -267,7 +267,7 @@ static int fuse_open(struct inode *inode, struct file *file)filemap_invalidate_lock (inode->i_mapping); err =fuse_dax_break_layouts (inode,0 ,-1 );if (err) - goto out_inode_unlock; + goto out_unlock; }if (is_wb_truncate || dax_truncate)
@@ -291,9 +291,9 @@ static int fuse_open(struct inode *inode, struct file *file)else if (!(ff->open_flags &FOPEN_KEEP_CACHE ))invalidate_inode_pages2 (inode->i_mapping); } +out_unlock:if (dax_truncate)filemap_invalidate_unlock (inode->i_mapping); -out_inode_unlock:if (is_wb_truncate || dax_truncate)inode_unlock (inode);
fs/jfs/inode.c +1 -1
@@ -375,7 +375,7 @@ void jfs_truncate_nolock(struct inode *ip, loff_t length)ASSERT (length >=0 ); -if (test_cflag (COMMIT_Nolink, ip)) { +if (test_cflag (COMMIT_Nolink, ip) ||isReadOnly (ip)) {xtTruncate (0 , ip, length,COMMIT_WMAP );return ; }
fs/jfs/jfs_discard.c +2 -1
@@ -86,7 +86,8 @@ int jfs_ioc_trim(struct inode *ip, struct fstrim_range *range)down_read (&sb->s_umount); bmp =JFS_SBI (ip->i_sb)->bmap; -if (minlen > bmp->db_agsize || +if (bmp ==NULL || + minlen > bmp->db_agsize || start >= bmp->db_mapsize || range->len < sb->s_blocksize) {up_read (&sb->s_umount);
fs/jfs/jfs_extent.c +10 -0
@@ -74,6 +74,11 @@ extAlloc(struct inode *ip, s64 xlen, s64 pno, xad_t * xp, bool abnr)int rc;int xflag; +if (isReadOnly (ip)) { +jfs_error (ip->i_sb,"read-only filesystem\n" ); +return -EIO ; + } +/* This blocks if we are low on resources */ txBeginAnon (ip->i_sb);
@@ -253,6 +258,11 @@ int extRecord(struct inode *ip, xad_t * xp) {int rc; +if (isReadOnly (ip)) { +jfs_error (ip->i_sb,"read-only filesystem\n" ); +return -EIO ; + } +txBeginAnon (ip->i_sb);mutex_lock (&JFS_IP (ip)->commit_mutex);
fs/nilfs2/ioctl.c +114 -139
402 lines not on this page · raw message
fs/smb/server/smb2pdu.c +4 -2
@@ -3773,8 +3773,10 @@ int smb2_open(struct ksmbd_work *work) err_out2:if (!rc) { -ksmbd_update_fstate (&work->sess->file_table, fp,FP_INITED ); - rc =ksmbd_iov_pin_rsp (work, (void *)rsp, iov_len); + rc =ksmbd_update_fstate (&work->sess->file_table, fp, +FP_INITED ); +if (!rc) + rc =ksmbd_iov_pin_rsp (work, (void *)rsp, iov_len); }if (rc) {if (rc == -EINVAL )
fs/smb/server/vfs_cache.c +158 -21
252 lines not on this page · raw message
fs/smb/server/vfs_cache.h +2 -2
@@ -172,8 +172,8 @@ int ksmbd_close_inode_fds(struct ksmbd_work *work, struct inode *inode);int ksmbd_init_global_file_table (void );void ksmbd_free_global_file_table (void );void ksmbd_set_fd_limit (unsigned long limit); -void ksmbd_update_fstate (struct ksmbd_file_table *ft,struct ksmbd_file *fp, -unsigned int state); +int ksmbd_update_fstate (struct ksmbd_file_table *ft,struct ksmbd_file *fp, +unsigned int state);bool ksmbd_vfs_compare_durable_owner (struct ksmbd_file *fp,struct ksmbd_user *user);
include/linux/skbuff.h +24 -0
@@ -3055,6 +3055,30 @@ static inline void skb_set_transport_header(struct sk_buff *skb, skb->transport_header += offset; } +/** +* skb_set_transport_header_careful - conditionally set transport header +* @skb: buffer to alter +* @offset: offset to add to skb->data +* +* Hardened version of skb_set_transport_header(). +* +* Returns: true if the operation was a success. +*/ +static inline bool __must_check +skb_set_transport_header_careful (struct sk_buff *skb,const int offset) +{ +long thoff = skb->data - skb->head + offset; + + if (unlikely(thoff != (typeof(skb->transport_header))thoff)) +return false; + + if (unlikely(thoff == (typeof(skb->transport_header))~0U)) +return false; + + skb->transport_header = thoff; +return true; +} +static inline unsigned char *skb_network_header (const struct sk_buff *skb) {return skb->head + skb->network_header;
include/target/target_core_fabric.h +2 -0
@@ -95,6 +95,8 @@ struct target_core_fabric_ops { struct se_lun *);void (*fabric_pre_unlink)(struct se_portal_group *,struct se_lun *); +void (*fabric_post_unlink)(struct se_portal_group *se_tpg, +struct se_lun *lun);struct se_tpg_np *(*fabric_make_np)(struct se_portal_group *,struct config_group *,const char *);void (*fabric_drop_np)(struct se_tpg_np *);
io_uring/io-wq.c +6 -3
@@ -192,9 +192,12 @@ static void io_worker_cancel_cb(struct io_worker *worker)struct io_wq *wq = worker->wq;atomic_dec (&acct->nr_running); -raw_spin_lock (&wq->lock); - acct->nr_workers--; -raw_spin_unlock (&wq->lock); +/* create_worker_cb() has not reserved a worker slot yet. */ +if (worker->create_work.func != create_worker_cb) { +raw_spin_lock (&wq->lock); + acct->nr_workers--; +raw_spin_unlock (&wq->lock); + }io_worker_ref_put (wq);clear_bit_unlock (0 , &worker->create_state);io_worker_release (worker);
kernel/bpf/offload.c +4 -6
@@ -444,9 +444,8 @@ static struct ns_common *bpf_prog_offload_info_fill_ns(void *private_data)if (aux->offload) { args->info->ifindex = aux->offload->netdev->ifindex; - net =dev_net (aux->offload->netdev); -get_net (net); - ns = &net->ns; + net =maybe_get_net (dev_net (aux->offload->netdev)); + ns = net ? &net->ns :NULL ; }else { args->info->ifindex =0 ; ns =NULL ;
@@ -652,9 +651,8 @@ static struct ns_common *bpf_map_offload_info_fill_ns(void *private_data)if (args->offmap->netdev) { args->info->ifindex = args->offmap->netdev->ifindex; - net =dev_net (args->offmap->netdev); -get_net (net); - ns = &net->ns; + net =maybe_get_net (dev_net (args->offmap->netdev)); + ns = net ? &net->ns :NULL ; }else { args->info->ifindex =0 ; ns =NULL ;
kernel/events/core.c +10 -0
@@ -12939,6 +12939,10 @@ SYSCALL_DEFINE5(perf_event_open,if (err) goto err_fd; group_leader =fd_file (group)->private_data; +if (group_leader->state <=PERF_EVENT_STATE_EXIT ) { + err = -ENODEV ; + goto err_group_fd; + }if (flags &PERF_FLAG_FD_OUTPUT ) output_event = group_leader;if (flags &PERF_FLAG_FD_NO_GROUP )
@@ -13066,6 +13070,12 @@ SYSCALL_DEFINE5(perf_event_open,if (group_leader->ctx != ctx) goto err_locked; +/* Recheck under ctx::mutex to serialize against remove-on-exec. */ +if (group_leader->state <=PERF_EVENT_STATE_EXIT ) { + err = -ENODEV ; + goto err_locked; + } +/* * Only a group leader can be exclusive or pinned */
kernel/trace/ring_buffer.c +1 -1
@@ -7149,7 +7149,7 @@ int ring_buffer_map(struct trace_buffer *buffer, int cpu,atomic_dec (&cpu_buffer->resize_disabled); } -return 0 ; +return err; }/*
mm/swapfile.c +7 -0
@@ -3430,6 +3430,13 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) error = -EBUSY ; goto bad_swap_unlock_inode; } +if (IS_ENCRYPTED (inode)) { +pr_warn_once ( +"Filesystem-level encrypted swapfile '%s' is unsupported. Create a loop device over it, or use dm-crypt\n" , + name->name); + error = -EINVAL ; + goto bad_swap_unlock_inode; + }/* * Read the swap header.
net/batman-adv/tvlv.c +4 -1
@@ -420,8 +420,11 @@ static int batadv_tvlv_call_handler(struct batadv_priv *bat_priv,return NET_RX_SUCCESS ; tvlv_offset = (unsigned char *)tvlv_value - skb->data; +if (!skb_set_transport_header_careful (skb, + tvlv_offset + tvlv_value_len)) +return -EINVAL ; +skb_set_network_header (skb, tvlv_offset); -skb_set_transport_header (skb, tvlv_offset + tvlv_value_len);return tvlv_handler->mcast_handler (bat_priv, skb); }
net/bluetooth/hci_sync.c +38 -10
23 lines not on this page · raw message
net/can/j1939/socket.c +55 -0
55 lines not on this page · raw message
net/smc/smc_clc.c +35 -32
67 lines not on this page · raw message
net/smc/smc_pnet.c +22 -21
43 lines not on this page · raw message
net/xfrm/xfrm_nat_keepalive.c +44 -9
53 lines not on this page · raw message
security/selinux/ss/avtab.c +33 -10
43 lines not on this page · raw message
security/selinux/ss/conditional.c +18 -29
47 lines not on this page · raw message
security/selinux/ss/policydb.c +267 -108
375 lines not on this page · raw message
security/selinux/ss/policydb.h +34 -17
51 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.