From: Greg Kroah-Hartman Date: Sat, 21 May 2022 14:30:31 +0000 (+0200) Subject: 4.19-stable patches X-Git-Tag: v4.9.316~36 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d4a7a066b6caec2b695cf0414a27491372676926;p=thirdparty%2Fkernel%2Fstable-queue.git 4.19-stable patches added patches: crypto-qcom-rng-fix-infinite-loop-on-requests-not-multiple-of-word_sz.patch drm-dp-mst-fix-a-possible-memory-leak-in-fetch_monitor_name.patch fix-double-fget-in-vhost_net_set_backend.patch pci-pm-avoid-putting-elo-i2-pcie-ports-in-d3cold.patch perf-fix-sys_perf_event_open-race-against-self.patch --- diff --git a/queue-4.19/crypto-qcom-rng-fix-infinite-loop-on-requests-not-multiple-of-word_sz.patch b/queue-4.19/crypto-qcom-rng-fix-infinite-loop-on-requests-not-multiple-of-word_sz.patch new file mode 100644 index 00000000000..46a0624dd4e --- /dev/null +++ b/queue-4.19/crypto-qcom-rng-fix-infinite-loop-on-requests-not-multiple-of-word_sz.patch @@ -0,0 +1,40 @@ +From 16287397ec5c08aa58db6acf7dbc55470d78087d Mon Sep 17 00:00:00 2001 +From: Ondrej Mosnacek +Date: Tue, 3 May 2022 13:50:10 +0200 +Subject: crypto: qcom-rng - fix infinite loop on requests not multiple of WORD_SZ + +From: Ondrej Mosnacek + +commit 16287397ec5c08aa58db6acf7dbc55470d78087d upstream. + +The commit referenced in the Fixes tag removed the 'break' from the else +branch in qcom_rng_read(), causing an infinite loop whenever 'max' is +not a multiple of WORD_SZ. This can be reproduced e.g. by running: + + kcapi-rng -b 67 >/dev/null + +There are many ways to fix this without adding back the 'break', but +they all seem more awkward than simply adding it back, so do just that. + +Tested on a machine with Qualcomm Amberwing processor. + +Fixes: a680b1832ced ("crypto: qcom-rng - ensure buffer for generate is completely filled") +Cc: stable@vger.kernel.org +Signed-off-by: Ondrej Mosnacek +Reviewed-by: Brian Masney +Signed-off-by: Herbert Xu +Signed-off-by: Greg Kroah-Hartman +--- + drivers/crypto/qcom-rng.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/crypto/qcom-rng.c ++++ b/drivers/crypto/qcom-rng.c +@@ -64,6 +64,7 @@ static int qcom_rng_read(struct qcom_rng + } else { + /* copy only remaining bytes */ + memcpy(data, &val, max - currsize); ++ break; + } + } while (currsize < max); + diff --git a/queue-4.19/drm-dp-mst-fix-a-possible-memory-leak-in-fetch_monitor_name.patch b/queue-4.19/drm-dp-mst-fix-a-possible-memory-leak-in-fetch_monitor_name.patch new file mode 100644 index 00000000000..7e687193505 --- /dev/null +++ b/queue-4.19/drm-dp-mst-fix-a-possible-memory-leak-in-fetch_monitor_name.patch @@ -0,0 +1,32 @@ +From 6e03b13cc7d9427c2c77feed1549191015615202 Mon Sep 17 00:00:00 2001 +From: Hangyu Hua +Date: Mon, 16 May 2022 11:20:42 +0800 +Subject: drm/dp/mst: fix a possible memory leak in fetch_monitor_name() + +From: Hangyu Hua + +commit 6e03b13cc7d9427c2c77feed1549191015615202 upstream. + +drm_dp_mst_get_edid call kmemdup to create mst_edid. So mst_edid need to be +freed after use. + +Signed-off-by: Hangyu Hua +Reviewed-by: Lyude Paul +Signed-off-by: Lyude Paul +Cc: stable@vger.kernel.org +Link: https://patchwork.freedesktop.org/patch/msgid/20220516032042.13166-1-hbh25y@gmail.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -2987,6 +2987,7 @@ static void fetch_monitor_name(struct dr + + mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port); + drm_edid_get_monitor_name(mst_edid, name, namelen); ++ kfree(mst_edid); + } + + /** diff --git a/queue-4.19/fix-double-fget-in-vhost_net_set_backend.patch b/queue-4.19/fix-double-fget-in-vhost_net_set_backend.patch new file mode 100644 index 00000000000..191faa28a50 --- /dev/null +++ b/queue-4.19/fix-double-fget-in-vhost_net_set_backend.patch @@ -0,0 +1,69 @@ +From fb4554c2232e44d595920f4d5c66cf8f7d13f9bc Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Mon, 16 May 2022 16:42:13 +0800 +Subject: Fix double fget() in vhost_net_set_backend() + +From: Al Viro + +commit fb4554c2232e44d595920f4d5c66cf8f7d13f9bc upstream. + +Descriptor table is a shared resource; two fget() on the same descriptor +may return different struct file references. get_tap_ptr_ring() is +called after we'd found (and pinned) the socket we'll be using and it +tries to find the private tun/tap data structures associated with it. +Redoing the lookup by the same file descriptor we'd used to get the +socket is racy - we need to same struct file. + +Thanks to Jason for spotting a braino in the original variant of patch - +I'd missed the use of fd == -1 for disabling backend, and in that case +we can end up with sock == NULL and sock != oldsock. + +Cc: stable@kernel.org +Acked-by: Michael S. Tsirkin +Signed-off-by: Jason Wang +Signed-off-by: Al Viro +Signed-off-by: Greg Kroah-Hartman +--- + drivers/vhost/net.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +--- a/drivers/vhost/net.c ++++ b/drivers/vhost/net.c +@@ -1209,13 +1209,9 @@ err: + return ERR_PTR(r); + } + +-static struct ptr_ring *get_tap_ptr_ring(int fd) ++static struct ptr_ring *get_tap_ptr_ring(struct file *file) + { + struct ptr_ring *ring; +- struct file *file = fget(fd); +- +- if (!file) +- return NULL; + ring = tun_get_tx_ring(file); + if (!IS_ERR(ring)) + goto out; +@@ -1224,7 +1220,6 @@ static struct ptr_ring *get_tap_ptr_ring + goto out; + ring = NULL; + out: +- fput(file); + return ring; + } + +@@ -1311,8 +1306,12 @@ static long vhost_net_set_backend(struct + r = vhost_net_enable_vq(n, vq); + if (r) + goto err_used; +- if (index == VHOST_NET_VQ_RX) +- nvq->rx_ring = get_tap_ptr_ring(fd); ++ if (index == VHOST_NET_VQ_RX) { ++ if (sock) ++ nvq->rx_ring = get_tap_ptr_ring(sock->file); ++ else ++ nvq->rx_ring = NULL; ++ } + + oldubufs = nvq->ubufs; + nvq->ubufs = ubufs; diff --git a/queue-4.19/pci-pm-avoid-putting-elo-i2-pcie-ports-in-d3cold.patch b/queue-4.19/pci-pm-avoid-putting-elo-i2-pcie-ports-in-d3cold.patch new file mode 100644 index 00000000000..8e40d774bdd --- /dev/null +++ b/queue-4.19/pci-pm-avoid-putting-elo-i2-pcie-ports-in-d3cold.patch @@ -0,0 +1,51 @@ +From 92597f97a40bf661bebceb92e26ff87c76d562d4 Mon Sep 17 00:00:00 2001 +From: "Rafael J. Wysocki" +Date: Thu, 31 Mar 2022 19:38:51 +0200 +Subject: PCI/PM: Avoid putting Elo i2 PCIe Ports in D3cold + +From: Rafael J. Wysocki + +commit 92597f97a40bf661bebceb92e26ff87c76d562d4 upstream. + +If a Root Port on Elo i2 is put into D3cold and then back into D0, the +downstream device becomes permanently inaccessible, so add a bridge D3 DMI +quirk for that system. + +This was exposed by 14858dcc3b35 ("PCI: Use pci_update_current_state() in +pci_enable_device_flags()"), but before that commit the Root Port in +question had never been put into D3cold for real due to a mismatch between +its power state retrieved from the PCI_PM_CTRL register (which was +accessible even though the platform firmware indicated that the port was in +D3cold) and the state of an ACPI power resource involved in its power +management. + +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=215715 +Link: https://lore.kernel.org/r/11980172.O9o76ZdvQC@kreacher +Reported-by: Stefan Gottwald +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Bjorn Helgaas +Cc: stable@vger.kernel.org # v5.15+ +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pci/pci.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -2517,6 +2517,16 @@ static const struct dmi_system_id bridge + DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), + DMI_MATCH(DMI_BOARD_NAME, "X299 DESIGNARE EX-CF"), + }, ++ /* ++ * Downstream device is not accessible after putting a root port ++ * into D3cold and back into D0 on Elo i2. ++ */ ++ .ident = "Elo i2", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Elo Touch Solutions"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Elo i2"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "RevB"), ++ }, + }, + #endif + { } diff --git a/queue-4.19/perf-fix-sys_perf_event_open-race-against-self.patch b/queue-4.19/perf-fix-sys_perf_event_open-race-against-self.patch new file mode 100644 index 00000000000..90d1318b91f --- /dev/null +++ b/queue-4.19/perf-fix-sys_perf_event_open-race-against-self.patch @@ -0,0 +1,71 @@ +From 3ac6487e584a1eb54071dbe1212e05b884136704 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Fri, 20 May 2022 20:38:06 +0200 +Subject: perf: Fix sys_perf_event_open() race against self + +From: Peter Zijlstra + +commit 3ac6487e584a1eb54071dbe1212e05b884136704 upstream. + +Norbert reported that it's possible to race sys_perf_event_open() such +that the looser ends up in another context from the group leader, +triggering many WARNs. + +The move_group case checks for races against itself, but the +!move_group case doesn't, seemingly relying on the previous +group_leader->ctx == ctx check. However, that check is racy due to not +holding any locks at that time. + +Therefore, re-check the result after acquiring locks and bailing +if they no longer match. + +Additionally, clarify the not_move_group case from the +move_group-vs-move_group race. + +Fixes: f63a8daa5812 ("perf: Fix event->ctx locking") +Reported-by: Norbert Slusarek +Signed-off-by: Peter Zijlstra (Intel) +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman +--- + kernel/events/core.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -10758,6 +10758,9 @@ SYSCALL_DEFINE5(perf_event_open, + * Do not allow to attach to a group in a different task + * or CPU context. If we're moving SW events, we'll fix + * this up later, so allow that. ++ * ++ * Racy, not holding group_leader->ctx->mutex, see comment with ++ * perf_event_ctx_lock(). + */ + if (!move_group && group_leader->ctx != ctx) + goto err_context; +@@ -10807,6 +10810,7 @@ SYSCALL_DEFINE5(perf_event_open, + } else { + perf_event_ctx_unlock(group_leader, gctx); + move_group = 0; ++ goto not_move_group; + } + } + +@@ -10823,7 +10827,17 @@ SYSCALL_DEFINE5(perf_event_open, + } + } else { + mutex_lock(&ctx->mutex); ++ ++ /* ++ * Now that we hold ctx->lock, (re)validate group_leader->ctx == ctx, ++ * see the group_leader && !move_group test earlier. ++ */ ++ if (group_leader && group_leader->ctx != ctx) { ++ err = -EINVAL; ++ goto err_locked; ++ } + } ++not_move_group: + + if (ctx->task == TASK_TOMBSTONE) { + err = -ESRCH; diff --git a/queue-4.19/series b/queue-4.19/series index 54421874661..29454026b7f 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -12,3 +12,8 @@ mmc-core-specify-timeouts-for-bkops-and-cache_flush-for-emmc.patch mmc-block-use-generic_cmd6_time-when-modifying-inand_cmd38_arg_ext_csd.patch mmc-core-default-to-generic_cmd6_time-as-timeout-in-__mmc_switch.patch alsa-wavefront-proper-check-of-get_user-error.patch +perf-fix-sys_perf_event_open-race-against-self.patch +fix-double-fget-in-vhost_net_set_backend.patch +pci-pm-avoid-putting-elo-i2-pcie-ports-in-d3cold.patch +crypto-qcom-rng-fix-infinite-loop-on-requests-not-multiple-of-word_sz.patch +drm-dp-mst-fix-a-possible-memory-leak-in-fetch_monitor_name.patch