Linux 5.4.72
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.72 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.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/arm/boot/compressed/Makefile | 4 +- drivers/acpi/Makefile | 2 - drivers/crypto/bcm/cipher.c | 15 ++++++++- drivers/crypto/qat/qat_common/qat_algs.c | 10 +++++- drivers/media/usb/usbtv/usbtv-core.c | 3 + drivers/staging/comedi/drivers/vmk80xx.c | 3 + drivers/usb/serial/ftdi_sio.c | 5 +++ drivers/usb/serial/ftdi_sio_ids.h | 7 ++++ drivers/usb/serial/option.c | 5 +++ drivers/usb/serial/pl2303.c | 1 drivers/usb/serial/pl2303.h | 1 drivers/xen/events/events_base.c | 29 +++++++++++++---- fs/btrfs/block-group.c | 38 ++++++++++++++++------- fs/btrfs/space-info.c | 50 ++++++++++++------------------- fs/btrfs/space-info.h | 3 + fs/reiserfs/inode.c | 6 --- fs/reiserfs/xattr.c | 7 ++++ include/net/bluetooth/hci_core.h | 30 ++++++++++++++---- include/net/bluetooth/l2cap.h | 2 + net/bluetooth/a2mp.c | 22 +++++++++++++ net/bluetooth/hci_conn.c | 17 ++++++++++ net/bluetooth/hci_event.c | 48 ++++++----------------------- net/bluetooth/l2cap_core.c | 7 ++-- net/bluetooth/l2cap_sock.c | 14 ++++++++ net/bluetooth/mgmt.c | 7 +++- tools/perf/util/cs-etm.c | 3 + tools/perf/util/cs-etm.h | 3 - 28 files changed, 231 insertions(+), 113 deletions(-)
Anant Thazhemadam (1):
staging: comedi: check validity of wMaxPacketSize of usb endpoints found
Arjan van de Ven (1):
ACPI: Always build evged in
Dmitry Golovin (1):
ARM: 8939/1: kbuild: use correct nm executable
Dominik Przychodni (1):
crypto: qat - check cipher length for aead AES-CBC-HMAC-SHA
Greg Kroah-Hartman (1):
Linux 5.4.72
Herbert Xu (1):
crypto: bcm - Verify GCM/CCM key length in setkey
Jan Kara (2):
reiserfs: Initialize inode keys properly
reiserfs: Fix oops during mount
Josef Bacik (2):
btrfs: don't pass system_chunk into can_overcommit
btrfs: take overcommit into account in inc_block_group_ro
Juergen Gross (1):
xen/events: don't use chip_data for legacy IRQs
Leo Yan (1):
perf cs-etm: Move definition of 'traceid_list' global variable from header file
Leonid Bloch (1):
USB: serial: option: Add Telit FT980-KS composition
Luiz Augusto von Dentz (5):
Bluetooth: A2MP: Fix not initializing all members
Bluetooth: L2CAP: Fix calling sk_filter on non-socket based channel
Bluetooth: MGMT: Fix not checking if BT_HS is enabled
Bluetooth: Consolidate encryption handling in hci_encrypt_cfm
Bluetooth: Disconnect if E0 is used for Level 4
Mychaela N. Falconia (1):
USB: serial: ftdi_sio: add support for FreeCalypso JTAG+UART adapters
Oliver Neukum (1):
media: usbtv: Fix refcounting mixup
Patrick Steinhardt (1):
Bluetooth: Fix update of connection state in hci_encrypt_cfm
Scott Chen (1):
USB: serial: pl2303: add device-id for HP GC device
Wilken Gottwalt (1):
USB: serial: option: add Cellient MPL200 card
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 71 +SUBLEVEL = 72 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arm/boot/compressed/Makefile +2 -2
@@ -121,7 +121,7 @@ ccflags-y := -fpic $(call cc-option,-mno-single-pic-base,) -fno-builtin \ asflags-y := -DZIMAGE # Supply kernel BSS size to the decompressor via a linker symbol. -KBSS_SZ = $(shell echo $$(($$($(CROSS_COMPILE)nm $(obj)/../../../../vmlinux | \ +KBSS_SZ = $(shell echo $$(($$($(NM) $(obj)/../../../../vmlinux | \ sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \ -e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) ) LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
@@ -165,7 +165,7 @@ $(obj)/bswapsdi2.S: $(srctree)/arch/$(SRCARCH)/lib/bswapsdi2.S # The .data section is already discarded by the linker script so no need # to bother about it here. check_for_bad_syms = \ -bad_syms=$$($(CROSS_COMPILE)nm $@ | sed -n 's/^.\{8\} [bc] \(.*\)/\1/p') && \ +bad_syms=$$($(NM) $@ | sed -n 's/^.\{8\} [bc] \(.*\)/\1/p') && \ [ -z "$$bad_syms" ] || \ ( echo "following symbols must have non local/private scope:" >&2; \ echo "$$bad_syms" >&2; false )
drivers/acpi/Makefile +1 -1
@@ -48,7 +48,7 @@ acpi-y += acpi_pnp.o acpi-$(CONFIG_ARM_AMBA) += acpi_amba.o acpi-y += power.o acpi-y += event.o -acpi-$(CONFIG_ACPI_REDUCED_HARDWARE_ONLY) += evged.o +acpi-y += evged.o acpi-y += sysfs.o acpi-y += property.o acpi-$(CONFIG_X86) += acpi_cmos_rtc.o
drivers/crypto/bcm/cipher.c +14 -1
@@ -2937,7 +2937,6 @@ static int aead_gcm_ccm_setkey(struct crypto_aead *cipher, ctx->enckeylen = keylen; ctx->authkeylen =0 ; -memcpy (ctx->enckey, key, ctx->enckeylen);switch (ctx->enckeylen) {case AES_KEYSIZE_128 :
@@ -2953,6 +2952,8 @@ static int aead_gcm_ccm_setkey(struct crypto_aead *cipher, goto badkey; } +memcpy (ctx->enckey, key, ctx->enckeylen); +flow_log (" enckeylen:%u authkeylen:%u\n" , ctx->enckeylen, ctx->authkeylen);flow_dump (" enc: " , ctx->enckey, ctx->enckeylen);
@@ -3013,6 +3014,10 @@ static int aead_gcm_esp_setkey(struct crypto_aead *cipher,struct iproc_ctx_s *ctx =crypto_aead_ctx (cipher);flow_log ("%s\n" , __func__); + +if (keylen <GCM_ESP_SALT_SIZE ) +return -EINVAL ; + ctx->salt_len =GCM_ESP_SALT_SIZE ; ctx->salt_offset =GCM_ESP_SALT_OFFSET ;memcpy (ctx->salt, key + keylen -GCM_ESP_SALT_SIZE ,GCM_ESP_SALT_SIZE );
@@ -3041,6 +3046,10 @@ static int rfc4543_gcm_esp_setkey(struct crypto_aead *cipher,struct iproc_ctx_s *ctx =crypto_aead_ctx (cipher);flow_log ("%s\n" , __func__); + +if (keylen <GCM_ESP_SALT_SIZE ) +return -EINVAL ; + ctx->salt_len =GCM_ESP_SALT_SIZE ; ctx->salt_offset =GCM_ESP_SALT_OFFSET ;memcpy (ctx->salt, key + keylen -GCM_ESP_SALT_SIZE ,GCM_ESP_SALT_SIZE );
@@ -3070,6 +3079,10 @@ static int aead_ccm_esp_setkey(struct crypto_aead *cipher,struct iproc_ctx_s *ctx =crypto_aead_ctx (cipher);flow_log ("%s\n" , __func__); + +if (keylen <CCM_ESP_SALT_SIZE ) +return -EINVAL ; + ctx->salt_len =CCM_ESP_SALT_SIZE ; ctx->salt_offset =CCM_ESP_SALT_OFFSET ;memcpy (ctx->salt, key + keylen -CCM_ESP_SALT_SIZE ,CCM_ESP_SALT_SIZE );
drivers/crypto/qat/qat_common/qat_algs.c +9 -1
@@ -873,6 +873,11 @@ static int qat_alg_aead_dec(struct aead_request *areq)struct icp_qat_fw_la_bulk_req *msg;int digst_size =crypto_aead_authsize (aead_tfm);int ret, ctr =0 ; +u32 cipher_len; + + cipher_len = areq->cryptlen - digst_size; +if (cipher_len %AES_BLOCK_SIZE !=0 ) +return -EINVAL ; ret =qat_alg_sgl_to_bufl (ctx->inst, areq->src, areq->dst, qat_req);if (unlikely (ret))
@@ -887,7 +892,7 @@ static int qat_alg_aead_dec(struct aead_request *areq) qat_req->req.comn_mid.src_data_addr = qat_req->buf.blp; qat_req->req.comn_mid.dest_data_addr = qat_req->buf.bloutp; cipher_param = (void *)&qat_req->req.serv_specif_rqpars; - cipher_param->cipher_length = areq->cryptlen - digst_size; + cipher_param->cipher_length = cipher_len; cipher_param->cipher_offset = areq->assoclen;memcpy (cipher_param->u.cipher_IV_array, areq->iv,AES_BLOCK_SIZE ); auth_param = (void *)((uint8_t *)cipher_param +sizeof (*cipher_param));
@@ -916,6 +921,9 @@ static int qat_alg_aead_enc(struct aead_request *areq)uint8_t *iv = areq->iv;int ret, ctr =0 ; +if (areq->cryptlen %AES_BLOCK_SIZE !=0 ) +return -EINVAL ; + ret =qat_alg_sgl_to_bufl (ctx->inst, areq->src, areq->dst, qat_req);if (unlikely (ret))return ret;
drivers/media/usb/usbtv/usbtv-core.c +2 -1
@@ -113,7 +113,8 @@ static int usbtv_probe(struct usb_interface *intf, usbtv_audio_fail:/* we must not free at this point */ -usb_get_dev (usbtv->udev); +v4l2_device_get (&usbtv->v4l2_dev); +/* this will undo the v4l2_device_get() */ usbtv_video_free (usbtv); usbtv_video_fail:
drivers/staging/comedi/drivers/vmk80xx.c +3 -0
@@ -667,6 +667,9 @@ static int vmk80xx_find_usb_endpoints(struct comedi_device *dev)if (!devpriv->ep_rx || !devpriv->ep_tx)return -ENODEV ; +if (!usb_endpoint_maxp (devpriv->ep_rx) || !usb_endpoint_maxp (devpriv->ep_tx)) +return -EINVAL ; +return 0 ; }
drivers/usb/serial/ftdi_sio.c +5 -0
@@ -1037,6 +1037,11 @@ static const struct usb_device_id id_table_combined[] = {/* U-Blox devices */ { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) }, { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) }, +/* FreeCalypso USB adapters */ + { USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_BUF_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_UNBUF_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { } /* Terminating entry */ };
drivers/usb/serial/ftdi_sio_ids.h +7 -0
@@ -39,6 +39,13 @@#define FTDI_LUMEL_PD12_PID 0x6002 +/* +* Custom USB adapters made by Falconia Partners LLC +* for FreeCalypso project, ID codes allocated to Falconia by FTDI. +*/ +#define FTDI_FALCONIA_JTAG_BUF_PID 0x7150 +#define FTDI_FALCONIA_JTAG_UNBUF_PID 0x7151 +/* Sienna Serial Interface by Secyourit GmbH */ #define FTDI_SIENNA_PID 0x8348
drivers/usb/serial/option.c +5 -0
@@ -528,6 +528,7 @@ static void option_instat_callback(struct urb *urb);/* Cellient products */ #define CELLIENT_VENDOR_ID 0x2692#define CELLIENT_PRODUCT_MEN200 0x9005 +#define CELLIENT_PRODUCT_MPL200 0x9025/* Hyundai Petatel Inc. products */ #define PETATEL_VENDOR_ID 0x1ff4
@@ -1186,6 +1187,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1053, 0xff), /* Telit FN980 (ECM) */ .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1054, 0xff), /* Telit FT980-KS */ + .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
@@ -1982,6 +1985,8 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) }, { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) }, { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, + { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MPL200), + .driver_info = RSVD(1) | RSVD(4) }, { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600A) }, { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600E) }, { USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, TPLINK_PRODUCT_LTE, 0xff, 0x00, 0x00) }, /* TP-Link LTE Module */
drivers/usb/serial/pl2303.c +1 -0
@@ -94,6 +94,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) }, + { USB_DEVICE(HP_VENDOR_ID, HP_LD381GC_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
drivers/usb/serial/pl2303.h +1 -0
@@ -121,6 +121,7 @@/* Hewlett-Packard POS Pole Displays */ #define HP_VENDOR_ID 0x03f0 +#define HP_LD381GC_PRODUCT_ID 0x0183#define HP_LM920_PRODUCT_ID 0x026b#define HP_TD620_PRODUCT_ID 0x0956#define HP_LD960_PRODUCT_ID 0x0b39
drivers/xen/events/events_base.c +21 -8
@@ -91,6 +91,8 @@ static bool (*pirq_needs_eoi)(unsigned irq);/* Xen will never allocate port zero for any purpose. */ #define VALID_EVTCHN (chn) ((chn) != 0) +static struct irq_info *legacy_info_ptrs[NR_IRQS_LEGACY ]; +static struct irq_chip xen_dynamic_chip;static struct irq_chip xen_percpu_chip;static struct irq_chip xen_pirq_chip;
@@ -155,7 +157,18 @@ int get_evtchn_to_irq(unsigned evtchn)/* Get info for IRQ */ struct irq_info *info_for_irq (unsigned irq) { -return irq_get_chip_data (irq); +if (irq <nr_legacy_irqs ()) +return legacy_info_ptrs[irq]; +else +return irq_get_chip_data (irq); +} + +static void set_info_for_irq (unsigned int irq,struct irq_info *info) +{ +if (irq <nr_legacy_irqs ()) + legacy_info_ptrs[irq] = info; +else +irq_set_chip_data (irq, info); }/* Constructors for packed IRQ information. */
@@ -376,7 +389,7 @@ static void xen_irq_init(unsigned irq) info->type =IRQT_UNBOUND ; info->refcnt =-1 ; -irq_set_chip_data (irq, info); +set_info_for_irq (irq, info);list_add_tail (&info->list, &xen_irq_list_head); }
@@ -425,14 +438,14 @@ static int __must_check xen_allocate_irq_gsi(unsigned gsi)static void xen_free_irq (unsigned irq) { -struct irq_info *info =irq_get_chip_data (irq); +struct irq_info *info =info_for_irq (irq);if (WARN_ON (!info))return ;list_del (&info->list); -irq_set_chip_data (irq,NULL ); +set_info_for_irq (irq,NULL );WARN_ON (info->refcnt >0 );
@@ -602,7 +615,7 @@ EXPORT_SYMBOL_GPL(xen_irq_from_gsi);static void __unbind_from_irq (unsigned int irq) {int evtchn =evtchn_from_irq (irq); -struct irq_info *info =irq_get_chip_data (irq); +struct irq_info *info =info_for_irq (irq);if (info->refcnt >0 ) { info->refcnt--;
@@ -1106,7 +1119,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,void unbind_from_irqhandler (unsigned int irq,void *dev_id) { -struct irq_info *info =irq_get_chip_data (irq); +struct irq_info *info =info_for_irq (irq);if (WARN_ON (!info))return ;
@@ -1140,7 +1153,7 @@ int evtchn_make_refcounted(unsigned int evtchn)if (irq ==-1 )return -ENOENT ; - info =irq_get_chip_data (irq); + info =info_for_irq (irq);if (!info)return -ENOENT ;
@@ -1168,7 +1181,7 @@ int evtchn_get(unsigned int evtchn)if (irq ==-1 ) goto done; - info =irq_get_chip_data (irq); + info =info_for_irq (irq);if (!info) goto done;
fs/btrfs/block-group.c +26 -12
@@ -1186,7 +1186,6 @@ static int inc_block_group_ro(struct btrfs_block_group_cache *cache, int force) {struct btrfs_space_info *sinfo = cache->space_info;u64 num_bytes; -u64 sinfo_used;u64 min_allocable_bytes;int ret = -ENOSPC ;
@@ -1213,20 +1212,38 @@ static int inc_block_group_ro(struct btrfs_block_group_cache *cache, int force) num_bytes = cache->key.offset - cache->reserved - cache->pinned - cache->bytes_super -btrfs_block_group_used (&cache->item); - sinfo_used =btrfs_space_info_used (sinfo, true);/* -* sinfo_used + num_bytes should always <= sinfo->total_bytes. -* -* Here we make sure if we mark this bg RO, we still have enough -* free space as buffer (if min_allocable_bytes is not 0). +* Data never overcommits, even in mixed mode, so do just the straight +* check of left over space in how much we have allocated. */ -if (sinfo_used + num_bytes + min_allocable_bytes <= - sinfo->total_bytes) { +if (force) { + ret =0 ; + }else if (sinfo->flags &BTRFS_BLOCK_GROUP_DATA ) { +u64 sinfo_used =btrfs_space_info_used (sinfo, true); + +/* +* Here we make sure if we mark this bg RO, we still have enough +* free space as buffer. +*/ +if (sinfo_used + num_bytes <= sinfo->total_bytes) + ret =0 ; + }else { +/* +* We overcommit metadata, so we need to do the +* btrfs_can_overcommit check here, and we need to pass in +* BTRFS_RESERVE_NO_FLUSH to give ourselves the most amount of +* leeway to allow us to mark this block group as read only. +*/ +if (btrfs_can_overcommit (cache->fs_info, sinfo, num_bytes, +BTRFS_RESERVE_NO_FLUSH )) + ret =0 ; + } + +if (!ret) { sinfo->bytes_readonly += num_bytes; cache->ro++;list_add_tail (&cache->ro_list, &sinfo->ro_bgs); - ret =0 ; } out:spin_unlock (&cache->lock);
@@ -1235,9 +1252,6 @@ static int inc_block_group_ro(struct btrfs_block_group_cache *cache, int force)btrfs_info (cache->fs_info,"unable to make block group %llu ro" , cache->key.objectid); -btrfs_info (cache->fs_info, -"sinfo_used=%llu bg_num_bytes=%llu min_allocable=%llu" , - sinfo_used, num_bytes, min_allocable_bytes);btrfs_dump_space_info (cache->fs_info, cache->space_info,0 ,0 ); }return ret;
fs/btrfs/space-info.c +20 -30
140 lines not on this page · raw message
fs/btrfs/space-info.h +3 -0
@@ -129,6 +129,9 @@ int btrfs_reserve_metadata_bytes(struct btrfs_root *root, enum btrfs_reserve_flush_enum flush);void btrfs_try_granting_tickets (struct btrfs_fs_info *fs_info,struct btrfs_space_info *space_info); +int btrfs_can_overcommit (struct btrfs_fs_info *fs_info, +struct btrfs_space_info *space_info,u64 bytes, +enum btrfs_reserve_flush_enum flush); static inline void btrfs_space_info_free_bytes_may_use( struct btrfs_fs_info *fs_info,
fs/reiserfs/inode.c +1 -5
@@ -1553,11 +1553,7 @@ void reiserfs_read_locked_inode(struct inode *inode,* set version 1, version 2 could be used too, because stat data * key is the same in both versions */ - key.version =KEY_FORMAT_3_5 ; - key.on_disk_key.k_dir_id = dirino; - key.on_disk_key.k_objectid = inode->i_ino; - key.on_disk_key.k_offset =0 ; - key.on_disk_key.k_type =0 ; +_make_cpu_key (&key,KEY_FORMAT_3_5 , dirino, inode->i_ino,0 ,0 ,3 );/* look for the object's stat data */ retval =search_item (inode->i_sb, &key, &path_to_sd);
fs/reiserfs/xattr.c +7 -0
@@ -674,6 +674,13 @@ reiserfs_xattr_get(struct inode *inode, const char *name, void *buffer,if (get_inode_sd_version (inode) ==STAT_DATA_V1 )return -EOPNOTSUPP ; +/* +* priv_root needn't be initialized during mount so allow initial +* lookups to succeed. +*/ +if (!REISERFS_SB (inode->i_sb)->priv_root) +return 0 ; + dentry =xattr_lookup (inode, name,XATTR_REPLACE );if (IS_ERR (dentry)) { err =PTR_ERR (dentry);
include/net/bluetooth/hci_core.h +24 -6
@@ -1308,16 +1308,34 @@ static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status) conn->security_cfm_cb (conn, status); } -static inline void hci_encrypt_cfm (struct hci_conn *conn,__u8 status, -__u8 encrypt) +static inline void hci_encrypt_cfm (struct hci_conn *conn,__u8 status) {struct hci_cb *cb; +__u8 encrypt; + +if (conn->state ==BT_CONFIG ) { +if (!status) + conn->state =BT_CONNECTED ; -if (conn->sec_level ==BT_SECURITY_SDP ) - conn->sec_level =BT_SECURITY_LOW ; +hci_connect_cfm (conn, status); +hci_conn_drop (conn); +return ; + } -if (conn->pending_sec_level > conn->sec_level) - conn->sec_level = conn->pending_sec_level; +if (!test_bit (HCI_CONN_ENCRYPT , &conn->flags)) + encrypt =0x00 ; +else if (test_bit (HCI_CONN_AES_CCM , &conn->flags)) + encrypt =0x02 ; +else + encrypt =0x01 ; + +if (!status) { +if (conn->sec_level ==BT_SECURITY_SDP ) + conn->sec_level =BT_SECURITY_LOW ; + +if (conn->pending_sec_level > conn->sec_level) + conn->sec_level = conn->pending_sec_level; + }mutex_lock (&hci_cb_list_lock);list_for_each_entry (cb, &hci_cb_list, list) {
include/net/bluetooth/l2cap.h +2 -0
@@ -623,6 +623,8 @@ struct l2cap_ops {struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,unsigned long hdr_len,unsigned long len,int nb); +int (*filter) (struct l2cap_chan * chan, +struct sk_buff *skb); };struct l2cap_conn {
net/bluetooth/a2mp.c +21 -1
@@ -226,6 +226,9 @@ static int a2mp_discover_rsp(struct amp_mgr *mgr, struct sk_buff *skb,struct a2mp_info_req req; found = true; + +memset (&req,0 ,sizeof (req)); + req.id = cl->id;a2mp_send (mgr,A2MP_GETINFO_REQ ,__next_ident (mgr),sizeof (req), &req);
@@ -305,6 +308,8 @@ static int a2mp_getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb,if (!hdev || hdev->dev_type !=HCI_AMP ) {struct a2mp_info_rsp rsp; +memset (&rsp,0 ,sizeof (rsp)); + rsp.id = req->id; rsp.status =A2MP_STATUS_INVALID_CTRL_ID ;
@@ -348,6 +353,8 @@ static int a2mp_getinfo_rsp(struct amp_mgr *mgr, struct sk_buff *skb,if (!ctrl)return -ENOMEM ; +memset (&req,0 ,sizeof (req)); + req.id = rsp->id;a2mp_send (mgr,A2MP_GETAMPASSOC_REQ ,__next_ident (mgr),sizeof (req), &req);
@@ -376,6 +383,8 @@ static int a2mp_getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb,struct a2mp_amp_assoc_rsp rsp; rsp.id = req->id; +memset (&rsp,0 ,sizeof (rsp)); +if (tmp) { rsp.status =A2MP_STATUS_COLLISION_OCCURED ;amp_mgr_put (tmp);
@@ -464,7 +473,6 @@ static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb, struct a2mp_cmd *hdr) {struct a2mp_physlink_req *req = (void *) skb->data; -struct a2mp_physlink_rsp rsp;struct hci_dev *hdev;struct hci_conn *hcon;
@@ -475,6 +483,8 @@ static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,BT_DBG ("local_id %d, remote_id %d" , req->local_id, req->remote_id); +memset (&rsp,0 ,sizeof (rsp)); + rsp.local_id = req->remote_id; rsp.remote_id = req->local_id;
@@ -553,6 +563,8 @@ static int a2mp_discphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,BT_DBG ("local_id %d remote_id %d" , req->local_id, req->remote_id); +memset (&rsp,0 ,sizeof (rsp)); + rsp.local_id = req->remote_id; rsp.remote_id = req->local_id; rsp.status =A2MP_STATUS_SUCCESS ;
@@ -675,6 +687,8 @@ static int a2mp_chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)if (err) {struct a2mp_cmd_rej rej; +memset (&rej,0 ,sizeof (rej)); + rej.reason =cpu_to_le16 (0 ); hdr = (void *) skb->data;
@@ -898,6 +912,8 @@ void a2mp_send_getinfo_rsp(struct hci_dev *hdev)BT_DBG ("%s mgr %p" , hdev->name, mgr); +memset (&rsp,0 ,sizeof (rsp)); + rsp.id = hdev->id; rsp.status =A2MP_STATUS_INVALID_CTRL_ID ;
@@ -995,6 +1011,8 @@ void a2mp_send_create_phy_link_rsp(struct hci_dev *hdev, u8 status)if (!mgr)return ; +memset (&rsp,0 ,sizeof (rsp)); + hs_hcon =hci_conn_hash_lookup_state (hdev,AMP_LINK ,BT_CONNECT );if (!hs_hcon) { rsp.status =A2MP_STATUS_UNABLE_START_LINK_CREATION ;
@@ -1027,6 +1045,8 @@ void a2mp_discover_amp(struct l2cap_chan *chan) mgr->bredr_chan = chan; +memset (&req,0 ,sizeof (req)); + req.mtu =cpu_to_le16 (L2CAP_A2MP_DEFAULT_MTU ); req.ext_feat =0 ;a2mp_send (mgr,A2MP_DISCOVER_REQ ,1 ,sizeof (req), &req);
net/bluetooth/hci_conn.c +17 -0
@@ -1285,6 +1285,23 @@ int hci_conn_check_link_mode(struct hci_conn *conn)return 0 ; } +/* AES encryption is required for Level 4: +* +* BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 3, Part C +* page 1319: +* +* 128-bit equivalent strength for link and encryption keys +* required using FIPS approved algorithms (E0 not allowed, +* SAFER+ not allowed, and P-192 not allowed; encryption key +* not shortened) +*/ +if (conn->sec_level ==BT_SECURITY_FIPS && + !test_bit (HCI_CONN_AES_CCM , &conn->flags)) { +bt_dev_err (conn->hdev, +"Invalid security: Missing AES-CCM usage" ); +return 0 ; + } +if (hci_conn_ssp_enabled (conn) && !test_bit (HCI_CONN_ENCRYPT , &conn->flags))return 0 ;
net/bluetooth/hci_event.c +11 -37
81 lines not on this page · raw message
net/bluetooth/l2cap_core.c +4 -3
@@ -6701,9 +6701,10 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) goto drop; } -if ((chan->mode ==L2CAP_MODE_ERTM || - chan->mode ==L2CAP_MODE_STREAMING ) &&sk_filter (chan->data, skb)) - goto drop; +if (chan->ops->filter) { +if (chan->ops->filter (chan, skb)) + goto drop; + }if (!control->sframe) {int err;
net/bluetooth/l2cap_sock.c +14 -0
@@ -1479,6 +1479,19 @@ static void l2cap_sock_suspend_cb(struct l2cap_chan *chan) sk->sk_state_change (sk); } +static int l2cap_sock_filter (struct l2cap_chan *chan,struct sk_buff *skb) +{ +struct sock *sk = chan->data; + +switch (chan->mode) { +case L2CAP_MODE_ERTM : +case L2CAP_MODE_STREAMING : +return sk_filter (sk, skb); + } + +return 0 ; +} +static const struct l2cap_ops l2cap_chan_ops = { .name ="L2CAP Socket Interface" , .new_connection = l2cap_sock_new_connection_cb,
@@ -1493,6 +1506,7 @@ static const struct l2cap_ops l2cap_chan_ops = { .set_shutdown = l2cap_sock_set_shutdown_cb, .get_sndtimeo = l2cap_sock_get_sndtimeo_cb, .alloc_skb = l2cap_sock_alloc_skb_cb, + .filter = l2cap_sock_filter, };static void l2cap_sock_destruct (struct sock *sk)
net/bluetooth/mgmt.c +6 -1
@@ -756,7 +756,8 @@ static u32 get_supported_settings(struct hci_dev *hdev)if (lmp_ssp_capable (hdev)) { settings |=MGMT_SETTING_SSP ; - settings |=MGMT_SETTING_HS ; +if (IS_ENABLED (CONFIG_BT_HS )) + settings |=MGMT_SETTING_HS ; }if (lmp_sc_capable (hdev))
@@ -1771,6 +1772,10 @@ static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)BT_DBG ("request for %s" , hdev->name); +if (!IS_ENABLED (CONFIG_BT_HS )) +return mgmt_cmd_status (sk, hdev->id,MGMT_OP_SET_HS , +MGMT_STATUS_NOT_SUPPORTED ); + status =mgmt_bredr_support (hdev);if (status)return mgmt_cmd_status (sk, hdev->id,MGMT_OP_SET_HS , status);
tools/perf/util/cs-etm.c +3 -0
@@ -94,6 +94,9 @@ struct cs_etm_queue {struct cs_etm_traceid_queue **traceid_queues; }; +/* RB tree for quick conversion between traceID and metadata pointers */ +static struct intlist *traceid_list; +static int cs_etm__update_queues (struct cs_etm_auxtrace *etm);static int cs_etm__process_queues (struct cs_etm_auxtrace *etm); static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
tools/perf/util/cs-etm.h +0 -3
@@ -114,9 +114,6 @@ enum cs_etm_isa { CS_ETM_ISA_T32, }; -/* RB tree for quick conversion between traceID and metadata pointers */ -struct intlist *traceid_list; -struct cs_etm_queue ;struct cs_etm_packet {