From 243a6a7c277f5bbf986ac80e227219c28761f20a Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Fri, 31 Jul 2020 21:07:04 -0400 Subject: [PATCH] Fixes for 4.14 Signed-off-by: Sasha Levin --- ...elease-allocated-buffer-if-timed-out.patch | 34 ++ ...elease-allocated-buffer-if-timed-out.patch | 51 +++ ...se-all-allocated-memory-if-sha-type-.patch | 41 +++ ...ck-if-file-namelen-exceeds-max-value.patch | 38 +++ ...ck-memory-boundary-by-insane-namelen.patch | 51 +++ .../iio-imu-adis16400-fix-memory-leak.patch | 38 +++ ...vent-memory-leak-in-cx23888_ir_probe.patch | 40 +++ ...-unimac-fix-potential-null-dereferen.patch | 49 +++ ...ibsas-direct-call-probe-and-destruct.patch | 304 ++++++++++++++++++ queue-4.14/series | 10 + ...ul-not-to-clear-kvm_vcpu_flush_tlb-b.patch | 41 +++ 11 files changed, 697 insertions(+) create mode 100644 queue-4.14/ath9k-release-allocated-buffer-if-timed-out.patch create mode 100644 queue-4.14/ath9k_htc-release-allocated-buffer-if-timed-out.patch create mode 100644 queue-4.14/crypto-ccp-release-all-allocated-memory-if-sha-type-.patch create mode 100644 queue-4.14/f2fs-check-if-file-namelen-exceeds-max-value.patch create mode 100644 queue-4.14/f2fs-check-memory-boundary-by-insane-namelen.patch create mode 100644 queue-4.14/iio-imu-adis16400-fix-memory-leak.patch create mode 100644 queue-4.14/media-rc-prevent-memory-leak-in-cx23888_ir_probe.patch create mode 100644 queue-4.14/net-phy-mdio-bcm-unimac-fix-potential-null-dereferen.patch create mode 100644 queue-4.14/scsi-libsas-direct-call-probe-and-destruct.patch create mode 100644 queue-4.14/series create mode 100644 queue-4.14/x86-kvm-be-careful-not-to-clear-kvm_vcpu_flush_tlb-b.patch diff --git a/queue-4.14/ath9k-release-allocated-buffer-if-timed-out.patch b/queue-4.14/ath9k-release-allocated-buffer-if-timed-out.patch new file mode 100644 index 00000000000..ddd1c83951a --- /dev/null +++ b/queue-4.14/ath9k-release-allocated-buffer-if-timed-out.patch @@ -0,0 +1,34 @@ +From 76a94d2ce09add1082099081b4a22633b59e4584 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 6 Sep 2019 13:59:30 -0500 +Subject: ath9k: release allocated buffer if timed out + +From: Navid Emamdoost + +[ Upstream commit 728c1e2a05e4b5fc52fab3421dce772a806612a2 ] + +In ath9k_wmi_cmd, the allocated network buffer needs to be released +if timeout happens. Otherwise memory will be leaked. + +Signed-off-by: Navid Emamdoost +Signed-off-by: Kalle Valo +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath9k/wmi.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c +index f57f48e4d7a0a..4b68804f3742e 100644 +--- a/drivers/net/wireless/ath/ath9k/wmi.c ++++ b/drivers/net/wireless/ath/ath9k/wmi.c +@@ -338,6 +338,7 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, + ath_dbg(common, WMI, "Timeout waiting for WMI command: %s\n", + wmi_cmd_to_name(cmd_id)); + mutex_unlock(&wmi->op_mutex); ++ kfree_skb(skb); + return -ETIMEDOUT; + } + +-- +2.25.1 + diff --git a/queue-4.14/ath9k_htc-release-allocated-buffer-if-timed-out.patch b/queue-4.14/ath9k_htc-release-allocated-buffer-if-timed-out.patch new file mode 100644 index 00000000000..ea7f2ea2668 --- /dev/null +++ b/queue-4.14/ath9k_htc-release-allocated-buffer-if-timed-out.patch @@ -0,0 +1,51 @@ +From 45924348ea54b7d337016a90d52b3df021898568 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 6 Sep 2019 13:26:03 -0500 +Subject: ath9k_htc: release allocated buffer if timed out + +From: Navid Emamdoost + +[ Upstream commit 853acf7caf10b828102d92d05b5c101666a6142b ] + +In htc_config_pipe_credits, htc_setup_complete, and htc_connect_service +if time out happens, the allocated buffer needs to be released. +Otherwise there will be memory leak. + +Signed-off-by: Navid Emamdoost +Signed-off-by: Kalle Valo +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath9k/htc_hst.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c +index d2e062eaf5614..f705f0e1cb5be 100644 +--- a/drivers/net/wireless/ath/ath9k/htc_hst.c ++++ b/drivers/net/wireless/ath/ath9k/htc_hst.c +@@ -173,6 +173,7 @@ static int htc_config_pipe_credits(struct htc_target *target) + time_left = wait_for_completion_timeout(&target->cmd_wait, HZ); + if (!time_left) { + dev_err(target->dev, "HTC credit config timeout\n"); ++ kfree_skb(skb); + return -ETIMEDOUT; + } + +@@ -208,6 +209,7 @@ static int htc_setup_complete(struct htc_target *target) + time_left = wait_for_completion_timeout(&target->cmd_wait, HZ); + if (!time_left) { + dev_err(target->dev, "HTC start timeout\n"); ++ kfree_skb(skb); + return -ETIMEDOUT; + } + +@@ -280,6 +282,7 @@ int htc_connect_service(struct htc_target *target, + if (!time_left) { + dev_err(target->dev, "Service connection timeout for: %d\n", + service_connreq->service_id); ++ kfree_skb(skb); + return -ETIMEDOUT; + } + +-- +2.25.1 + diff --git a/queue-4.14/crypto-ccp-release-all-allocated-memory-if-sha-type-.patch b/queue-4.14/crypto-ccp-release-all-allocated-memory-if-sha-type-.patch new file mode 100644 index 00000000000..be64340e263 --- /dev/null +++ b/queue-4.14/crypto-ccp-release-all-allocated-memory-if-sha-type-.patch @@ -0,0 +1,41 @@ +From d229eca59df36fa85f4e88161cf66728efad44e7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 19 Sep 2019 11:04:48 -0500 +Subject: crypto: ccp - Release all allocated memory if sha type is invalid + +From: Navid Emamdoost + +[ Upstream commit 128c66429247add5128c03dc1e144ca56f05a4e2 ] + +Release all allocated memory if sha type is invalid: +In ccp_run_sha_cmd, if the type of sha is invalid, the allocated +hmac_buf should be released. + +v2: fix the goto. + +Signed-off-by: Navid Emamdoost +Acked-by: Gary R Hook +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/ccp/ccp-ops.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c +index 330853a2702f0..43b74cf0787e1 100644 +--- a/drivers/crypto/ccp/ccp-ops.c ++++ b/drivers/crypto/ccp/ccp-ops.c +@@ -1783,8 +1783,9 @@ ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + LSB_ITEM_SIZE); + break; + default: ++ kfree(hmac_buf); + ret = -EINVAL; +- goto e_ctx; ++ goto e_data; + } + + memset(&hmac_cmd, 0, sizeof(hmac_cmd)); +-- +2.25.1 + diff --git a/queue-4.14/f2fs-check-if-file-namelen-exceeds-max-value.patch b/queue-4.14/f2fs-check-if-file-namelen-exceeds-max-value.patch new file mode 100644 index 00000000000..448918124e5 --- /dev/null +++ b/queue-4.14/f2fs-check-if-file-namelen-exceeds-max-value.patch @@ -0,0 +1,38 @@ +From 36fe9b4e51156ceded27c42255b18cf5a48d82b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Jan 2019 15:02:34 +0800 +Subject: f2fs: check if file namelen exceeds max value + +From: Sheng Yong + +[ Upstream commit 720db068634c91553a8e1d9a0fcd8c7050e06d2b ] + +Dentry bitmap is not enough to detect incorrect dentries. So this patch +also checks the namelen value of a dentry. + +Signed-off-by: Gong Chen +Signed-off-by: Sheng Yong +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/dir.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c +index 9e85e2d7a1b3c..f019bbf6f52ff 100644 +--- a/fs/f2fs/dir.c ++++ b/fs/f2fs/dir.c +@@ -819,7 +819,8 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, + + /* check memory boundary before moving forward */ + bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); +- if (unlikely(bit_pos > d->max)) { ++ if (unlikely(bit_pos > d->max || ++ le16_to_cpu(de->name_len) > F2FS_NAME_LEN)) { + f2fs_msg(F2FS_I_SB(d->inode)->sb, KERN_WARNING, + "%s: corrupted namelen=%d, run fsck to fix.", + __func__, le16_to_cpu(de->name_len)); +-- +2.25.1 + diff --git a/queue-4.14/f2fs-check-memory-boundary-by-insane-namelen.patch b/queue-4.14/f2fs-check-memory-boundary-by-insane-namelen.patch new file mode 100644 index 00000000000..6e17edd9f82 --- /dev/null +++ b/queue-4.14/f2fs-check-memory-boundary-by-insane-namelen.patch @@ -0,0 +1,51 @@ +From eca1eba41a2efa42abb1c7dcc7e169fb691de90c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 14 Nov 2018 12:40:30 -0800 +Subject: f2fs: check memory boundary by insane namelen + +From: Jaegeuk Kim + +[ Upstream commit 4e240d1bab1ead280ddf5eb05058dba6bbd57d10 ] + +If namelen is corrupted to have very long value, fill_dentries can copy +wrong memory area. + +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/dir.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c +index 4abefd841b6c7..9e85e2d7a1b3c 100644 +--- a/fs/f2fs/dir.c ++++ b/fs/f2fs/dir.c +@@ -817,6 +817,16 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, + de_name.name = d->filename[bit_pos]; + de_name.len = le16_to_cpu(de->name_len); + ++ /* check memory boundary before moving forward */ ++ bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); ++ if (unlikely(bit_pos > d->max)) { ++ f2fs_msg(F2FS_I_SB(d->inode)->sb, KERN_WARNING, ++ "%s: corrupted namelen=%d, run fsck to fix.", ++ __func__, le16_to_cpu(de->name_len)); ++ set_sbi_flag(sbi, SBI_NEED_FSCK); ++ return -EINVAL; ++ } ++ + if (f2fs_encrypted_inode(d->inode)) { + int save_len = fstr->len; + int err; +@@ -835,7 +845,6 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, + le32_to_cpu(de->ino), d_type)) + return 1; + +- bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); + ctx->pos = start_pos + bit_pos; + } + return 0; +-- +2.25.1 + diff --git a/queue-4.14/iio-imu-adis16400-fix-memory-leak.patch b/queue-4.14/iio-imu-adis16400-fix-memory-leak.patch new file mode 100644 index 00000000000..05149848f54 --- /dev/null +++ b/queue-4.14/iio-imu-adis16400-fix-memory-leak.patch @@ -0,0 +1,38 @@ +From 4463fffd605a733c4434332644511ea093844f2e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Jul 2020 19:14:12 -0400 +Subject: iio: imu: adis16400: fix memory leak + +[ Upstream commit 9c0530e898f384c5d279bfcebd8bb17af1105873 ] + +In adis_update_scan_mode_burst, if adis->buffer allocation fails release +the adis->xfer. + +Signed-off-by: Navid Emamdoost +Reviewed-by: Alexandru Ardelean +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/imu/adis16400_buffer.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/iio/imu/adis16400_buffer.c b/drivers/iio/imu/adis16400_buffer.c +index e70a5339acb19..3fc11aec98b95 100644 +--- a/drivers/iio/imu/adis16400_buffer.c ++++ b/drivers/iio/imu/adis16400_buffer.c +@@ -38,8 +38,11 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, + return -ENOMEM; + + adis->buffer = kzalloc(burst_length + sizeof(u16), GFP_KERNEL); +- if (!adis->buffer) ++ if (!adis->buffer) { ++ kfree(adis->xfer); ++ adis->xfer = NULL; + return -ENOMEM; ++ } + + tx = adis->buffer + burst_length; + tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD); +-- +2.25.1 + diff --git a/queue-4.14/media-rc-prevent-memory-leak-in-cx23888_ir_probe.patch b/queue-4.14/media-rc-prevent-memory-leak-in-cx23888_ir_probe.patch new file mode 100644 index 00000000000..4e548650257 --- /dev/null +++ b/queue-4.14/media-rc-prevent-memory-leak-in-cx23888_ir_probe.patch @@ -0,0 +1,40 @@ +From e2fe6a8dba01fc818af2ad7e69a2ec501f0a9617 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 Sep 2019 12:02:41 -0300 +Subject: media: rc: prevent memory leak in cx23888_ir_probe + +From: Navid Emamdoost + +[ Upstream commit a7b2df76b42bdd026e3106cf2ba97db41345a177 ] + +In cx23888_ir_probe if kfifo_alloc fails the allocated memory for state +should be released. + +Signed-off-by: Navid Emamdoost +Signed-off-by: Sean Young +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/pci/cx23885/cx23888-ir.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/pci/cx23885/cx23888-ir.c b/drivers/media/pci/cx23885/cx23888-ir.c +index 040323b0f9455..f63a7e6f272c2 100644 +--- a/drivers/media/pci/cx23885/cx23888-ir.c ++++ b/drivers/media/pci/cx23885/cx23888-ir.c +@@ -1178,8 +1178,11 @@ int cx23888_ir_probe(struct cx23885_dev *dev) + return -ENOMEM; + + spin_lock_init(&state->rx_kfifo_lock); +- if (kfifo_alloc(&state->rx_kfifo, CX23888_IR_RX_KFIFO_SIZE, GFP_KERNEL)) ++ if (kfifo_alloc(&state->rx_kfifo, CX23888_IR_RX_KFIFO_SIZE, ++ GFP_KERNEL)) { ++ kfree(state); + return -ENOMEM; ++ } + + state->dev = dev; + sd = &state->sd; +-- +2.25.1 + diff --git a/queue-4.14/net-phy-mdio-bcm-unimac-fix-potential-null-dereferen.patch b/queue-4.14/net-phy-mdio-bcm-unimac-fix-potential-null-dereferen.patch new file mode 100644 index 00000000000..3ad1d2a431a --- /dev/null +++ b/queue-4.14/net-phy-mdio-bcm-unimac-fix-potential-null-dereferen.patch @@ -0,0 +1,49 @@ +From 5658e801f7171c06d20004f7b24260336aecce94 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jan 2018 11:21:51 +0000 +Subject: net: phy: mdio-bcm-unimac: fix potential NULL dereference in + unimac_mdio_probe() + +From: Wei Yongjun + +[ Upstream commit 297a6961ffb8ff4dc66c9fbf53b924bd1dda05d5 ] + +platform_get_resource() may fail and return NULL, so we should +better check it's return value to avoid a NULL pointer dereference +a bit later in the code. + +This is detected by Coccinelle semantic patch. + +@@ +expression pdev, res, n, t, e, e1, e2; +@@ + +res = platform_get_resource(pdev, t, n); ++ if (!res) ++ return -EINVAL; +... when != res == NULL +e = devm_ioremap(e1, res->start, e2); + +Signed-off-by: Wei Yongjun +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/phy/mdio-bcm-unimac.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c +index 52703bbd4d666..df75efa96a7d9 100644 +--- a/drivers/net/phy/mdio-bcm-unimac.c ++++ b/drivers/net/phy/mdio-bcm-unimac.c +@@ -237,6 +237,8 @@ static int unimac_mdio_probe(struct platform_device *pdev) + return -ENOMEM; + + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!r) ++ return -EINVAL; + + /* Just ioremap, as this MDIO block is usually integrated into an + * Ethernet MAC controller register range +-- +2.25.1 + diff --git a/queue-4.14/scsi-libsas-direct-call-probe-and-destruct.patch b/queue-4.14/scsi-libsas-direct-call-probe-and-destruct.patch new file mode 100644 index 00000000000..417df459743 --- /dev/null +++ b/queue-4.14/scsi-libsas-direct-call-probe-and-destruct.patch @@ -0,0 +1,304 @@ +From 0b600755fa9f12c3cf9b046237b362e69c5b4fa7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Dec 2017 17:42:09 +0800 +Subject: scsi: libsas: direct call probe and destruct + +From: Jason Yan + +[ Upstream commit 0558f33c06bb910e2879e355192227a8e8f0219d ] + +In commit 87c8331fcf72 ("[SCSI] libsas: prevent domain rediscovery +competing with ata error handling") introduced disco mutex to prevent +rediscovery competing with ata error handling and put the whole +revalidation in the mutex. But the rphy add/remove needs to wait for the +error handling which also grabs the disco mutex. This may leads to dead +lock.So the probe and destruct event were introduce to do the rphy +add/remove asynchronously and out of the lock. + +The asynchronously processed workers makes the whole discovery process +not atomic, the other events may interrupt the process. For example, +if a loss of signal event inserted before the probe event, the +sas_deform_port() is called and the port will be deleted. + +And sas_port_delete() may run before the destruct event, but the +port-x:x is the top parent of end device or expander. This leads to +a kernel WARNING such as: + +[ 82.042979] sysfs group 'power' not found for kobject 'phy-1:0:22' +[ 82.042983] ------------[ cut here ]------------ +[ 82.042986] WARNING: CPU: 54 PID: 1714 at fs/sysfs/group.c:237 +sysfs_remove_group+0x94/0xa0 +[ 82.043059] Call trace: +[ 82.043082] [] sysfs_remove_group+0x94/0xa0 +[ 82.043085] [] dpm_sysfs_remove+0x60/0x70 +[ 82.043086] [] device_del+0x138/0x308 +[ 82.043089] [] sas_phy_delete+0x38/0x60 +[ 82.043091] [] do_sas_phy_delete+0x6c/0x80 +[ 82.043093] [] device_for_each_child+0x58/0xa0 +[ 82.043095] [] sas_remove_children+0x40/0x50 +[ 82.043100] [] sas_destruct_devices+0x64/0xa0 +[ 82.043102] [] process_one_work+0x1fc/0x4b0 +[ 82.043104] [] worker_thread+0x50/0x490 +[ 82.043105] [] kthread+0xfc/0x128 +[ 82.043107] [] ret_from_fork+0x10/0x50 + +Make probe and destruct a direct call in the disco and revalidate function, +but put them outside the lock. The whole discovery or revalidate won't +be interrupted by other events. And the DISCE_PROBE and DISCE_DESTRUCT +event are deleted as a result of the direct call. + +Introduce a new list to destruct the sas_port and put the port delete after +the destruct. This makes sure the right order of destroying the sysfs +kobject and fix the warning above. + +In sas_ex_revalidate_domain() have a loop to find all broadcasted +device, and sometimes we have a chance to find the same expander twice. +Because the sas_port will be deleted at the end of the whole revalidate +process, sas_port with the same name cannot be added before this. +Otherwise the sysfs will complain of creating duplicate filename. Since +the LLDD will send broadcast for every device change, we can only +process one expander's revalidation. + +[mkp: kbuild test robot warning] + +Signed-off-by: Jason Yan +CC: John Garry +CC: Johannes Thumshirn +CC: Ewan Milne +CC: Christoph Hellwig +CC: Tomas Henzl +CC: Dan Williams +Reviewed-by: Hannes Reinecke +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/libsas/sas_ata.c | 1 - + drivers/scsi/libsas/sas_discover.c | 32 +++++++++++++++++------------- + drivers/scsi/libsas/sas_expander.c | 8 +++----- + drivers/scsi/libsas/sas_internal.h | 1 + + drivers/scsi/libsas/sas_port.c | 3 +++ + include/scsi/libsas.h | 3 +-- + include/scsi/scsi_transport_sas.h | 1 + + 7 files changed, 27 insertions(+), 22 deletions(-) + +diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c +index 70be4425ae0be..2b3637b40dde9 100644 +--- a/drivers/scsi/libsas/sas_ata.c ++++ b/drivers/scsi/libsas/sas_ata.c +@@ -730,7 +730,6 @@ int sas_discover_sata(struct domain_device *dev) + if (res) + return res; + +- sas_discover_event(dev->port, DISCE_PROBE); + return 0; + } + +diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c +index b200edc665a58..d6365e2fcc603 100644 +--- a/drivers/scsi/libsas/sas_discover.c ++++ b/drivers/scsi/libsas/sas_discover.c +@@ -221,13 +221,9 @@ void sas_notify_lldd_dev_gone(struct domain_device *dev) + } + } + +-static void sas_probe_devices(struct work_struct *work) ++static void sas_probe_devices(struct asd_sas_port *port) + { + struct domain_device *dev, *n; +- struct sas_discovery_event *ev = to_sas_discovery_event(work); +- struct asd_sas_port *port = ev->port; +- +- clear_bit(DISCE_PROBE, &port->disc.pending); + + /* devices must be domain members before link recovery and probe */ + list_for_each_entry(dev, &port->disco_list, disco_list_node) { +@@ -303,7 +299,6 @@ int sas_discover_end_dev(struct domain_device *dev) + res = sas_notify_lldd_dev_found(dev); + if (res) + return res; +- sas_discover_event(dev->port, DISCE_PROBE); + + return 0; + } +@@ -362,13 +357,9 @@ static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_d + sas_put_device(dev); + } + +-static void sas_destruct_devices(struct work_struct *work) ++void sas_destruct_devices(struct asd_sas_port *port) + { + struct domain_device *dev, *n; +- struct sas_discovery_event *ev = to_sas_discovery_event(work); +- struct asd_sas_port *port = ev->port; +- +- clear_bit(DISCE_DESTRUCT, &port->disc.pending); + + list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) { + list_del_init(&dev->disco_list_node); +@@ -379,6 +370,16 @@ static void sas_destruct_devices(struct work_struct *work) + } + } + ++static void sas_destruct_ports(struct asd_sas_port *port) ++{ ++ struct sas_port *sas_port, *p; ++ ++ list_for_each_entry_safe(sas_port, p, &port->sas_port_del_list, del_list) { ++ list_del_init(&sas_port->del_list); ++ sas_port_delete(sas_port); ++ } ++} ++ + void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) + { + if (!test_bit(SAS_DEV_DESTROY, &dev->state) && +@@ -393,7 +394,6 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) + if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) { + sas_rphy_unlink(dev->rphy); + list_move_tail(&dev->disco_list_node, &port->destroy_list); +- sas_discover_event(dev->port, DISCE_DESTRUCT); + } + } + +@@ -499,6 +499,8 @@ static void sas_discover_domain(struct work_struct *work) + port->port_dev = NULL; + } + ++ sas_probe_devices(port); ++ + SAS_DPRINTK("DONE DISCOVERY on port %d, pid:%d, result:%d\n", port->id, + task_pid_nr(current), error); + } +@@ -532,6 +534,10 @@ static void sas_revalidate_domain(struct work_struct *work) + port->id, task_pid_nr(current), res); + out: + mutex_unlock(&ha->disco_mutex); ++ ++ sas_destruct_devices(port); ++ sas_destruct_ports(port); ++ sas_probe_devices(port); + } + + /* ---------- Events ---------- */ +@@ -587,10 +593,8 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port) + static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { + [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, + [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, +- [DISCE_PROBE] = sas_probe_devices, + [DISCE_SUSPEND] = sas_suspend_devices, + [DISCE_RESUME] = sas_resume_devices, +- [DISCE_DESTRUCT] = sas_destruct_devices, + }; + + disc->pending = 0; +diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c +index f77d72f01da91..84df6cf467605 100644 +--- a/drivers/scsi/libsas/sas_expander.c ++++ b/drivers/scsi/libsas/sas_expander.c +@@ -1946,7 +1946,8 @@ static void sas_unregister_devs_sas_addr(struct domain_device *parent, + sas_port_delete_phy(phy->port, phy->phy); + sas_device_set_phy(found, phy->port); + if (phy->port->num_phys == 0) +- sas_port_delete(phy->port); ++ list_add_tail(&phy->port->del_list, ++ &parent->port->sas_port_del_list); + phy->port = NULL; + } + } +@@ -2156,7 +2157,7 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev) + struct domain_device *dev = NULL; + + res = sas_find_bcast_dev(port_dev, &dev); +- while (res == 0 && dev) { ++ if (res == 0 && dev) { + struct expander_device *ex = &dev->ex_dev; + int i = 0, phy_id; + +@@ -2168,9 +2169,6 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev) + res = sas_rediscover(dev, phy_id); + i = phy_id + 1; + } while (i < ex->num_phys); +- +- dev = NULL; +- res = sas_find_bcast_dev(port_dev, &dev); + } + return res; + } +diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h +index c07e081364915..f3449fde9c5fb 100644 +--- a/drivers/scsi/libsas/sas_internal.h ++++ b/drivers/scsi/libsas/sas_internal.h +@@ -98,6 +98,7 @@ int sas_try_ata_reset(struct asd_sas_phy *phy); + void sas_hae_reset(struct work_struct *work); + + void sas_free_device(struct kref *kref); ++void sas_destruct_devices(struct asd_sas_port *port); + + #ifdef CONFIG_SCSI_SAS_HOST_SMP + extern void sas_smp_host_handler(struct bsg_job *job, struct Scsi_Host *shost); +diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c +index d3c5297c6c89e..5d3244c8f2801 100644 +--- a/drivers/scsi/libsas/sas_port.c ++++ b/drivers/scsi/libsas/sas_port.c +@@ -66,6 +66,7 @@ static void sas_resume_port(struct asd_sas_phy *phy) + rc = sas_notify_lldd_dev_found(dev); + if (rc) { + sas_unregister_dev(port, dev); ++ sas_destruct_devices(port); + continue; + } + +@@ -219,6 +220,7 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone) + + if (port->num_phys == 1) { + sas_unregister_domain_devices(port, gone); ++ sas_destruct_devices(port); + sas_port_delete(port->port); + port->port = NULL; + } else { +@@ -323,6 +325,7 @@ static void sas_init_port(struct asd_sas_port *port, + INIT_LIST_HEAD(&port->dev_list); + INIT_LIST_HEAD(&port->disco_list); + INIT_LIST_HEAD(&port->destroy_list); ++ INIT_LIST_HEAD(&port->sas_port_del_list); + spin_lock_init(&port->phy_list_lock); + INIT_LIST_HEAD(&port->phy_list); + port->ha = sas_ha; +diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h +index a966d281dedc3..1b1cf9eff3b5a 100644 +--- a/include/scsi/libsas.h ++++ b/include/scsi/libsas.h +@@ -87,10 +87,8 @@ enum discover_event { + DISCE_DISCOVER_DOMAIN = 0U, + DISCE_REVALIDATE_DOMAIN = 1, + DISCE_PORT_GONE = 2, +- DISCE_PROBE = 3, + DISCE_SUSPEND = 4, + DISCE_RESUME = 5, +- DISCE_DESTRUCT = 6, + DISC_NUM_EVENTS = 7, + }; + +@@ -269,6 +267,7 @@ struct asd_sas_port { + struct list_head dev_list; + struct list_head disco_list; + struct list_head destroy_list; ++ struct list_head sas_port_del_list; + enum sas_linkrate linkrate; + + struct sas_work work; +diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h +index 62895b4059330..05ec927a3c729 100644 +--- a/include/scsi/scsi_transport_sas.h ++++ b/include/scsi/scsi_transport_sas.h +@@ -156,6 +156,7 @@ struct sas_port { + + struct mutex phy_list_mutex; + struct list_head phy_list; ++ struct list_head del_list; /* libsas only */ + }; + + #define dev_to_sas_port(d) \ +-- +2.25.1 + diff --git a/queue-4.14/series b/queue-4.14/series new file mode 100644 index 00000000000..0fe34a55bca --- /dev/null +++ b/queue-4.14/series @@ -0,0 +1,10 @@ +scsi-libsas-direct-call-probe-and-destruct.patch +net-phy-mdio-bcm-unimac-fix-potential-null-dereferen.patch +crypto-ccp-release-all-allocated-memory-if-sha-type-.patch +media-rc-prevent-memory-leak-in-cx23888_ir_probe.patch +iio-imu-adis16400-fix-memory-leak.patch +ath9k_htc-release-allocated-buffer-if-timed-out.patch +ath9k-release-allocated-buffer-if-timed-out.patch +x86-kvm-be-careful-not-to-clear-kvm_vcpu_flush_tlb-b.patch +f2fs-check-memory-boundary-by-insane-namelen.patch +f2fs-check-if-file-namelen-exceeds-max-value.patch diff --git a/queue-4.14/x86-kvm-be-careful-not-to-clear-kvm_vcpu_flush_tlb-b.patch b/queue-4.14/x86-kvm-be-careful-not-to-clear-kvm_vcpu_flush_tlb-b.patch new file mode 100644 index 00000000000..436dce03111 --- /dev/null +++ b/queue-4.14/x86-kvm-be-careful-not-to-clear-kvm_vcpu_flush_tlb-b.patch @@ -0,0 +1,41 @@ +From c43efa76c226ca8ba446766b270aebab824f48d1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Jul 2020 19:33:48 -0400 +Subject: x86/kvm: Be careful not to clear KVM_VCPU_FLUSH_TLB bit + +[ Upstream commit 8c6de56a42e0c657955e12b882a81ef07d1d073e ] + +kvm_steal_time_set_preempted() may accidentally clear KVM_VCPU_FLUSH_TLB +bit if it is called more than once while VCPU is preempted. + +This is part of CVE-2019-3016. + +(This bug was also independently discovered by Jim Mattson +) + +Signed-off-by: Boris Ostrovsky +Reviewed-by: Joao Martins +Cc: stable@vger.kernel.org +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + arch/x86/kvm/x86.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index 09f47c837c258..3aed03942d7d4 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -3075,6 +3075,9 @@ static void kvm_steal_time_set_preempted(struct kvm_vcpu *vcpu) + if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) + return; + ++ if (vcpu->arch.st.steal.preempted) ++ return; ++ + vcpu->arch.st.steal.preempted = 1; + + kvm_write_guest_offset_cached(vcpu->kvm, &vcpu->arch.st.stime, +-- +2.25.1 + -- 2.47.3