Linux 6.18.49
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.18.49 kernel.
All users of the 6.18 kernel series must upgrade.
The updated 6.18.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.18.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/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 ++ arch/x86/kvm/svm/sev.c | 76 +++-- arch/x86/kvm/svm/svm.c | 8 arch/x86/kvm/svm/svm.h | 13 - crypto/krb5/krb5_api.c | 8 drivers/accessibility/speakup/main.c | 1 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/crypto/virtio/virtio_crypto_akcipher_algs.c | 3 drivers/fpga/dfl-fme-perf.c | 2 drivers/gpu/drm/xe/xe_bo.h | 14 + drivers/gpu/drm/xe/xe_guc_ads.c | 92 ++++--- drivers/gpu/drm/xe/xe_guc_ads_types.h | 5 drivers/hid/hid-asus.c | 52 +--- drivers/hid/hid-ft260.c | 41 ++- drivers/hid/hid-magicmouse.c | 25 + drivers/infiniband/sw/rxe/rxe_qp.c | 18 + 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 | 20 + drivers/usb/misc/usbtest.c | 1 drivers/usb/serial/option.c | 20 + drivers/usb/serial/spcp8x5.c | 13 - fs/fuse/dir.c | 9 fs/fuse/file.c | 4 fs/smb/server/smb2pdu.c | 6 fs/smb/server/vfs_cache.c | 179 ++++++++++++-- fs/smb/server/vfs_cache.h | 4 include/kunit/run-in-irq-context.h | 10 include/linux/io_uring_types.h | 8 include/linux/skbuff.h | 24 + include/target/target_core_fabric.h | 2 io_uring/eventfd.c | 8 io_uring/eventfd.h | 2 io_uring/futex.c | 21 + io_uring/io_uring.c | 7 io_uring/poll.c | 23 - io_uring/rsrc.c | 31 -- io_uring/waitid.c | 2 kernel/bpf/offload.c | 10 mm/swapfile.c | 7 net/batman-adv/tvlv.c | 5 net/bridge/br_multicast.c | 4 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/netfilter/nft_set_pipapo_avx2.c | 17 - 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 | 35 ++ security/selinux/ss/avtab.h | 13 + security/selinux/ss/conditional.c | 25 - security/selinux/ss/constraint.h | 1 security/selinux/ss/policydb.c | 254 ++++++++++++++++---- security/selinux/ss/policydb.h | 31 +- security/selinux/ss/services.c | 8 sound/soc/codecs/nau8821.c | 13 + sound/usb/card.c | 14 - sound/usb/midi.c | 2 88 files changed, 1154 insertions(+), 774 deletions(-)
Aboorva Devarajan (1):
powerpc/hv-gpci: fix preempt count leak in sysfs show paths
Aleksandr Nogikh (1):
usb: usbtest: disable dynamic ID support
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
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
crypto: virtio - bound the akcipher result length
Caleb Sander Mateos (1):
io_uring: simplify IORING_SETUP_DEFER_TASKRUN && !SQPOLL check
Christian Borntraeger (1):
KVM: s390: vsie: zero stale crypto bits
Christian Göttsche (2):
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
Eric Biggers (6):
netfilter: nft_set_pipapo_avx2: add missing vzeroupper mm/swap: reject swapon() on filesystem-level encrypted files
kunit: irq: Continue increasing hrtimer interval for longer
crypto: qcom-rng - Enable clock in hwrng case
crypto: qcom-rng - Remove crypto_rng interface
crypto: qcom-rng - Allow zero as a random number
Fourie Zhang (1):
netfilter: nf_tables: don't queue packet path object notifications
Greg Kroah-Hartman (1):
Linux 6.18.49
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 (1):
RDMA/rxe: Fix responder UAF on IB_QP_MAX_DEST_RD_ATOMIC modify_qp
Jan Sebastian Götte (1):
crypto: krb5 - use kfree_sensitive() for derived key buffers
Jann Horn (1):
HID: asus: fix missing hid_is_usb() check
Jens Axboe (2):
io_uring/futex: only mark private futex waits as inflight
io_uring: defer eventfd signaling when queued from a wakeup handler
Jesper Dangaard Brouer (1):
veth: fix OOB txq access in veth_poll() with asymmetric queue counts
Jia Yao (3):
drm/xe/guc_ads: allocate UM queues in a separate BO drm/xe/guc_ads: allocate UM queues in VRAM on dGFX drm/xe/guc_ads: use uncached mapping for UM queue BO
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()
Kyle Zeng (3):
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
Michal Pecio (1):
usb: xhci: Handle bogus TRB pointers in Missed Service Error events
Miguel Peñaranda (1):
usb: usbfs: fix use-after-free of usb_device in usbdev_release()
Norbert Szetei (1):
net: bridge: mcast: fix use-after-free of a master VLAN's multicast context
Pankaj Gupta (1):
KVM: SEV: Drop FOLL_WRITE for encrypted region registration
Pavel Begunkov (1):
io_uring/rsrc: improve regbuf iov validation
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
Sabrina Dubroca (1):
xfrm: espintcp: fix UAF during close
Sean Christopherson (4):
KVM: SEV: Track the GPA of the guest-controlled VMSA used for SNP guests
KVM: SEV: Extract loading of guest-provided VMSA to a separate helper
KVM: SEV: Mark vCPU RUNNABLE after AP_CREATE, even if VMSA is unusable
KVM: SEV: Wire up kvm_x86_ops.gmem_xxx() if and only if CONFIG_KVM_AMD_SEV=y
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()
Thorsten Blum (2):
crypto: atmel-tdes - use scatterlist length before DMA mapping
crypto: mxs-dcp - fix source scatterlist length access
Wentao Guan (1):
Revert "selinux: reject a permission value exceeding the class permission count"
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
Greg Kroah-Hartman
maintainerDocumentation/filesystems/fscrypt.rst +4 -0
@@ -1245,6 +1245,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 = 18 -SUBLEVEL = 48 +SUBLEVEL = 49 EXTRAVERSION = NAME = Baby Opossum Posse
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
@@ -372,8 +372,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
@@ -184,6 +184,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
@@ -513,6 +513,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 ; case 0x50 ... 0x5f:
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
arch/x86/kvm/svm/sev.c +50 -26
133 lines not on this page · raw message
arch/x86/kvm/svm/svm.c +4 -4
@@ -5262,6 +5262,10 @@ struct kvm_x86_ops svm_x86_ops __initdata = { .vm_copy_enc_context_from = sev_vm_copy_enc_context_from, .vm_move_enc_context_from = sev_vm_move_enc_context_from, + + .gmem_prepare = sev_gmem_prepare, + .gmem_invalidate = sev_gmem_invalidate, + .gmem_max_mapping_level = sev_gmem_max_mapping_level, #endif .check_emulate_instruction = svm_check_emulate_instruction,
@@ -5273,10 +5277,6 @@ struct kvm_x86_ops svm_x86_ops __initdata = { .vcpu_deliver_sipi_vector = svm_vcpu_deliver_sipi_vector, .vcpu_get_apicv_inhibit_reasons = avic_vcpu_get_apicv_inhibit_reasons, .alloc_apic_backing_page = svm_alloc_apic_backing_page, - - .gmem_prepare = sev_gmem_prepare, - .gmem_invalidate = sev_gmem_invalidate, - .gmem_max_mapping_level = sev_gmem_max_mapping_level, };/*
arch/x86/kvm/svm/svm.h +2 -11
@@ -248,7 +248,8 @@ struct vcpu_sev_es_state {u64 ghcb_registered_gpa;struct mutex snp_vmsa_mutex;/* Used to handle concurrent updates of VMSA. */ -gpa_t snp_vmsa_gpa; +gpa_t snp_pending_vmsa_gpa; +gpa_t snp_guest_vmsa_gpa;bool snp_ap_waiting_for_reset;bool snp_has_guest_vmsa; };
@@ -905,16 +906,6 @@ static inline int sev_cpu_init(struct svm_cpu_data *sd) { return 0; }static inline int sev_dev_get_attr (u32 group,u64 attr,u64 *val) {return -ENXIO ; }#define max_sev_asid 0static inline void sev_handle_rmp_fault (struct kvm_vcpu *vcpu,gpa_t gpa,u64 error_code) {} -static inline int sev_gmem_prepare (struct kvm *kvm,kvm_pfn_t pfn,gfn_t gfn,int max_order) -{ -return 0 ; -} -static inline void sev_gmem_invalidate (kvm_pfn_t start,kvm_pfn_t end) {} -static inline int sev_gmem_max_mapping_level (struct kvm *kvm,kvm_pfn_t pfn,bool is_private) -{ -return 0 ; -} -static inline struct vmcb_save_area *sev_decrypt_vmsa (struct kvm_vcpu *vcpu) {return NULL ;
crypto/krb5/krb5_api.c +4 -4
@@ -263,10 +263,10 @@ struct crypto_aead *crypto_krb5_prepare_encryption(const struct krb5_enctype *kr goto err; } -kfree (keys.data); +kfree_sensitive (keys.data);return ci; err: -kfree (keys.data); +kfree_sensitive (keys.data);return ERR_PTR (ret); }EXPORT_SYMBOL (crypto_krb5_prepare_encryption);
@@ -333,10 +333,10 @@ struct crypto_shash *crypto_krb5_prepare_checksum(const struct krb5_enctype *krb goto err; } -kfree (keys.data); +kfree_sensitive (keys.data);return ci; err: -kfree (keys.data); +kfree_sensitive (keys.data);return ERR_PTR (ret); }EXPORT_SYMBOL (crypto_krb5_prepare_checksum);
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/crypto/Kconfig +0 -1
@@ -659,7 +659,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/crypto/virtio/virtio_crypto_akcipher_algs.c +2 -1
@@ -88,7 +88,8 @@ static void virtio_crypto_dataq_akcipher_callback(struct virtio_crypto_request * }/* actual length may be less than dst buffer */ - akcipher_req->dst_len = len -sizeof (vc_req->status); + akcipher_req->dst_len = min_t(unsigned int, len - sizeof(vc_req->status), + akcipher_req->dst_len);sg_copy_from_buffer (akcipher_req->dst,sg_nents (akcipher_req->dst), vc_akcipher_req->dst_buf, akcipher_req->dst_len);virtio_crypto_akcipher_finalize_req (vc_akcipher_req, akcipher_req, error);
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/gpu/drm/xe/xe_bo.h +14 -0
@@ -6,6 +6,7 @@#ifndef _XE_BO_H_#define _XE_BO_H_ +#include <drm/drm_prime.h> #include <drm/ttm/ttm_tt.h> #include "xe_bo_types.h"
@@ -455,6 +456,19 @@ void xe_bo_dev_fini(struct xe_bo_dev *bo_device);struct sg_table *xe_bo_sg (struct xe_bo *bo); +/** +* xe_bo_sg_is_contiguous() - Check if a BO's DMA address space is contiguous. +* @bo: the BO to check (must have a valid sg table, i.e. !xe_bo_is_vram()) +* @len: required contiguous length in bytes +* +* Returns true if the first @len bytes of the BO are mapped to a contiguous +* DMA address range. +*/ +static inline bool xe_bo_sg_is_contiguous (struct xe_bo *bo,size_t len) +{ +return drm_prime_get_contiguous_size (xe_bo_sg (bo)) >= len; +} +/* * xe_sg_segment_size() - Provides upper limit for sg segment size. * @dev: device pointer
drivers/gpu/drm/xe/xe_guc_ads.c +60 -32
137 lines not on this page · raw message
drivers/gpu/drm/xe/xe_guc_ads_types.h +5 -0
@@ -16,6 +16,11 @@ struct xe_bo;struct xe_guc_ads {/** @bo: XE BO for GuC ads blob */ struct xe_bo *bo; +/** +* @um_queue_bo: Dedicated BO for the HW fault ring (UM queues). +* NULL if the platform does not support USM. +*/ +struct xe_bo *um_queue_bo;/** @golden_lrc_size: golden LRC size */ size_t golden_lrc_size;/** @regset_size: size of register set passed to GuC for save/restore */
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
@@ -383,8 +383,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;
@@ -495,6 +495,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 ;
@@ -506,9 +515,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 ;
@@ -534,6 +543,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/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/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>
@@ -108,6 +109,7 @@ struct gtp_net { };static u32 gtp_h_initval; +static DEFINE_MUTEX (gtp_pdp_lock);static struct genl_family gtp_genl_family;
@@ -151,7 +153,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)
@@ -168,7 +171,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)
@@ -185,7 +189,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;
@@ -220,7 +225,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;
@@ -1555,9 +1561,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);
@@ -2053,6 +2061,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);
@@ -2060,6 +2069,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 ();
@@ -2134,6 +2144,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);
@@ -2154,6 +2166,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
@@ -3060,18 +3060,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
@@ -1425,6 +1425,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
@@ -145,6 +145,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;
@@ -556,9 +557,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 ;
@@ -1423,9 +1426,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 ;
@@ -1453,6 +1458,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)
@@ -1775,6 +1781,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 ;
@@ -1906,6 +1913,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
@@ -1113,7 +1113,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);
@@ -1122,6 +1121,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
@@ -757,10 +757,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 ];
@@ -770,6 +772,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);
@@ -995,10 +998,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
@@ -2023,7 +2023,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
@@ -628,8 +628,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" ;
@@ -649,10 +649,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 +17 -3
@@ -2026,7 +2026,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;
@@ -2653,6 +2653,17 @@ static bool xhci_spurious_success_tx_event(struct xhci_hcd *xhci, } } +static struct xhci_td *find_td_by_dma (struct xhci_ring *ep_ring,dma_addr_t dma) +{ +struct xhci_td *td; + +if (dma) +list_for_each_entry (td, &ep_ring->td_list, td_list) +if (trb_in_td (td, dma)) +return td; +return NULL ; +} +/* * If this function returns an error condition, it means it got a Transfer * event with a corrupted Slot ID, Endpoint ID, or TRB DMA address.
@@ -2845,8 +2856,11 @@ static int handle_tx_event(struct xhci_hcd *xhci,xhci_dequeue_td (xhci, td, ep_ring, td->status); } -/* If the TRB pointer is NULL, missed TDs will be skipped on the next event */ -if (trb_comp_code ==COMP_MISSED_SERVICE_ERROR && !ep_trb_dma) +/* +* We don't know how many TDs were missed when ep_trb_dma is zero (as permitted by +* xHCI 1.0) or bogus. Bail out leaving ep->skip set, next event will sort it out. +*/ +if (trb_comp_code ==COMP_MISSED_SERVICE_ERROR && !find_td_by_dma (ep_ring, ep_trb_dma))return 0 ;if (list_empty (&ep_ring->td_list)) {
drivers/usb/misc/usbtest.c +1 -0
@@ -3054,6 +3054,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/fuse/dir.c +4 -5
@@ -1976,10 +1976,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 ) {
@@ -2006,7 +2004,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);
@@ -2114,6 +2112,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
@@ -268,7 +268,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)
@@ -292,9 +292,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/smb/server/smb2pdu.c +4 -2
@@ -3765,8 +3765,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
@@ -175,8 +175,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/kunit/run-in-irq-context.h +6 -4
@@ -38,11 +38,13 @@ static enum hrtimer_restart kunit_irq_test_timer_func(struct hrtimer *timer) softirq_calls =atomic_read (&state->softirq_func_calls);/* -* If the timer is firing too often for the softirq or task to ever have -* a chance to run, increase the timer interval. This is needed on very -* slow systems. +* If the hrtimer is running much faster than the bh_work or the task, +* then it is firing too fast and might be starving those contexts as +* well as the actual system timer tick. Increase the interval. */ -if (hardirq_calls >=20 && (softirq_calls ==0 || task_calls ==0 )) +if (hardirq_calls >=20 && + (hardirq_calls /2 > softirq_calls || + hardirq_calls /2 > task_calls)) state->interval =ktime_add_ns (state->interval,250 );if (!state->func (state->test_specific_state))
include/linux/io_uring_types.h +8 -0
@@ -17,6 +17,14 @@ enum {* It's also ignored unless IORING_SETUP_DEFER_TASKRUN is set. */ IOU_F_TWQ_LAZY_WAKE =1 , + +/* +* Set when task_work is queued from a waitqueue wakeup handler, where +* an arbitrary provider waitqueue lock is held. Signaling the CQ ring +* eventfd inline from there can recurse back into that lock through +* epoll, so the eventfd signal must be deferred. +*/ + IOU_F_TWQ_IN_WAKE = 2, }; enum io_uring_cmd_flags {
include/linux/skbuff.h +24 -0
@@ -3110,6 +3110,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/eventfd.c +4 -4
@@ -50,9 +50,9 @@ static void io_eventfd_do_signal(struct rcu_head *rcu)/* * Returns true if the caller should put the ev_fd reference, false if not. */ -static bool __io_eventfd_signal (struct io_ev_fd *ev_fd) +static bool __io_eventfd_signal (struct io_ev_fd *ev_fd,bool defer) { -if (eventfd_signal_allowed ()) { +if (!defer &&eventfd_signal_allowed ()) {eventfd_signal_mask (ev_fd->cq_ev_fd,EPOLL_URING_WAKE );return true; }
@@ -72,7 +72,7 @@ static bool io_eventfd_trigger(struct io_ev_fd *ev_fd)return !ev_fd->eventfd_async ||io_wq_current_is_worker (); } -void io_eventfd_signal (struct io_ring_ctx *ctx,bool cqe_event) +void io_eventfd_signal (struct io_ring_ctx *ctx,bool cqe_event,bool defer) {bool skip = false;struct io_ev_fd *ev_fd;
@@ -112,7 +112,7 @@ void io_eventfd_signal(struct io_ring_ctx *ctx, bool cqe_event)spin_unlock (&ctx->completion_lock); } -if (skip ||__io_eventfd_signal (ev_fd)) +if (skip ||__io_eventfd_signal (ev_fd, defer))io_eventfd_put (ev_fd); }
io_uring/eventfd.h +1 -1
@@ -4,4 +4,4 @@ int io_eventfd_register(struct io_ring_ctx *ctx, void __user *arg, unsigned int eventfd_async);int io_eventfd_unregister (struct io_ring_ctx *ctx); -void io_eventfd_signal (struct io_ring_ctx *ctx,bool cqe_event); +void io_eventfd_signal (struct io_ring_ctx *ctx,bool cqe_event,bool defer);
io_uring/futex.c +15 -6
@@ -149,14 +149,16 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)int io_futex_wait_prep (struct io_kiocb *req,const struct io_uring_sqe *sqe) { + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex);int ret; ret =io_futex_prep (req, sqe);if (unlikely (ret))return ret; -/* Mark as inflight, so file exit cancelation will find it */ -io_req_track_inflight (req); +/* inflight tracking only needed for mm private hash */ +if (!(iof->futex_flags &FLAGS_SHARED )) +io_req_track_inflight (req);return 0 ; }
@@ -172,13 +174,14 @@ static void io_futex_wakev_fn(struct wake_q_head *wake_q, struct futex_q *q)io_req_set_res (req,0 ,0 ); req->io_task_work.func = io_futexv_complete; -io_req_task_work_add (req); +__io_req_task_work_add (req,IOU_F_TWQ_IN_WAKE ); }int io_futexv_prep (struct io_kiocb *req,const struct io_uring_sqe *sqe) { struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex);struct futex_vector *futexv; +unsigned int i;int ret;/* No flags or mask supported for waitv */
@@ -202,8 +205,14 @@ int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)return ret; } -/* Mark as inflight, so file exit cancelation will find it */ -io_req_track_inflight (req); +/* inflight tracking only needed for mm private hash */ +for (i =0 ; i < iof->futex_nr; i++) { +if (!(futexv[i].w.flags &FLAGS_SHARED )) { +io_req_track_inflight (req); +break ; + } + } + iof->futexv_owned =0 ; iof->futexv_unqueued =0 ; req->flags |=REQ_F_ASYNC_DATA ;
@@ -221,7 +230,7 @@ static void io_futex_wake_fn(struct wake_q_head *wake_q, struct futex_q *q)io_req_set_res (req,0 ,0 ); req->io_task_work.func = io_futex_complete; -io_req_task_work_add (req); +__io_req_task_work_add (req,IOU_F_TWQ_IN_WAKE ); }int io_futexv_wait (struct io_kiocb *req,unsigned int issue_flags)
io_uring/io_uring.c +3 -4
@@ -578,7 +578,7 @@ void __io_commit_cqring_flush(struct io_ring_ctx *ctx)if (ctx->off_timeout_used)io_flush_timeouts (ctx);if (ctx->has_evfd) -io_eventfd_signal (ctx, true); +io_eventfd_signal (ctx, true, false); }static inline void __io_cq_lock (struct io_ring_ctx *ctx)
@@ -1312,7 +1312,7 @@ static void io_req_local_work_add(struct io_kiocb *req, unsigned flags)if (!head) {io_ctx_mark_taskrun (ctx);if (ctx->has_evfd) -io_eventfd_signal (ctx, false); +io_eventfd_signal (ctx, false, flags &IOU_F_TWQ_IN_WAKE ); } nr_wait =atomic_read (&ctx->cq_wait_nr);
@@ -3867,8 +3867,7 @@ static __cold int io_uring_create(unsigned entries, struct io_uring_params *p,static_branch_deferred_inc (&io_key_has_sqarray);if ((ctx->flags &IORING_SETUP_DEFER_TASKRUN ) && - !(ctx->flags &IORING_SETUP_IOPOLL ) && - !(ctx->flags &IORING_SETUP_SQPOLL )) + !(ctx->flags &IORING_SETUP_IOPOLL )) ctx->task_complete = true;if (ctx->task_complete || (ctx->flags &IORING_SETUP_IOPOLL ))
io_uring/poll.c +12 -11
@@ -190,9 +190,9 @@ enum { IOU_POLL_REQUEUE = 4, }; -static void __io_poll_execute (struct io_kiocb *req,int mask) +static void __io_poll_execute (struct io_kiocb *req,int mask,unsigned tw_flags) { -unsigned flags =0 ; +unsigned flags = tw_flags;io_req_set_res (req, mask,0 ); req->io_task_work.func = io_poll_task_func;
@@ -200,14 +200,15 @@ static void __io_poll_execute(struct io_kiocb *req, int mask)trace_io_uring_task_add (req, mask);if (!(req->flags &REQ_F_POLL_NO_LAZY )) - flags =IOU_F_TWQ_LAZY_WAKE ; + flags |=IOU_F_TWQ_LAZY_WAKE ;__io_req_task_work_add (req, flags); } -static inline void io_poll_execute (struct io_kiocb *req,int res) +static inline void io_poll_execute (struct io_kiocb *req,int res, +unsigned tw_flags) {if (io_poll_get_ownership (req)) -__io_poll_execute (req, res); +__io_poll_execute (req, res, tw_flags); }/*
@@ -323,7 +324,7 @@ void io_poll_task_func(struct io_kiocb *req, io_tw_token_t tw)if (ret ==IOU_POLL_NO_ACTION ) {return ; }else if (ret ==IOU_POLL_REQUEUE ) { -__io_poll_execute (req,0 ); +__io_poll_execute (req,0 ,0 );return ; }io_poll_remove_entries (req);
@@ -362,7 +363,7 @@ static void io_poll_cancel_req(struct io_kiocb *req) {io_poll_mark_cancelled (req);/* kick tw, which should complete the request */ -io_poll_execute (req,0 ); +io_poll_execute (req,0 ,0 ); }#define IO_ASYNC_POLL_COMMON (EPOLLONESHOT | EPOLLPRI)
@@ -371,7 +372,7 @@ static __cold int io_pollfree_wake(struct io_kiocb *req, struct io_poll *poll) {io_poll_mark_cancelled (req);/* we have to kick tw in case it's not already */ -io_poll_execute (req,0 ); +io_poll_execute (req,0 ,IOU_F_TWQ_IN_WAKE );/* * If the waitqueue is being freed early but someone is already
@@ -426,7 +427,7 @@ static int io_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,else req->flags &= ~REQ_F_SINGLE_POLL ; } -__io_poll_execute (req, mask); +__io_poll_execute (req, mask,IOU_F_TWQ_IN_WAKE ); }return 1 ; }
@@ -614,7 +615,7 @@ static int __io_arm_poll_handler(struct io_kiocb *req,if (mask && (poll->events &EPOLLET ) &&io_poll_can_finish_inline (req, ipt)) { -__io_poll_execute (req, mask); +__io_poll_execute (req, mask,0 );return 0 ; }io_napi_add (req);
@@ -625,7 +626,7 @@ static int __io_arm_poll_handler(struct io_kiocb *req,* poll was waken up, queue up a tw, it'll deal with it. */ if (atomic_cmpxchg (&req->poll_refs,1 ,0 ) !=1 ) -__io_poll_execute (req,0 ); +__io_poll_execute (req,0 ,0 ); }return 0 ; }
io_uring/rsrc.c +10 -21
@@ -94,20 +94,6 @@ int io_validate_user_buf_range(u64 uaddr, u64 ulen)return 0 ; } -static int io_buffer_validate (struct iovec *iov) -{ -/* -* Don't impose further limits on the size and buffer -* constraints here, we'll -EINVAL later when IO is -* submitted if they are wrong. -*/ -if (!iov->iov_base) -return iov->iov_len ? -EFAULT :0 ; - -return io_validate_user_buf_range ((unsigned long )iov->iov_base, - iov->iov_len); -} -static void io_release_ubuf (void *priv) {struct io_mapped_ubuf *imu = priv;
@@ -317,9 +303,6 @@ static int __io_sqe_buffers_update(struct io_ring_ctx *ctx, err = -EFAULT ;break ; } - err =io_buffer_validate (iov); -if (err) -break ; node =io_sqe_buffer_register (ctx, iov, &last_hpage);if (IS_ERR (node)) { err =PTR_ERR (node);
@@ -788,8 +771,17 @@ static struct io_rsrc_node *io_sqe_buffer_register(struct io_ring_ctx *ctx,struct io_imu_folio_data data;bool coalesced = false; -if (!iov->iov_base) +if (!iov->iov_base) { +if (iov->iov_len) +return ERR_PTR (-EFAULT ); +/* remove the buffer without installing a new one */ return NULL ; + } + + ret =io_validate_user_buf_range ((unsigned long )iov->iov_base, + iov->iov_len); +if (ret) +return ERR_PTR (ret); node =io_rsrc_node_alloc (ctx,IORING_RSRC_BUFFER );if (!node)
@@ -895,9 +887,6 @@ int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg, ret =PTR_ERR (iov);break ; } - ret =io_buffer_validate (iov); -if (ret) -break ;if (ctx->compat) arg +=sizeof (struct compat_iovec );else
io_uring/waitid.c +1 -1
@@ -237,7 +237,7 @@ static int io_waitid_wait(struct wait_queue_entry *wait, unsigned mode,return 1 ; req->io_task_work.func = io_waitid_cb; -io_req_task_work_add (req); +__io_req_task_work_add (req,IOU_F_TWQ_IN_WAKE );return 1 ; }
kernel/bpf/offload.c +4 -6
@@ -445,9 +445,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 ;
@@ -657,9 +656,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 ;
mm/swapfile.c +7 -0
@@ -3519,6 +3519,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; + }/* * The swap subsystem needs a major overhaul to support this.
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/bridge/br_multicast.c +2 -2
@@ -4311,8 +4311,8 @@ void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on)if (br_vlan_is_master (vlan)) { br = vlan->br; -if (!br_vlan_is_brentry (vlan) || - (on && +if (on && + (!br_vlan_is_brentry (vlan) ||br_multicast_ctx_vlan_global_disabled (&vlan->br_mcast_ctx)))return ;
net/ipv4/tcp_ao.c +13 -6
@@ -1120,6 +1120,15 @@ void tcp_ao_connect_init(struct sock *sk) l3index =l3mdev_master_ifindex_by_index (sock_net (sk), sk->sk_bound_dev_if); +hlist_for_each_entry (key, &ao_info->head, node) { +if (tcp_ao_key_cmp (key, l3index, addr, key->prefixlen, + family,-1 ,-1 )) { +/* pairs with tcp_inbound_ao_hash() */ +synchronize_rcu (); +break ; + } + } +hlist_for_each_entry_safe (key, next, &ao_info->head, node) {if (!tcp_ao_key_cmp (key, l3index, addr, key->prefixlen, family,-1 ,-1 ))continue ;
@@ -1147,12 +1156,7 @@ void tcp_ao_connect_init(struct sock *sk) ao_info->lisn =htonl (tp->write_seq); ao_info->snd_sne =0 ; }else { -/* Can't happen: tcp_connect() verifies that there's -* at least one tcp-ao key that matches the remote peer. -*/ -WARN_ON_ONCE (1 ); -rcu_assign_pointer (tp->ao_info,NULL ); -kfree (ao_info); +tcp_ao_destroy_sock (sk, false); } }
@@ -1854,6 +1858,9 @@ static int tcp_ao_del_cmd(struct sock *sk, unsigned short int family,if (cmd.ifindex && !(cmd.keyflags &TCP_AO_KEYF_IFINDEX ))return -EINVAL ; +if (cmd.keyflags &TCP_AO_KEYF_IFINDEX ) + l3index = cmd.ifindex; + ao_info =setsockopt_ao_info (sk);if (IS_ERR (ao_info))return PTR_ERR (ao_info);
net/ipv6/ah6.c +18 -11
@@ -232,26 +232,28 @@ static void ipv6_rearrange_destopt(struct ipv6hdr *iph, struct ipv6_opt_hdr *des* Rearrange the destination address in @iph and the addresses in @rthdr * so that they appear in the order they will at the final destination. * See Appendix A2 of RFC 2402 for details. +* +* Return: 0 on success, -EINVAL if segments_left exceeds the number of +* addresses described by hdrlen. */ -static void ipv6_rearrange_rthdr (struct ipv6hdr *iph,struct ipv6_rt_hdr *rthdr) +static int ipv6_rearrange_rthdr (struct ipv6hdr *iph,struct ipv6_rt_hdr *rthdr) { -int segments, segments_left; +unsigned int segments, segments_left;struct in6_addr *addrs;struct in6_addr final_addr; segments_left = rthdr->segments_left;if (segments_left ==0 ) -return ; - rthdr->segments_left =0 ; +return 0 ; -/* The value of rthdr->hdrlen has been verified either by the system -* call if it is locally generated, or by ipv6_rthdr_rcv() for incoming -* packets. So we can assume that it is even and that segments is -* greater than or equal to segments_left. -* -* For the same reason we can assume that this option is of type 0. +/* Raw locally generated packets can reach AH6 without the invariant +* required by the rt0-style address rearrangement below. */ segments = rthdr->hdrlen >>1 ; +if (segments_left > segments) +return -EINVAL ; + + rthdr->segments_left =0 ; addrs = ((struct rt0_hdr *)rthdr)->addr; final_addr = addrs[segments -1 ];
@@ -261,6 +263,8 @@ static void ipv6_rearrange_rthdr(struct ipv6hdr *iph, struct ipv6_rt_hdr *rthdr) addrs[0 ] = iph->daddr; iph->daddr = final_addr; + +return 0 ; }static int ipv6_clear_mutable_options (struct ipv6hdr *iph,int len,int dir)
@@ -273,6 +277,7 @@ static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len, int dir) } exthdr = { .iph = iph };char *end = exthdr.raw + len;int nexthdr = iph->nexthdr; +int err; exthdr.iph++;
@@ -292,7 +297,9 @@ static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len, int dir)break ;case NEXTHDR_ROUTING : -ipv6_rearrange_rthdr (iph, exthdr.rth); + err =ipv6_rearrange_rthdr (iph, exthdr.rth); +if (err) +return err;break ;default :
net/ipv6/seg6_local.c +7 -0
@@ -256,6 +256,13 @@ static bool decap_and_validate(struct sk_buff *skb, int proto)if (iptunnel_pull_offloads (skb))return false; +if (proto ==IPPROTO_IPIP ) { +int iif =IP6CB (skb)->iif; + +memset (IPCB (skb),0 ,sizeof (*IPCB (skb))); +IPCB (skb)->iif = iif; + } +return true; }
net/netfilter/nf_tables_api.c +23 -13
@@ -8585,18 +8585,17 @@ static int nf_tables_delobj(struct sk_buff *skb, const struct nfnl_info *info,return nft_delobj (&ctx, obj); } -static void -__nft_obj_notify (struct net *net,const struct nft_table *table, -struct nft_object *obj,u32 portid,u32 seq,int event, -u16 flags,int family,int report,gfp_t gfp) +static struct sk_buff * +nft_obj_notify_alloc (struct net *net,const struct nft_table *table, +struct nft_object *obj,u32 portid,u32 seq,int event, +u16 flags,int family,int report,gfp_t gfp) { -struct nftables_pernet *nft_net =nft_pernet (net);struct sk_buff *skb;int err;if (!report && !nfnetlink_has_listeners (net,NFNLGRP_NFTABLES )) -return ; +return NULL ; skb =nlmsg_new (NLMSG_GOODSIZE , gfp);if (skb ==NULL )
@@ -8610,10 +8609,10 @@ __nft_obj_notify(struct net *net, const struct nft_table *table, goto err; } -nft_notify_enqueue (skb, report, &nft_net->notify_list); -return ; +return skb; err:nfnetlink_set_err (net, portid,NFNLGRP_NFTABLES , -ENOBUFS ); +return NULL ; } void nft_obj_notify(struct net *net, const struct nft_table *table,
@@ -8622,6 +8621,7 @@ void nft_obj_notify(struct net *net, const struct nft_table *table, {char *buf =kasprintf (gfp,"%s:%u" , table->name,nft_base_seq (net)); +struct sk_buff *skb; audit_log_nfcfg(buf, family,
@@ -8632,17 +8632,27 @@ void nft_obj_notify(struct net *net, const struct nft_table *table, gfp);kfree (buf); -__nft_obj_notify (net, table, obj, portid, seq, event, - flags, family, report, gfp); +/* Called from the packet path, holding no mutex: notify_list is +* serialised by commit_mutex, so send this notification directly. +*/ + skb =nft_obj_notify_alloc (net, table, obj, portid, seq, event, + flags, family, report, gfp); +if (skb) +nfnetlink_send (skb, net, portid,NFNLGRP_NFTABLES , report, gfp); }EXPORT_SYMBOL_GPL (nft_obj_notify);static void nf_tables_obj_notify (const struct nft_ctx *ctx,struct nft_object *obj,int event) { -__nft_obj_notify (ctx->net, ctx->table, obj, ctx->portid, - ctx->seq, event, ctx->flags, ctx->family, - ctx->report,GFP_KERNEL ); +struct nftables_pernet *nft_net =nft_pernet (ctx->net); +struct sk_buff *skb; + + skb =nft_obj_notify_alloc (ctx->net, ctx->table, obj, ctx->portid, + ctx->seq, event, ctx->flags, ctx->family, + ctx->report,GFP_KERNEL ); +if (skb) +nft_notify_enqueue (skb, ctx->report, &nft_net->notify_list); }/*
net/netfilter/nft_set_pipapo_avx2.c +8 -9
@@ -1156,6 +1156,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m,struct nft_pipapo_scratch *scratch;const struct nft_pipapo_field *f;unsigned long *res, *fill, *map; +struct nft_pipapo_elem *e;bool map_index;int i;
@@ -1228,14 +1229,11 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, next_match:if (ret <0 ) { scratch->map_index = map_index; -kernel_fpu_end (); -__local_unlock_nested_bh (&scratch->bh_lock); -return NULL ; + e =NULL ; + goto out; }if (last) { -struct nft_pipapo_elem *e; - e = f->mt[ret].e;if (unlikely (__nft_set_elem_expired (&e->ext, tstamp) || !nft_set_elem_active (&e->ext, genmask))) {
@@ -1245,9 +1243,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, } scratch->map_index = map_index; -kernel_fpu_end (); -__local_unlock_nested_bh (&scratch->bh_lock); -return e; + goto out; } map_index = !map_index;
@@ -1255,9 +1251,12 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, data +=NFT_PIPAPO_GROUPS_PADDED_SIZE (f); } + e =NULL ; +out: + asmvolatile ("vzeroupper" );kernel_fpu_end ();__local_unlock_nested_bh (&scratch->bh_lock); -return NULL ; +return e; }/**
net/tls/tls_device.c +2 -1
@@ -530,7 +530,8 @@ static int tls_push_data(struct sock *sk,if (!size) { last_record: tls_push_record_flags = flags; -if (flags &MSG_MORE ) { +if ((flags &MSG_MORE ) && + record->num_frags <MAX_SKB_FRAGS -1 ) { more = true;break ; }
net/xfrm/espintcp.c +8 -1
@@ -40,6 +40,11 @@ static void handle_esp(struct sk_buff *skb, struct sock *sk)rcu_read_lock (); skb->dev =dev_get_by_index_rcu (sock_net (sk), skb->skb_iif); +if (!skb->dev) { +XFRM_INC_STATS (sock_net (sk),LINUX_MIB_XFRMINERROR ); +kfree_skb (skb); + goto out; + }local_bh_disable ();#if IS_ENABLED (CONFIG_IPV6 )if (sk->sk_family ==AF_INET6 )
@@ -48,6 +53,7 @@ static void handle_esp(struct sk_buff *skb, struct sock *sk)#endif xfrm4_rcv_encap (skb,IPPROTO_ESP ,0 ,TCP_ENCAP_ESPINTCP );local_bh_enable (); +out:rcu_read_unlock (); }
@@ -518,7 +524,8 @@ static void espintcp_close(struct sock *sk, long timeout)strp_stop (&ctx->strp); sk->sk_prot = &tcp_prot; -barrier (); + +synchronize_rcu ();disable_work_sync (&ctx->work);strp_done (&ctx->strp);
net/xfrm/xfrm_nat_keepalive.c +44 -9
61 lines not on this page · raw message
security/selinux/ss/policydb.c +211 -43
254 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.