Linux 5.16.18
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.16.18 kernel.
All users of the 5.16 kernel series must upgrade.
The updated 5.16.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.16.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
------------
Makefile | 2 arch/csky/include/asm/uaccess.h | 7 - arch/hexagon/include/asm/uaccess.h | 18 ++-- arch/m68k/include/asm/uaccess.h | 15 ++- arch/microblaze/include/asm/uaccess.h | 19 ---- arch/nds32/include/asm/uaccess.h | 22 ++++- arch/x86/kernel/acpi/boot.c | 24 +++++ drivers/acpi/battery.c | 12 ++ drivers/acpi/video_detect.c | 75 +++++++++++++++++ drivers/bluetooth/btusb.c | 4 drivers/char/tpm/tpm-dev-common.c | 8 + drivers/char/tpm/tpm2-space.c | 8 - drivers/crypto/qat/qat_4xxx/adf_drv.c | 7 + drivers/crypto/qat/qat_common/qat_crypto.c | 7 + drivers/gpu/drm/virtio/virtgpu_gem.c | 3 drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 12 +- drivers/net/wireless/ath/regd.c | 10 +- drivers/net/wireless/ath/wcn36xx/main.c | 3 drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 drivers/nfc/st21nfca/se.c | 10 ++ include/sound/pcm.h | 1 kernel/rcu/tree_plugin.h | 8 - net/ipv6/ip6_output.c | 4 net/llc/af_llc.c | 48 +++++++---- net/mac80211/cfg.c | 3 net/netfilter/nf_tables_api.c | 22 ++++- net/netfilter/nf_tables_core.c | 2 sound/core/oss/pcm_oss.c | 12 +- sound/core/oss/pcm_plugin.c | 5 - sound/core/pcm.c | 2 sound/core/pcm_lib.c | 4 sound/core/pcm_memory.c | 11 +- sound/core/pcm_native.c | 97 ++++++++++++++--------- sound/pci/ac97/ac97_codec.c | 4 sound/pci/cmipci.c | 3 sound/pci/hda/patch_realtek.c | 4 sound/soc/sti/uniperif_player.c | 6 - sound/soc/sti/uniperif_reader.c | 2 sound/usb/mixer_maps.c | 10 ++ sound/usb/mixer_quirks.c | 7 - 40 files changed, 380 insertions(+), 142 deletions(-)
Arnd Bergmann (3):
uaccess: fix integer overflow on access_ok()
m68k: fix access_ok for coldfire
nds32: fix access_ok() checks in get/put_user
Brian Norris (1):
Revert "ath: add support for special 0x0 regulatory domain"
Bryan O'Donoghue (1):
wcn36xx: Differentiate wcn3660 from wcn3620
Eric Dumazet (2):
llc: fix netdevice reference leaks in llc_ui_bind()
llc: only change llc->dev when bind() succeeds
Giacomo Guiduzzi (1):
ALSA: pci: fix reading of swapped values from pcmreg in AC97 codec
Giovanni Cabiddu (1):
crypto: qat - disable registration of algorithms
Greg Kroah-Hartman (1):
Linux 5.16.18
Helmut Grohne (1):
Bluetooth: btusb: Add another Realtek 8761BU
James Bottomley (1):
tpm: use try_get_ops() in tpm-space.c
Jason Zheng (1):
ALSA: hda/realtek: Add quirk for ASUS GA402
Jonathan Teh (1):
ALSA: cmipci: Restore aux vol on suspend/resume
Jordy Zomer (1):
nfc: st21nfca: Fix potential buffer overflows in EVT_TRANSACTION
Larry Finger (1):
Bluetooth: btusb: Add one more Bluetooth part for the Realtek RTL8852AE
Lars-Peter Clausen (1):
ALSA: usb-audio: Add mute TLV for playback volumes on RODE NT-USB
Linus Lüssing (1):
mac80211: fix potential double free on mesh join
Mark Cilissen (1):
ACPI / x86: Work around broken XSDT on Advantech DAC-BJ01 board
Maximilian Luz (1):
ACPI: battery: Add device HID and quirk for Microsoft Surface Go 3
Pablo Neira Ayuso (2):
netfilter: nf_tables: initialize registers in nft_do_chain()
netfilter: nf_tables: validate registers coming from userspace.
Paul E. McKenney (1):
rcu: Don't deboost before reporting expedited quiescent state
Reza Jahanbakhshi (1):
ALSA: usb-audio: add mapping for new Corsair Virtuoso SE
Roberto Sassu (1):
drm/virtio: Ensure that objs is not NULL in virtio_gpu_array_put_free()
Stephane Graber (1):
drivers: net: xgene: Fix regression in CRC stripping
Tadeusz Struk (2):
net: ipv6: fix skb_over_panic in __ip6_append_data
tpm: Fix error handling in async work
Takashi Iwai (7):
ASoC: sti: Fix deadlock via snd_pcm_stop_xrun() call
ALSA: oss: Fix PCM OSS buffer allocation overflow
ALSA: pcm: Fix races among concurrent hw_params and hw_free calls
ALSA: pcm: Fix races among concurrent read/write and buffer changes
ALSA: pcm: Fix races among concurrent prepare and hw_params/hw_free calls
ALSA: pcm: Fix races among concurrent prealloc proc writes
ALSA: pcm: Add stream lock during PCM reset ioctl operations
Tim Crawford (2):
ALSA: hda/realtek: Add quirk for Clevo NP70PNJ
ALSA: hda/realtek: Add quirk for Clevo NP50PNJ
Werner Sembach (1):
ACPI: video: Force backlight native for Clevo NL5xRU and NL5xNU
huangwenhui (1):
ALSA: hda/realtek - Fix headset mic problem for a HP machine with alc671
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 16 -SUBLEVEL = 17 +SUBLEVEL = 18 EXTRAVERSION = NAME = Gobble Gobble
arch/csky/include/asm/uaccess.h +3 -4
@@ -3,14 +3,13 @@#ifndef __ASM_CSKY_UACCESS_H#define __ASM_CSKY_UACCESS_H -#define user_addr_max () \ - (uaccess_kernel() ? KERNEL_DS.seg : get_fs().seg) +#define user_addr_max () (current_thread_info()->addr_limit.seg)static inline int __access_ok (unsigned long addr,unsigned long size) { -unsigned long limit =current_thread_info ()->addr_limit.seg; +unsigned long limit =user_addr_max (); -return ((addr < limit) && ((addr + size) < limit)); +return (size <= limit) && (addr <= (limit - size)); }#define __access_ok __access_ok
arch/hexagon/include/asm/uaccess.h +9 -9
@@ -25,17 +25,17 @@* Returns true (nonzero) if the memory block *may* be valid, false (zero) * if it is definitely invalid. * -* User address space in Hexagon, like x86, goes to 0xbfffffff, so the -* simple MSB-based tests used by MIPS won't work. Some further -* optimization is probably possible here, but for now, keep it -* reasonably simple and not *too* slow. After all, we've got the -* MMU for backup. */ +#define uaccess_kernel () (get_fs().seg == KERNEL_DS.seg) +#define user_addr_max () (uaccess_kernel() ? ~0UL : TASK_SIZE) -#define __access_ok (addr, size) \ - ((get_fs().seg == KERNEL_DS.seg) || \ - (((unsigned long)addr < get_fs().seg) && \ - (unsigned long)size < (get_fs().seg - (unsigned long)addr))) +static inline int __access_ok (unsigned long addr,unsigned long size) +{ +unsigned long limit =TASK_SIZE ; + +return (size <= limit) && (addr <= (limit - size)); +} +#define __access_ok __access_ok/* * When a kernel-mode page fault is taken, the faulting instruction
arch/m68k/include/asm/uaccess.h +9 -6
@@ -12,14 +12,17 @@#include <asm/extable.h> /* We let the MMU do all checking */ -static inline int access_ok (const void __user *addr, +static inline int access_ok (const void __user *ptr,unsigned long size) { -/* -* XXX: for !CONFIG_CPU_HAS_ADDRESS_SPACES this really needs to check -* for TASK_SIZE! -*/ -return 1 ; +unsigned long limit =TASK_SIZE ; +unsigned long addr = (unsigned long )ptr; + +if (IS_ENABLED (CONFIG_CPU_HAS_ADDRESS_SPACES ) || + !IS_ENABLED (CONFIG_MMU )) +return 1 ; + +return (size <= limit) && (addr <= (limit - size)); }/*
arch/microblaze/include/asm/uaccess.h +4 -15
@@ -39,24 +39,13 @@# define uaccess_kernel () (get_fs().seg == KERNEL_DS.seg) -static inline int access_ok (const void __user *addr,unsigned long size) +static inline int __access_ok (unsigned long addr,unsigned long size) { -if (!size) - goto ok; +unsigned long limit =user_addr_max (); -if ((get_fs ().seg < ((unsigned long )addr)) || - (get_fs ().seg < ((unsigned long )addr + size -1 ))) { -pr_devel ("ACCESS fail at 0x%08x (size 0x%x), seg 0x%08x\n" , - (__force u32 )addr, (u32 )size, - (u32 )get_fs ().seg); -return 0 ; - } -ok: -pr_devel ("ACCESS OK at 0x%08x (size 0x%x), seg 0x%08x\n" , - (__force u32 )addr, (u32 )size, - (u32 )get_fs ().seg); -return 1 ; +return (size <= limit) && (addr <= (limit - size)); } +#define access_ok (addr, size) __access_ok((unsigned long)addr, size)# define __FIXUP_SECTION ".section .fixup,\"ax\"\n"# define __EX_TABLE_SECTION ".section __ex_table,\"a\"\n"
arch/nds32/include/asm/uaccess.h +17 -5
@@ -70,9 +70,7 @@ static inline void set_fs(mm_segment_t fs)* versions are void (ie, don't return a value as such). */ -#define get_user __get_user \ - -#define __get_user (x, ptr) \ +#define get_user (x, ptr) \ ({ \ long __gu_err = 0; \ __get_user_check((x), (ptr), __gu_err); \
@@ -85,6 +83,14 @@ static inline void set_fs(mm_segment_t fs) (void )0 ; \ }) +#define __get_user (x, ptr) \ +({ \ + long __gu_err = 0; \ + const __typeof__(*(ptr)) __user *__p = (ptr); \ + __get_user_err((x), __p, (__gu_err)); \ + __gu_err; \ +}) +#define __get_user_check (x, ptr, err) \ ({ \ const __typeof__(*(ptr)) __user *__p = (ptr); \
@@ -165,12 +171,18 @@ do { \ : "r"(addr), "i"(-EFAULT) \ : "cc") -#define put_user __put_user \ +#define put_user (x, ptr) \ +({ \ + long __pu_err = 0; \ + __put_user_check((x), (ptr), __pu_err); \ + __pu_err; \ +})#define __put_user (x, ptr) \ ({ \ long __pu_err = 0; \ - __put_user_err((x), (ptr), __pu_err); \ + __typeof__(*(ptr)) __user *__p = (ptr); \ + __put_user_err((x), __p, __pu_err); \ __pu_err; \ })
arch/x86/kernel/acpi/boot.c +24 -0
@@ -1328,6 +1328,17 @@ static int __init disable_acpi_pci(const struct dmi_system_id *d)return 0 ; } +static int __init disable_acpi_xsdt (const struct dmi_system_id *d) +{ +if (!acpi_force) { +pr_notice ("%s detected: force use of acpi=rsdt\n" , d->ident); + acpi_gbl_do_not_use_xsdt = TRUE; + }else { +pr_notice ("Warning: DMI blacklist says broken, but acpi XSDT forced\n" ); + } +return 0 ; +} +static int __init dmi_disable_acpi (const struct dmi_system_id *d) {if (!acpi_force) {
@@ -1451,6 +1462,19 @@ static const struct dmi_system_id acpi_dmi_table[] __initconst = { DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), }, }, +/* +* Boxes that need ACPI XSDT use disabled due to corrupted tables +*/ + { + .callback = disable_acpi_xsdt, + .ident = "Advantech DAC-BJ01", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), + DMI_MATCH(DMI_PRODUCT_NAME, "Bearlake CRB Board"), + DMI_MATCH(DMI_BIOS_VERSION, "V1.12"), + DMI_MATCH(DMI_BIOS_DATE, "02/01/2011"), + }, + }, {} };
drivers/acpi/battery.c +12 -0
@@ -60,6 +60,10 @@ MODULE_PARM_DESC(cache_time, "cache time in milliseconds");static const struct acpi_device_id battery_device_ids[] = { {"PNP0C0A" ,0 }, + +/* Microsoft Surface Go 3 */ + {"MSHW0146" ,0 }, + {"" ,0 }, };
@@ -1177,6 +1181,14 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = { DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad"), }, }, + { + /* Microsoft Surface Go 3 */ + .callback = battery_notification_delay_quirk, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "Surface Go 3"), + }, + }, {}, };
drivers/acpi/video_detect.c +75 -0
81 lines not on this page · raw message
drivers/bluetooth/btusb.c +4 -0
@@ -404,6 +404,8 @@ static const struct usb_device_id blacklist_table[] = { BTUSB_WIDEBAND_SPEECH },/* Realtek 8852AE Bluetooth devices */ + { USB_DEVICE(0x0bda, 0x2852), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0xc852), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0x385a), .driver_info = BTUSB_REALTEK |
@@ -481,6 +483,8 @@ static const struct usb_device_id blacklist_table[] = {/* Additional Realtek 8761BU Bluetooth devices */ { USB_DEVICE(0x0b05, 0x190e), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x2550, 0x8761), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, /* Additional Realtek 8821AE Bluetooth devices */ { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
drivers/char/tpm/tpm-dev-common.c +7 -1
@@ -69,7 +69,13 @@ static void tpm_dev_async_work(struct work_struct *work) ret =tpm_dev_transmit (priv->chip, priv->space, priv->data_buffer,sizeof (priv->data_buffer));tpm_put_ops (priv->chip); -if (ret >0 ) { + +/* +* If ret is > 0 then tpm_dev_transmit returned the size of the +* response. If ret is < 0 then tpm_dev_transmit failed and +* returned an error code. +*/ +if (ret !=0 ) { priv->response_length = ret;mod_timer (&priv->user_read_timer, jiffies + (120 *HZ )); }
drivers/char/tpm/tpm2-space.c +4 -4
@@ -58,12 +58,12 @@ int tpm2_init_space(struct tpm_space *space, unsigned int buf_size)void tpm2_del_space (struct tpm_chip *chip,struct tpm_space *space) { -mutex_lock (&chip->tpm_mutex); -if (!tpm_chip_start (chip)) { + +if (tpm_try_get_ops (chip) ==0 ) {tpm2_flush_sessions (chip, space); -tpm_chip_stop (chip); +tpm_put_ops (chip); } -mutex_unlock (&chip->tpm_mutex); +kfree (space->context_buf);kfree (space->session_buf); }
drivers/crypto/qat/qat_4xxx/adf_drv.c +7 -0
@@ -52,6 +52,13 @@ static int adf_crypto_dev_config(struct adf_accel_dev *accel_dev)if (ret) goto err; +/* Temporarily set the number of crypto instances to zero to avoid +* registering the crypto algorithms. +* This will be removed when the algorithms will support the +* CRYPTO_TFM_REQ_MAY_BACKLOG flag +*/ + instances =0 ; +for (i =0 ; i < instances; i++) { val = i; bank = i *2 ;
drivers/crypto/qat/qat_common/qat_crypto.c +7 -0
@@ -136,6 +136,13 @@ int qat_crypto_dev_config(struct adf_accel_dev *accel_dev)if (ret) goto err; +/* Temporarily set the number of crypto instances to zero to avoid +* registering the crypto algorithms. +* This will be removed when the algorithms will support the +* CRYPTO_TFM_REQ_MAY_BACKLOG flag +*/ + instances =0 ; +for (i =0 ; i < instances; i++) { val = i;snprintf (key,sizeof (key),ADF_CY "%d" ADF_RING_ASYM_BANK_NUM , i);
drivers/gpu/drm/virtio/virtgpu_gem.c +3 -0
@@ -248,6 +248,9 @@ void virtio_gpu_array_put_free(struct virtio_gpu_object_array *objs) {u32 i; +if (!objs) +return ; +for (i =0 ; i < objs->nents; i++)drm_gem_object_put (objs->objs[i]);virtio_gpu_array_free (objs);
drivers/net/ethernet/apm/xgene/xgene_enet_main.c +7 -5
@@ -696,6 +696,12 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring, buf_pool->rx_skb[skb_index] =NULL ; datalen =xgene_enet_get_data_len (le64_to_cpu (raw_desc->m1)); + +/* strip off CRC as HW isn't doing this */ + nv =GET_VAL (NV ,le64_to_cpu (raw_desc->m0)); +if (!nv) + datalen -=4 ; +skb_put (skb, datalen);prefetch (skb->data -NET_IP_ALIGN ); skb->protocol =eth_type_trans (skb, ndev);
@@ -717,12 +723,8 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring, } } - nv =GET_VAL (NV ,le64_to_cpu (raw_desc->m0)); -if (!nv) { -/* strip off CRC as HW isn't doing this */ - datalen -=4 ; +if (!nv) goto skip_jumbo; - } slots = page_pool->slots -1 ; head = page_pool->head;
drivers/net/wireless/ath/regd.c +5 -5
@@ -667,14 +667,14 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,/* * Some users have reported their EEPROM programmed with -* 0x8000 or 0x0 set, this is not a supported regulatory -* domain but since we have more than one user with it we -* need a solution for them. We default to 0x64, which is -* the default Atheros world regulatory domain. +* 0x8000 set, this is not a supported regulatory domain +* but since we have more than one user with it we need +* a solution for them. We default to 0x64, which is the +* default Atheros world regulatory domain. */ static void ath_regd_sanitize (struct ath_regulatory *reg) { -if (reg->current_rd !=COUNTRY_ERD_FLAG && reg->current_rd !=0 ) +if (reg->current_rd !=COUNTRY_ERD_FLAG )return ;printk (KERN_DEBUG "ath: EEPROM regdomain sanitized\n" ); reg->current_rd =0x64 ;
drivers/net/wireless/ath/wcn36xx/main.c +3 -0
@@ -1483,6 +1483,9 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,if (iris_node) {if (of_device_is_compatible (iris_node,"qcom,wcn3620" )) wcn->rf_id =RF_IRIS_WCN3620 ; +if (of_device_is_compatible (iris_node,"qcom,wcn3660" ) || +of_device_is_compatible (iris_node,"qcom,wcn3660b" )) + wcn->rf_id =RF_IRIS_WCN3660 ;if (of_device_is_compatible (iris_node,"qcom,wcn3680" )) wcn->rf_id =RF_IRIS_WCN3680 ;of_node_put (iris_node);
drivers/net/wireless/ath/wcn36xx/wcn36xx.h +1 -0
@@ -97,6 +97,7 @@ enum wcn36xx_ampdu_state {#define RF_UNKNOWN 0x0000#define RF_IRIS_WCN3620 0x3620 +#define RF_IRIS_WCN3660 0x3660#define RF_IRIS_WCN3680 0x3680static inline void buff_to_be (u32 *buf,size_t len)
drivers/nfc/st21nfca/se.c +10 -0
@@ -316,6 +316,11 @@ int st21nfca_connectivity_event_received(struct nfc_hci_dev *hdev, u8 host,return -ENOMEM ; transaction->aid_len = skb->data[1 ]; + +/* Checking if the length of the AID is valid */ +if (transaction->aid_len >sizeof (transaction->aid)) +return -EINVAL ; +memcpy (transaction->aid, &skb->data[2 ], transaction->aid_len);
@@ -325,6 +330,11 @@ int st21nfca_connectivity_event_received(struct nfc_hci_dev *hdev, u8 host,return -EPROTO ; transaction->params_len = skb->data[transaction->aid_len +3 ]; + +/* Total size is allocated (skb->len - 2) minus fixed array members */ +if (transaction->params_len > ((skb->len -2 ) -sizeof (struct nfc_evt_transaction ))) +return -EINVAL ; +memcpy (transaction->params, skb->data + transaction->aid_len +4 , transaction->params_len);
include/sound/pcm.h +1 -0
@@ -398,6 +398,7 @@ struct snd_pcm_runtime {wait_queue_head_t tsleep;/* transfer sleep */ struct fasync_struct *fasync;bool stop_operating;/* sync_stop will be called */ +struct mutex buffer_mutex;/* protect for buffer changes */ /* -- private section -- */ void *private_data;
kernel/rcu/tree_plugin.h +4 -4
@@ -554,16 +554,16 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags)raw_spin_unlock_irqrestore_rcu_node (rnp, flags); } -/* Unboost if we were boosted. */ -if (IS_ENABLED (CONFIG_RCU_BOOST ) && drop_boost_mutex) -rt_mutex_futex_unlock (&rnp->boost_mtx.rtmutex); -/* * If this was the last task on the expedited lists, * then we need to report up the rcu_node hierarchy. */ if (!empty_exp && empty_exp_now)rcu_report_exp_rnp (rnp, true); + +/* Unboost if we were boosted. */ +if (IS_ENABLED (CONFIG_RCU_BOOST ) && drop_boost_mutex) +rt_mutex_futex_unlock (&rnp->boost_mtx.rtmutex); }else {local_irq_restore (flags); }
net/ipv6/ip6_output.c +2 -2
@@ -1476,8 +1476,8 @@ static int __ip6_append_data(struct sock *sk, sizeof(struct frag_hdr) : 0) + rt->rt6i_nfheader_len; -if (mtu < fragheaderlen || - ((mtu - fragheaderlen) & ~7 ) + fragheaderlen <sizeof (struct frag_hdr )) +if (mtu <= fragheaderlen || + ((mtu - fragheaderlen) & ~7 ) + fragheaderlen <=sizeof (struct frag_hdr )) goto emsgsize; maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen -
net/llc/af_llc.c +32 -16
107 lines not on this page · raw message
net/mac80211/cfg.c +0 -3
@@ -2148,14 +2148,12 @@ static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh, const struct mesh_setup *setup) {u8 *new_ie; -const u8 *old_ie;struct ieee80211_sub_if_data *sdata =container_of (ifmsh, struct ieee80211_sub_if_data, u.mesh);int i;/* allocate information elements */ new_ie =NULL ; - old_ie = ifmsh->ie;if (setup->ie_len) { new_ie = kmemdup(setup->ie, setup->ie_len,
@@ -2165,7 +2163,6 @@ static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh, } ifmsh->ie_len = setup->ie_len; ifmsh->ie = new_ie; -kfree (old_ie);/* now copy the rest of the setup parameters */ ifmsh->mesh_id_len = setup->mesh_id_len;
net/netfilter/nf_tables_api.c +17 -5
@@ -9208,17 +9208,23 @@ int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest) }EXPORT_SYMBOL_GPL (nft_parse_u32_check); -static unsigned int nft_parse_register (const struct nlattr *attr) +static unsigned int nft_parse_register (const struct nlattr *attr,u32 *preg) {unsigned int reg; reg =ntohl (nla_get_be32 (attr));switch (reg) { case NFT_REG_VERDICT...NFT_REG_4: -return reg *NFT_REG_SIZE /NFT_REG32_SIZE ; + *preg = reg *NFT_REG_SIZE /NFT_REG32_SIZE ; +break ; + case NFT_REG32_00...NFT_REG32_15: + *preg = reg +NFT_REG_SIZE /NFT_REG32_SIZE -NFT_REG32_00 ; +break ;default : -return reg +NFT_REG_SIZE /NFT_REG32_SIZE -NFT_REG32_00 ; +return -ERANGE ; } + +return 0 ; }/**
@@ -9260,7 +9266,10 @@ int nft_parse_register_load(const struct nlattr *attr, u8 *sreg, u32 len)u32 reg;int err; - reg =nft_parse_register (attr); + err =nft_parse_register (attr, ®); +if (err <0 ) +return err; + err =nft_validate_register_load (reg, len);if (err <0 )return err;
@@ -9315,7 +9324,10 @@ int nft_parse_register_store(const struct nft_ctx *ctx,int err;u32 reg; - reg =nft_parse_register (attr); + err =nft_parse_register (attr, ®); +if (err <0 ) +return err; + err =nft_validate_register_store (ctx, reg, data, type, len);if (err <0 )return err;
net/netfilter/nf_tables_core.c +1 -1
@@ -162,7 +162,7 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)struct nft_rule *const *rules;const struct nft_rule *rule;const struct nft_expr *expr, *last; -struct nft_regs regs; +struct nft_regs regs = {};unsigned int stackptr =0 ;struct nft_jumpstack jumpstack[NFT_JUMP_STACK_SIZE ];bool genbit =READ_ONCE (net->nft.gencursor);
sound/core/oss/pcm_oss.c +8 -4
@@ -774,6 +774,11 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream,if (oss_period_size <16 )return -EINVAL ; + +/* don't allocate too large period; 1MB period must be enough */ +if (oss_period_size >1024 *1024 ) +return -ENOMEM ; + runtime->oss.period_bytes = oss_period_size; runtime->oss.period_frames =1 ; runtime->oss.periods = oss_periods;
@@ -1043,10 +1048,9 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) goto failure; }#endif - oss_period_size *= oss_frame_size; - - oss_buffer_size = oss_period_size * runtime->oss.periods; -if (oss_buffer_size <0 ) { + oss_period_size =array_size (oss_period_size, oss_frame_size); + oss_buffer_size =array_size (oss_period_size, runtime->oss.periods); +if (oss_buffer_size <=0 ) { err = -EINVAL ; goto failure; }
sound/core/oss/pcm_plugin.c +4 -1
@@ -62,7 +62,10 @@ static int snd_pcm_plugin_alloc(struct snd_pcm_plugin *plugin, snd_pcm_uframes_t width =snd_pcm_format_physical_width (format->format);if (width <0 )return width; - size = frames * format->channels * width; + size =array3_size (frames, format->channels, width); +/* check for too large period size once again */ +if (size >1024 *1024 ) +return -ENOMEM ;if (snd_BUG_ON (size %8 ))return -ENXIO ; size /=8 ;
sound/core/pcm.c +2 -0
@@ -969,6 +969,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,init_waitqueue_head (&runtime->tsleep); runtime->status->state =SNDRV_PCM_STATE_OPEN ; +mutex_init (&runtime->buffer_mutex); substream->runtime = runtime; substream->private_data = pcm->private_data;
@@ -1002,6 +1003,7 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream) }else { substream->runtime =NULL ; } +mutex_destroy (&runtime->buffer_mutex);kfree (runtime);put_pid (substream->pid); substream->pid =NULL ;
sound/core/pcm_lib.c +4 -0
@@ -1906,9 +1906,11 @@ static int wait_for_avail(struct snd_pcm_substream *substream,if (avail >= runtime->twake)break ;snd_pcm_stream_unlock_irq (substream); +mutex_unlock (&runtime->buffer_mutex); tout =schedule_timeout (wait_time); +mutex_lock (&runtime->buffer_mutex);snd_pcm_stream_lock_irq (substream);set_current_state (TASK_INTERRUPTIBLE );switch (runtime->status->state) {
@@ -2202,6 +2204,7 @@ snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream, nonblock = !!(substream->f_flags &O_NONBLOCK ); +mutex_lock (&runtime->buffer_mutex);snd_pcm_stream_lock_irq (substream); err =pcm_accessible_state (runtime);if (err <0 )
@@ -2293,6 +2296,7 @@ snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,if (xfer >0 && err >=0 )snd_pcm_update_state (substream, runtime);snd_pcm_stream_unlock_irq (substream); +mutex_unlock (&runtime->buffer_mutex);return xfer >0 ? (snd_pcm_sframes_t )xfer : err; }EXPORT_SYMBOL (__snd_pcm_lib_xfer);
sound/core/pcm_memory.c +7 -4
@@ -163,19 +163,20 @@ static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry,size_t size;struct snd_dma_buffer new_dmab; +mutex_lock (&substream->pcm->open_mutex);if (substream->runtime) { buffer->error = -EBUSY ; -return ; + goto unlock; }if (!snd_info_get_line (buffer, line,sizeof (line))) {snd_info_get_str (str, line,sizeof (str)); size =simple_strtoul (str,NULL ,10 ) *1024 ;if ((size !=0 && size <8192 ) || size > substream->dma_max) { buffer->error = -EINVAL ; -return ; + goto unlock; }if (substream->dma_buffer.bytes == size) -return ; + goto unlock;memset (&new_dmab,0 ,sizeof (new_dmab)); new_dmab.dev = substream->dma_buffer.dev;if (size >0 ) {
@@ -189,7 +190,7 @@ static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry, substream->pcm->card->number, substream->pcm->device, substream->stream ?'c' :'p' , substream->number, substream->pcm->name, size); -return ; + goto unlock; } substream->buffer_bytes_max = size; }else {
@@ -201,6 +202,8 @@ static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry, }else { buffer->error = -EINVAL ; } + unlock: +mutex_unlock (&substream->pcm->open_mutex); }static inline void preallocate_info_init (struct snd_pcm_substream *substream)
sound/core/pcm_native.c +61 -36
200 lines not on this page · raw message
sound/pci/ac97/ac97_codec.c +2 -2
@@ -938,8 +938,8 @@ static int snd_ac97_ad18xx_pcm_get_volume(struct snd_kcontrol *kcontrol, structint codec = kcontrol->private_value &3 ;mutex_lock (&ac97->page_mutex); - ucontrol->value.integer.value[0 ] =31 - ((ac97->spec.ad18xx.pcmreg[codec] >>0 ) &31 ); - ucontrol->value.integer.value[1 ] =31 - ((ac97->spec.ad18xx.pcmreg[codec] >>8 ) &31 ); + ucontrol->value.integer.value[0 ] =31 - ((ac97->spec.ad18xx.pcmreg[codec] >>8 ) &31 ); + ucontrol->value.integer.value[1 ] =31 - ((ac97->spec.ad18xx.pcmreg[codec] >>0 ) &31 );mutex_unlock (&ac97->page_mutex);return 0 ; }
sound/pci/cmipci.c +1 -2
@@ -298,7 +298,6 @@ MODULE_PARM_DESC(joystick_port, "Joystick port address.");#define CM_MICGAINZ 0x01/* mic boost */ #define CM_MICGAINZ_SHIFT 0 -#define CM_REG_MIXER3 0x24#define CM_REG_AUX_VOL 0x26#define CM_VAUXL_MASK 0xf0#define CM_VAUXR_MASK 0x0f
@@ -3265,7 +3264,7 @@ static int snd_cmipci_probe(struct pci_dev *pci,*/ static const unsigned char saved_regs[] = {CM_REG_FUNCTRL1 ,CM_REG_CHFORMAT ,CM_REG_LEGACY_CTRL ,CM_REG_MISC_CTRL , -CM_REG_MIXER0 ,CM_REG_MIXER1 ,CM_REG_MIXER2 ,CM_REG_MIXER3 ,CM_REG_PLL , +CM_REG_MIXER0 ,CM_REG_MIXER1 ,CM_REG_MIXER2 ,CM_REG_AUX_VOL ,CM_REG_PLL ,CM_REG_CH0_FRAME1 ,CM_REG_CH0_FRAME2 ,CM_REG_CH1_FRAME1 ,CM_REG_CH1_FRAME2 ,CM_REG_EXT_MISC ,CM_REG_INT_STATUS ,CM_REG_INT_HLDCLR ,CM_REG_FUNCTRL0 ,
sound/pci/hda/patch_realtek.c +4 -0
@@ -8866,6 +8866,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x1e51 ,"ASUS Zephyrus M15" ,ALC294_FIXUP_ASUS_GU502_PINS ),SND_PCI_QUIRK (0x1043 ,0x1e8e ,"ASUS Zephyrus G15" ,ALC289_FIXUP_ASUS_GA401 ),SND_PCI_QUIRK (0x1043 ,0x1f11 ,"ASUS Zephyrus G14" ,ALC289_FIXUP_ASUS_GA401 ), +SND_PCI_QUIRK (0x1043 ,0x1d42 ,"ASUS Zephyrus G14 2022" ,ALC289_FIXUP_ASUS_GA401 ),SND_PCI_QUIRK (0x1043 ,0x16b2 ,"ASUS GU603" ,ALC289_FIXUP_ASUS_GA401 ),SND_PCI_QUIRK (0x1043 ,0x3030 ,"ASUS ZN270IE" ,ALC256_FIXUP_ASUS_AIO_GPIO2 ), SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
@@ -8949,6 +8950,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1558 ,0x8561 ,"Clevo NH[57][0-9][ER][ACDH]Q" ,ALC269_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x1558 ,0x8562 ,"Clevo NH[57][0-9]RZ[Q]" ,ALC269_FIXUP_DMIC ),SND_PCI_QUIRK (0x1558 ,0x8668 ,"Clevo NP50B[BE]" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x1558 ,0x866d ,"Clevo NP5[05]PN[HJK]" ,ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x1558 ,0x867d ,"Clevo NP7[01]PN[HJK]" ,ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x8680 ,"Clevo NJ50LU" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x8686 ,"Clevo NH50[CZ]U" ,ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME ), SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
@@ -10909,6 +10912,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {SND_PCI_QUIRK (0x1028 ,0x069f ,"Dell" ,ALC668_FIXUP_DELL_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x103c ,0x1632 ,"HP RP5800" ,ALC662_FIXUP_HP_RP5800 ),SND_PCI_QUIRK (0x103c ,0x873e ,"HP" ,ALC671_FIXUP_HP_HEADSET_MIC2 ), +SND_PCI_QUIRK (0x103c ,0x885f ,"HP 288 Pro G8" ,ALC671_FIXUP_HP_HEADSET_MIC2 ),SND_PCI_QUIRK (0x1043 ,0x1080 ,"Asus UX501VW" ,ALC668_FIXUP_HEADSET_MODE ),SND_PCI_QUIRK (0x1043 ,0x11cd ,"Asus N550" , ALC662_FIXUP_ASUS_Nx50), SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
sound/soc/sti/uniperif_player.c +3 -3
@@ -91,7 +91,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)SET_UNIPERIF_ITM_BCLR_FIFO_ERROR (player);/* Stop the player */ -snd_pcm_stop_xrun (player->substream); +snd_pcm_stop (player->substream,SNDRV_PCM_STATE_XRUN ); } ret =IRQ_HANDLED ;
@@ -105,7 +105,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)SET_UNIPERIF_ITM_BCLR_DMA_ERROR (player);/* Stop the player */ -snd_pcm_stop_xrun (player->substream); +snd_pcm_stop (player->substream,SNDRV_PCM_STATE_XRUN ); ret =IRQ_HANDLED ; }
@@ -138,7 +138,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)dev_err (player->dev,"Underflow recovery failed\n" );/* Stop the player */ -snd_pcm_stop_xrun (player->substream); +snd_pcm_stop (player->substream,SNDRV_PCM_STATE_XRUN ); ret =IRQ_HANDLED ; }
sound/soc/sti/uniperif_reader.c +1 -1
@@ -65,7 +65,7 @@ static irqreturn_t uni_reader_irq_handler(int irq, void *dev_id)if (unlikely (status &UNIPERIF_ITS_FIFO_ERROR_MASK (reader))) {dev_err (reader->dev,"FIFO error detected\n" ); -snd_pcm_stop_xrun (reader->substream); +snd_pcm_stop (reader->substream,SNDRV_PCM_STATE_XRUN ); ret =IRQ_HANDLED ; }
sound/usb/mixer_maps.c +10 -0
@@ -536,6 +536,16 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { .id = USB_ID(0x1b1c, 0x0a41), .map = corsair_virtuoso_map, }, + { + /* Corsair Virtuoso SE Latest (wired mode) */ + .id = USB_ID(0x1b1c, 0x0a3f), + .map = corsair_virtuoso_map, + }, + { + /* Corsair Virtuoso SE Latest (wireless mode) */ + .id = USB_ID(0x1b1c, 0x0a40), + .map = corsair_virtuoso_map, + }, { /* Corsair Virtuoso (wireless mode) */ .id = USB_ID(0x1b1c, 0x0a42),
sound/usb/mixer_quirks.c +4 -3
@@ -3362,9 +3362,10 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,if (unitid ==7 && cval->control ==UAC_FU_VOLUME )snd_dragonfly_quirk_db_scale (mixer, cval, kctl);break ; -/* lowest playback value is muted on C-Media devices */ -case USB_ID (0x0d8c ,0x000c ): -case USB_ID (0x0d8c ,0x0014 ): +/* lowest playback value is muted on some devices */ +case USB_ID (0x0d8c ,0x000c ):/* C-Media */ +case USB_ID (0x0d8c ,0x0014 ):/* C-Media */ +case USB_ID (0x19f7 ,0x0003 ):/* RODE NT-USB */ if (strstr (kctl->id.name,"Playback" )) cval->min_mute =1 ;break ;