Linux 7.1.13
Greg Kroah-Hartman
maintainer-------------------
Note, the 7.1.y kernel series is now end-of-life. Please move to the 7.2.y kernel series at this point in time.
-------------------
I'm announcing the release of the 7.1.13 kernel.
All users of the 7.1 kernel series must upgrade.
The updated 7.1.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-7.1.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/s390/kvm/vsie.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/intel/iaa/iaa_crypto_main.c | 111 ++-- drivers/crypto/intel/iaa/iaa_crypto_stats.c | 9 drivers/crypto/intel/iaa/iaa_crypto_stats.h | 2 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/infiniband/sw/rxe/rxe_qp.c | 18 drivers/net/gtp.c | 21 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/host/xhci.c | 11 drivers/usb/misc/usbtest.c | 1 drivers/usb/serial/option.c | 20 drivers/usb/serial/spcp8x5.c | 13 fs/ext4/ext4.h | 8 fs/ext4/extents.c | 166 +++++-- fs/ext4/file.c | 3 fs/ext4/inode.c | 36 + fs/fuse/dir.c | 9 fs/fuse/file.c | 4 include/kunit/run-in-irq-context.h | 10 include/linux/skbuff.h | 24 + include/net/ip.h | 25 + include/net/ip6_route.h | 37 + include/net/tcp.h | 5 include/target/target_core_fabric.h | 2 kernel/bpf/verifier.c | 6 mm/swapfile.c | 7 net/batman-adv/tvlv.c | 5 net/bridge/br_multicast.c | 4 net/ipv4/route.c | 4 net/ipv4/tcp_ao.c | 19 net/ipv4/tcp_ipv4.c | 2 net/ipv4/tcp_minisocks.c | 2 net/ipv4/tcp_output.c | 6 net/ipv6/ah6.c | 29 - net/ipv6/route.c | 2 net/ipv6/seg6_local.c | 7 net/ipv6/tcp_ipv6.c | 2 net/netfilter/nf_tables_api.c | 36 - net/netfilter/nft_set_pipapo_avx2.c | 17 net/packet/af_packet.c | 96 +++- 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 | 22 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/usb/card.c | 14 sound/usb/midi.c | 2 sound/usb/quirks-table.h | 10 tools/testing/selftests/bpf/progs/verifier_global_subprogs.c | 17 85 files changed, 1183 insertions(+), 725 deletions(-)
Aleksandr Nogikh (1):
usb: usbtest: disable dynamic ID support
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
Breno Leitao (1):
usb: xhci: bail out of setup if the controller is inaccessible
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
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
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
Giovanni Cabiddu (1):
crypto: iaa - fall back to software for multi-entry scatterlists
Greg Kroah-Hartman (1):
Linux 7.1.13
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
Jiale Yao (1):
USB: serial: option: fix slab OOB read in interrupt URB callback
Jiayuan Chen (2):
tls: device: fix out-of-bounds write in tls_append_frag()
net: advertise TCP MSS from the configured MTU, not the learned PMTU
Jinu Kim (1):
KVM: x86/mmu: Check write tracking in all address spaces
Johan Hovold (1):
USB: serial: spcp8x5: drop broken carrier detect support
Kyle Zeng (4):
net/packet: defer vmalloc TX_RING free until skbs finish
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
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
Peiyang He (1):
RDMA/rxe: Fix OOB in free_rd_atomic_resources()
Qing Ming (2):
gtp: serialize PDP context updates
tcp: fix AO info use-after-free in tcp_ao_connect_init()
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()
Taegu Ha (1):
bpf: reject overlarge global subprog argument sizes
Thorsten Blum (2):
crypto: atmel-tdes - use scatterlist length before DMA mapping
crypto: mxs-dcp - fix source scatterlist length access
Trevor Vorhees (1):
ALSA: usb-audio: Fix sample rates for PreSonus AudioBox USB
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
Yong Wang (1):
tcp: clamp route advmss to TCP_MIN_MSS
Zhang Yi (6):
ext4: export converted block count from ext4_convert_unwritten_extents()
ext4: protect WRITE_ZEROES written extents with orphan list
ext4: move partial block zeroing earlier in ext4_zero_range()
ext4: write back partial-zeroed edges in WRITE_ZEROES
ext4: track partial-zero outcome per edge in ext4_zero_partial_blocks()
ext4: zero out whole block for clean edges in WRITE_ZEROES
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
@@ -1238,6 +1238,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 = 7 PATCHLEVEL = 1 -SUBLEVEL = 12 +SUBLEVEL = 13 EXTRAVERSION = NAME = Baby Opossum Posse
arch/s390/kvm/vsie.c +1 -0
@@ -170,6 +170,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/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
@@ -5400,6 +5400,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,
@@ -5411,10 +5415,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
@@ -268,7 +268,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; };
@@ -992,16 +993,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/intel/iaa/iaa_crypto_main.c +60 -51
195 lines not on this page · raw message
drivers/crypto/intel/iaa/iaa_crypto_stats.c +9 -0
@@ -19,6 +19,7 @@static atomic64_t total_comp_calls;static atomic64_t total_decomp_calls; +static atomic64_t total_sw_comp_calls;static atomic64_t total_sw_decomp_calls;static atomic64_t total_comp_bytes_out;static atomic64_t total_decomp_bytes_in;
@@ -43,6 +44,11 @@ void update_total_decomp_calls(void)atomic64_inc (&total_decomp_calls); } +void update_total_sw_comp_calls (void ) +{ +atomic64_inc (&total_sw_comp_calls); +} +void update_total_sw_decomp_calls (void ) {atomic64_inc (&total_sw_decomp_calls);
@@ -104,6 +110,7 @@ static void reset_iaa_crypto_stats(void) {atomic64_set (&total_comp_calls,0 );atomic64_set (&total_decomp_calls,0 ); +atomic64_set (&total_sw_comp_calls,0 );atomic64_set (&total_sw_decomp_calls,0 );atomic64_set (&total_comp_bytes_out,0 );atomic64_set (&total_decomp_bytes_in,0 );
@@ -174,6 +181,8 @@ static int global_stats_show(struct seq_file *m, void *v) atomic64_read(&total_comp_calls));seq_printf (m," total_decomp_calls: %llu\n" ,atomic64_read (&total_decomp_calls)); +seq_printf (m," total_sw_comp_calls: %llu\n" , +atomic64_read (&total_sw_comp_calls));seq_printf (m," total_sw_decomp_calls: %llu\n" ,atomic64_read (&total_sw_decomp_calls)); seq_printf(m, " total_comp_bytes_out: %llu\n",
drivers/crypto/intel/iaa/iaa_crypto_stats.h +2 -0
@@ -11,6 +11,7 @@ void iaa_crypto_debugfs_cleanup(void);void update_total_comp_calls (void );void update_total_comp_bytes_out (int n);void update_total_decomp_calls (void ); +void update_total_sw_comp_calls (void );void update_total_sw_decomp_calls (void );void update_total_decomp_bytes_in (int n);void update_completion_einval_errs (void );
@@ -29,6 +30,7 @@ static inline void iaa_crypto_debugfs_cleanup(void) {}static inline void update_total_comp_calls (void ) {}static inline void update_total_comp_bytes_out (int n) {}static inline void update_total_decomp_calls (void ) {} +static inline void update_total_sw_comp_calls (void ) {}static inline void update_total_sw_decomp_calls (void ) {}static inline void update_total_decomp_bytes_in (int n) {}static inline void update_completion_einval_errs (void ) {}
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
@@ -25,10 +25,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
@@ -349,9 +345,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 ;
@@ -412,15 +406,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" ,
@@ -430,15 +415,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)",
@@ -476,9 +452,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/infiniband/sw/rxe/rxe_qp.c +15 -3
@@ -172,6 +172,7 @@ static void free_rd_atomic_resources(struct rxe_qp *qp) }kfree (qp->resp.resources); qp->resp.resources =NULL ; + qp->resp.res =NULL ; } }
@@ -707,13 +708,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/vxlan/vxlan_core.c +5 -4
@@ -3059,18 +3059,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
@@ -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;
@@ -557,9 +558,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 ;
@@ -1424,9 +1427,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 ;
@@ -1468,6 +1473,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)
@@ -1790,6 +1796,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 ;
@@ -1921,6 +1928,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
@@ -753,10 +753,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 ];
@@ -766,6 +768,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);
@@ -991,10 +994,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
@@ -2024,7 +2024,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
@@ -2025,7 +2025,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;
@@ -2625,6 +2625,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.
@@ -2819,8 +2830,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/host/xhci.c +8 -3
@@ -5436,6 +5436,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)struct device *dev = hcd->self.sysdev;int retval;u32 hcs_params1; +u32 hc_capbase;/* Accept arbitrarily long scatter-gather lists */ hcd->self.sg_tablesize = ~0 ;
@@ -5456,15 +5457,19 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)mutex_init (&xhci->mutex); xhci->main_hcd = hcd; xhci->cap_regs = hcd->regs; - xhci->op_regs = hcd->regs + -HC_LENGTH (readl (&xhci->cap_regs->hc_capbase)); + hc_capbase =readl (&xhci->cap_regs->hc_capbase); +if (hc_capbase ==U32_MAX ) { +xhci_warn (xhci,"Host controller not accessible, removed?\n" ); +return -ENODEV ; + } + xhci->op_regs = hcd->regs +HC_LENGTH (hc_capbase); xhci->run_regs = hcd->regs + (readl (&xhci->cap_regs->run_regs_off) &RTSOFF_MASK );/* Cache read-only capability registers */ hcs_params1 =readl (&xhci->cap_regs->hcs_params1); xhci->hcs_params2 =readl (&xhci->cap_regs->hcs_params2); xhci->hcs_params3 =readl (&xhci->cap_regs->hcs_params3); - xhci->hci_version =HC_VERSION (readl (&xhci->cap_regs->hc_capbase)); + xhci->hci_version =HC_VERSION (hc_capbase); xhci->hcc_params =readl (&xhci->cap_regs->hcc_params);if (xhci->hci_version >0x100 ) xhci->hcc_params2 =readl (&xhci->cap_regs->hcc_params2);
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/ext4/ext4.h +6 -2
@@ -3119,8 +3119,11 @@ extern int ext4_chunk_trans_extent(struct inode *inode, int nrblocks);extern int ext4_meta_trans_blocks (struct inode *inode,int lblocks,int pextents);extern int ext4_block_zero_eof (struct inode *inode,loff_t from,loff_t end); + +#define EXT4_PARTIAL_ZERO_START 0x1 +#define EXT4_PARTIAL_ZERO_END 0x2extern int ext4_zero_partial_blocks (struct inode *inode,loff_t lstart, -loff_t length,bool *did_zero); +loff_t length,unsigned int *partial_zeroed);extern vm_fault_t ext4_page_mkwrite (struct vm_fault *vmf);extern qsize_t *ext4_get_reserved_space (struct inode *inode);extern int ext4_get_projid (struct inode *inode,kprojid_t *projid);
@@ -3813,7 +3816,8 @@ extern void ext4_ext_release(struct super_block *);extern long ext4_fallocate (struct file *file,int mode,loff_t offset,loff_t len);extern int ext4_convert_unwritten_extents (handle_t *handle,struct inode *inode, -loff_t offset,ssize_t len); +loff_t offset,ssize_t len, +ext4_lblk_t *converted);extern int ext4_convert_unwritten_extents_atomic (handle_t *handle,struct inode *inode,loff_t offset,ssize_t len); extern int ext4_convert_unwritten_io_end_vec(handle_t *handle,
fs/ext4/extents.c +134 -32
276 lines not on this page · raw message
fs/ext4/file.c +2 -1
@@ -400,7 +400,8 @@ static int ext4_dio_write_end_io(struct kiocb *iocb, ssize_t size, error =ext4_convert_unwritten_extents_atomic (NULL , inode, pos, size); else if (!error && size && flags & IOMAP_DIO_UNWRITTEN) - error =ext4_convert_unwritten_extents (NULL , inode, pos, size); + error =ext4_convert_unwritten_extents (NULL , inode, pos, size, +NULL );if (error)return error;/*
fs/ext4/inode.c +30 -6
@@ -4254,13 +4254,26 @@ int ext4_block_zero_eof(struct inode *inode, loff_t from, loff_t end)return 0 ; } +/* +* Zero out the unaligned head and tail of the [lstart, lstart+length) +* range. +* +* On return, @partial_zeroed records which edges actually got +* partial-zeroed. Set EXT4_PARTIAL_ZERO_START/EXT4_PARTIAL_ZERO_END if +* the head/tail block got actually partially zeroed (in written, dirty +* unwritten or delalloc state). Cleared if the head/tail block is a +* hole or a clean unwritten block, in which case there is nothing that +* needs zeroing. When the head and tail land in the same block, both +* bits are set together on a successful zeroing. +*/ int ext4_zero_partial_blocks (struct inode *inode,loff_t lstart,loff_t length, -bool *did_zero) +unsigned int *partial_zeroed) {struct super_block *sb = inode->i_sb;unsigned partial_start, partial_end;ext4_fsblk_t start, end;loff_t byte_end = (lstart + length -1 ); +bool did_zero = false;int err =0 ; partial_start = lstart & (sb->s_blocksize -1 );
@@ -4272,21 +4285,32 @@ int ext4_zero_partial_blocks(struct inode *inode, loff_t lstart, loff_t length,/* Handle partial zero within the single block */ if (start == end && (partial_start || (partial_end != sb->s_blocksize -1 ))) { - err =ext4_block_zero_range (inode, lstart, length, did_zero, + err =ext4_block_zero_range (inode, lstart, length, &did_zero,NULL ); +if (did_zero) + *partial_zeroed |= (EXT4_PARTIAL_ZERO_START | +EXT4_PARTIAL_ZERO_END );return err; }/* Handle partial zero out on the start of the range */ if (partial_start) { err =ext4_block_zero_range (inode, lstart, sb->s_blocksize, - did_zero,NULL ); + &did_zero,NULL );if (err)return err; +if (did_zero) + *partial_zeroed |=EXT4_PARTIAL_ZERO_START ; }/* Handle partial zero out on the end of the range */ -if (partial_end != sb->s_blocksize -1 ) +if (partial_end != sb->s_blocksize -1 ) { + did_zero = false; err =ext4_block_zero_range (inode, byte_end - partial_end, - partial_end +1 , did_zero,NULL ); + partial_end +1 , &did_zero,NULL ); +if (err) +return err; +if (did_zero) + *partial_zeroed |=EXT4_PARTIAL_ZERO_END ; + }return err; }
@@ -4435,7 +4459,7 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)loff_t end = offset + length;handle_t *handle;unsigned int credits; -bool partial_zeroed = false; +unsigned int partial_zeroed =0 ;int ret;trace_ext4_punch_hole (inode, offset, length,0 );
fs/fuse/dir.c +4 -5
@@ -2163,10 +2163,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 ) {
@@ -2193,7 +2191,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);
@@ -2301,6 +2299,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
@@ -274,7 +274,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)
@@ -298,9 +298,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);
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/skbuff.h +24 -0
@@ -3127,6 +3127,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/net/ip.h +25 -0
@@ -506,6 +506,31 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,return res; } +/* Configured/administrative MTU of a route, for advertising the TCP MSS. +* +* Unlike ip_dst_mtu_maybe_forward(), this deliberately ignores the +* ICMP-learned path MTU (rt->rt_pmtu). The advertised MSS bounds what the +* peer may send to us and must reflect our receive capability (the device or +* route-configured MTU), not a path MTU learned on the reverse (send) +* direction, which may not apply to the peer->us path and outlives the fnhe +* for the whole connection. See RFC 2923 section 2.3 and the comment above +* tcp_advertise_mss(). +*/ +static inline unsigned int ip_dst_mtu_configured (const struct dst_entry *dst) +{ +unsigned int mtu, res; + +rcu_read_lock (); + mtu =dst_metric_raw (dst,RTAX_MTU ); +if (!mtu) + mtu =READ_ONCE (dst_dev_rcu (dst)->mtu); + mtu = min_t(unsigned int, mtu, IP_MAX_MTU); + res = mtu -lwtunnel_headroom (dst->lwtstate, mtu); +rcu_read_unlock (); + +return res; +} +static inline unsigned int ip_skb_dst_mtu (struct sock *sk,const struct sk_buff *skb) {
include/net/ip6_route.h +37 -0
@@ -385,6 +385,43 @@ static inline unsigned int ip6_dst_mtu_maybe_forward(const struct dst_entry *dstreturn mtu -lwtunnel_headroom (dst->lwtstate, mtu); } +/* Configured/administrative MTU of a route, for advertising the TCP MSS. +* +* Unlike ip6_dst_mtu_maybe_forward(), this ignores any ICMPv6-learned path +* MTU (which is kept on the RTF_CACHE exception route) and returns the MTU of +* the underlying route (fib6_pmtu) or the egress device. The advertised MSS +* bounds what the peer may send to us and must reflect our receive +* capability, not a path MTU learned on the reverse (send) direction. See +* RFC 2923 section 2.3 and the comment above tcp_advertise_mss(). +*/ +static inline unsigned int ip6_dst_mtu_configured (const struct dst_entry *dst) +{ +const struct rt6_info *rt =dst_rt6_info (dst); +const struct fib6_info *from; +struct inet6_dev *idev; +unsigned int mtu =0 ; + +rcu_read_lock (); +/* IPv6 keeps the learned PMTU and the configured MTU in the same +* RTAX_MTU slot: the learned value sits on this (possibly RTF_CACHE) +* dst, the configured one on the underlying route. Reach the latter +* via ->from (fib6_pmtu), populated by ip6_route_info_create(). +*/ + from =rcu_dereference (rt->from); +if (from) + mtu = from->fib6_pmtu; +if (!mtu) { + mtu =IPV6_MIN_MTU ; + idev =__in6_dev_get (dst_dev_rcu (dst)); +if (idev) + mtu = max_t(unsigned int, mtu, READ_ONCE(idev->cnf.mtu6)); + } +rcu_read_unlock (); + + mtu = min_t(unsigned int, mtu, IP6_MAX_MTU); +return mtu -lwtunnel_headroom (dst->lwtstate, mtu); +} +u32 ip6_mtu_from_fib6 (const struct fib6_result *res,const struct in6_addr *daddr,const struct in6_addr *saddr);
include/net/tcp.h +5 -0
@@ -1773,6 +1773,11 @@ static inline int tcp_full_space(const struct sock *sk)return tcp_win_from_space (sk,READ_ONCE (sk->sk_rcvbuf)); } +static inline u32 tcp_dst_advmss (const struct dst_entry *dst) +{ +return max_t (u32,dst_metric_advmss (dst),TCP_MIN_MSS ); +} +static inline void __tcp_adjust_rcv_ssthresh (struct sock *sk,u32 new_ssthresh) {int unused_mem =sk_unused_reserved_mem (sk);
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 *);
kernel/bpf/verifier.c +6 -0
@@ -7119,6 +7119,12 @@ static int check_mem_reg(struct bpf_verifier_env *env, struct bpf_reg_state *regif (bpf_register_is_null (reg))return 0 ; +if (mem_size >S32_MAX ) { +verbose (env,"R%d memory size %u is too large\n" , + regno, mem_size); +return -EACCES ; + } +/* Assuming that the register contains a value check if the memory * access is safe. Temporarily save and restore the register's state as * the conversion shouldn't be visible to a caller.
mm/swapfile.c +7 -0
@@ -3489,6 +3489,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/route.c +2 -2
@@ -1360,8 +1360,8 @@ static unsigned int ipv4_default_advmss(const struct dst_entry *dst)rcu_read_lock (); net =dst_dev_net_rcu (dst); - advmss = max_t(unsigned int, ipv4_mtu(dst) - header_size, - net->ipv4.ip_rt_min_advmss); + advmss = max_t(unsigned int, ip_dst_mtu_configured(dst) - header_size, + net->ipv4.ip_rt_min_advmss);rcu_read_unlock ();return min (advmss,IPV4_MAX_PMTU - header_size);
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/ipv4/tcp_ipv4.c +1 -1
@@ -1736,7 +1736,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,tcp_ca_openreq_child (newsk, dst);tcp_sync_mss (newsk,dst4_mtu (dst)); - newtp->advmss =tcp_mss_clamp (tcp_sk (sk),dst_metric_advmss (dst)); + newtp->advmss =tcp_mss_clamp (tcp_sk (sk),tcp_dst_advmss (dst));tcp_initialize_rcv_mss (newsk);
net/ipv4/tcp_minisocks.c +1 -1
@@ -441,7 +441,7 @@ void tcp_openreq_init_rwin(struct request_sock *req,u32 rcv_wnd;int mss; - mss =tcp_mss_clamp (tp,dst_metric_advmss (dst)); + mss =tcp_mss_clamp (tp,tcp_dst_advmss (dst)); window_clamp =READ_ONCE (tp->window_clamp);/* Set this up on the first call only */ req->rsk_window_clamp = window_clamp ? :dst_metric (dst,RTAX_WINDOW );
net/ipv4/tcp_output.c +3 -3
@@ -149,7 +149,7 @@ static __u16 tcp_advertise_mss(struct sock *sk)int mss = tp->advmss;if (dst) { -unsigned int metric =dst_metric_advmss (dst); +unsigned int metric =tcp_dst_advmss (dst);if (metric < mss) { mss = metric;
@@ -3971,7 +3971,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, }skb_dst_set (skb, dst); - mss =tcp_mss_clamp (tp,dst_metric_advmss (dst)); + mss =tcp_mss_clamp (tp,tcp_dst_advmss (dst));memset (&opts,0 ,sizeof (opts)); now =tcp_clock_ns ();
@@ -4126,7 +4126,7 @@ static void tcp_connect_init(struct sock *sk)if (!tp->window_clamp)WRITE_ONCE (tp->window_clamp,dst_metric (dst,RTAX_WINDOW )); - tp->advmss =tcp_mss_clamp (tp,dst_metric_advmss (dst)); + tp->advmss =tcp_mss_clamp (tp,tcp_dst_advmss (dst));tcp_initialize_rcv_mss (sk);
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/route.c +1 -1
@@ -3259,7 +3259,7 @@ EXPORT_SYMBOL_GPL(ip6_sk_redirect);static unsigned int ip6_default_advmss (const struct dst_entry *dst) { -unsigned int mtu =dst6_mtu (dst); +unsigned int mtu =ip6_dst_mtu_configured (dst);struct net *net; mtu -=sizeof (struct ipv6hdr ) +sizeof (struct tcphdr );
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/ipv6/tcp_ipv6.c +1 -1
@@ -1472,7 +1472,7 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *tcp_ca_openreq_child (newsk, dst);tcp_sync_mss (newsk,dst6_mtu (dst)); - newtp->advmss =tcp_mss_clamp (tcp_sk (sk),dst_metric_advmss (dst)); + newtp->advmss =tcp_mss_clamp (tcp_sk (sk),tcp_dst_advmss (dst));tcp_initialize_rcv_mss (newsk);
net/netfilter/nf_tables_api.c +23 -13
@@ -8709,18 +8709,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 )
@@ -8734,10 +8733,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,
@@ -8746,6 +8745,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,
@@ -8756,17 +8756,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
@@ -1142,6 +1142,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;
@@ -1214,14 +1215,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))) {
@@ -1231,9 +1229,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;
@@ -1241,9 +1237,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/packet/af_packet.c +87 -9
181 lines not on this page · raw message
net/tls/tls_device.c +2 -1
@@ -531,7 +531,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
@@ -37,6 +37,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 )
@@ -45,6 +50,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 (); }
@@ -515,7 +521,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
96 lines not on this page · raw message
net/xfrm/xfrm_user.c +1 -1
@@ -925,7 +925,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,if ((err =attach_auth_trunc (&x->aalg, &x->props.aalgo, attrs[XFRMA_ALG_AUTH_TRUNC ], extack))) goto error; -if (!x->props.aalgo) { +if (!x->aalg) {if ((err =attach_auth (&x->aalg, &x->props.aalgo, attrs[XFRMA_ALG_AUTH ], extack))) goto error;
security/selinux/include/security.h +1 -0
@@ -236,6 +236,7 @@ int security_read_policy(void **data, size_t *len);int security_read_state_kernel (void **data,size_t *len);int security_policycap_supported (unsigned int req_cap); +/* Maximum supported number of permissions per class */ #define SEL_VEC_MAX 32struct av_decision {u32 allowed;
security/selinux/ss/avtab.c +29 -6
@@ -316,7 +316,7 @@ int avtab_read_item(struct avtab *a, struct policy_file *fp, struct policydb *postruct avtab_extended_perms xperms;__le32 buf32[ARRAY_SIZE (xperms.perms.p)];int rc; -unsigned int set, vers = pol->policyvers; +unsigned int vers = pol->policyvers;memset (&key,0 ,sizeof (struct avtab_key ));memset (&datum,0 ,sizeof (struct avtab_datum ));
@@ -327,9 +327,12 @@ int avtab_read_item(struct avtab *a, struct policy_file *fp, struct policydb *popr_err ("SELinux: avtab: truncated entry\n" );return rc; } +/* Read five or more items: source type, target type, +* target class, AV type, and at least one datum. +*/ items2 =le32_to_cpu (buf32[0 ]); -if (items2 >ARRAY_SIZE (buf32)) { -pr_err ("SELinux: avtab: entry overflow\n" ); +if (items2 <5 || items2 >ARRAY_SIZE (buf32)) { +pr_err ("SELinux: avtab: invalid item count\n" );return -EINVAL ; } rc =next_entry (buf32, fp,sizeof (u32) * items2);
@@ -358,6 +361,13 @@ int avtab_read_item(struct avtab *a, struct policy_file *fp, struct policydb *poreturn -EINVAL ; } +if (!policydb_type_isvalid (pol, key.source_type) || + !policydb_type_isvalid (pol, key.target_type) || + !policydb_class_isvalid (pol, key.target_class)) { +pr_err ("SELinux: avtab: invalid type or class\n" ); +return -EINVAL ; + } + val =le32_to_cpu (buf32[items++]); enabled = (val &AVTAB_ENABLED_OLD ) ?AVTAB_ENABLED :0 ;
@@ -376,6 +386,11 @@ int avtab_read_item(struct avtab *a, struct policy_file *fp, struct policydb *pofor (i =0 ; i <ARRAY_SIZE (spec_order); i++) {if (val & spec_order[i]) { +if (items >= items2) { +pr_err ("SELinux: avtab: entry has too many items (%d/%d)\n" , + items +1 , items2); +return -EINVAL ;
Lines of this file are not shown. View the raw message.
security/selinux/ss/policydb.c +211 -43
254 lines not on this page · raw message
tools/testing/selftests/bpf/progs/verifier_global_subprogs.c +17 -0
Lines of this file are not shown. View the 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.