From: Greg Kroah-Hartman Date: Mon, 22 Aug 2022 08:55:58 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v4.9.326~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=974513a8a95bba7f4e98a9cf73012cc88daf9d6b;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: acpi-property-return-type-of-acpi_add_nondev_subnodes-should-be-bool.patch apparmor-fix-aa_label_asxprint-return-check.patch apparmor-fix-absroot-causing-audited-secids-to-begin-with.patch apparmor-fix-failed-mount-permission-check-error-message.patch apparmor-fix-memleak-in-aa_simple_write_to_buffer.patch apparmor-fix-overlapping-attachment-computation.patch apparmor-fix-quiet_denied-for-file-rules.patch apparmor-fix-reference-count-leak-in-aa_pivotroot.patch can-ems_usb-fix-clang-s-wunaligned-access-warning.patch can-mcp251x-fix-race-condition-on-receive-interrupt.patch devlink-fix-use-after-free-after-a-failed-reload.patch documentation-acpi-einj-fix-obsolete-example.patch geneve-do-not-use-rt_tos-for-ipv6-flowlabel.patch net-bgmac-fix-a-bug-triggered-by-wrong-bytes_compl.patch nfsv4-fix-races-in-the-legacy-idmapper-upcall.patch nfsv4-pnfs-fix-a-use-after-free-bug-in-open.patch nfsv4.1-don-t-decrease-the-value-of-seq_nr_highest_sent.patch nfsv4.1-handle-nfs4err_delay-replies-to-op_sequence-correctly.patch nfsv4.1-reclaim_complete-must-handle-eacces.patch pinctrl-nomadik-fix-refcount-leak-in-nmk_pinctrl_dt_subnode_to_map.patch pinctrl-qcom-msm8916-allow-camss-gp-clocks-to-be-muxed.patch pinctrl-sunxi-add-i-o-bias-setting-for-h6-r-pio.patch plip-avoid-rcu-debug-splat.patch sunrpc-fix-expiry-of-auth-creds.patch sunrpc-reinitialise-the-backchannel-request-buffers-before-reuse.patch vsock-fix-memory-leak-in-vsock_connect.patch vsock-set-socket-state-back-to-ss_unconnected-in-vsock_connect_timeout.patch --- diff --git a/queue-5.4/acpi-property-return-type-of-acpi_add_nondev_subnodes-should-be-bool.patch b/queue-5.4/acpi-property-return-type-of-acpi_add_nondev_subnodes-should-be-bool.patch new file mode 100644 index 00000000000..d1cfac598b0 --- /dev/null +++ b/queue-5.4/acpi-property-return-type-of-acpi_add_nondev_subnodes-should-be-bool.patch @@ -0,0 +1,38 @@ +From 85140ef275f577f64e8a2c5789447222dfc14fc4 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Mon, 11 Jul 2022 14:25:59 +0300 +Subject: ACPI: property: Return type of acpi_add_nondev_subnodes() should be bool + +From: Sakari Ailus + +commit 85140ef275f577f64e8a2c5789447222dfc14fc4 upstream. + +The value acpi_add_nondev_subnodes() returns is bool so change the return +type of the function to match that. + +Fixes: 445b0eb058f5 ("ACPI / property: Add support for data-only subnodes") +Signed-off-by: Sakari Ailus +Reviewed-by: Andy Shevchenko +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman +--- + drivers/acpi/property.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/acpi/property.c ++++ b/drivers/acpi/property.c +@@ -152,10 +152,10 @@ static bool acpi_nondev_subnode_ok(acpi_ + return acpi_nondev_subnode_data_ok(handle, link, list, parent); + } + +-static int acpi_add_nondev_subnodes(acpi_handle scope, +- const union acpi_object *links, +- struct list_head *list, +- struct fwnode_handle *parent) ++static bool acpi_add_nondev_subnodes(acpi_handle scope, ++ const union acpi_object *links, ++ struct list_head *list, ++ struct fwnode_handle *parent) + { + bool ret = false; + int i; diff --git a/queue-5.4/apparmor-fix-aa_label_asxprint-return-check.patch b/queue-5.4/apparmor-fix-aa_label_asxprint-return-check.patch new file mode 100644 index 00000000000..eed1c592ffc --- /dev/null +++ b/queue-5.4/apparmor-fix-aa_label_asxprint-return-check.patch @@ -0,0 +1,56 @@ +From 3e2a3a0830a2090e766d0d887d52c67de2a6f323 Mon Sep 17 00:00:00 2001 +From: Tom Rix +Date: Sun, 13 Feb 2022 13:32:28 -0800 +Subject: apparmor: fix aa_label_asxprint return check + +From: Tom Rix + +commit 3e2a3a0830a2090e766d0d887d52c67de2a6f323 upstream. + +Clang static analysis reports this issue +label.c:1802:3: warning: 2nd function call argument + is an uninitialized value + pr_info("%s", str); + ^~~~~~~~~~~~~~~~~~ + +str is set from a successful call to aa_label_asxprint(&str, ...) +On failure a negative value is returned, not a -1. So change +the check. + +Fixes: f1bd904175e8 ("apparmor: add the base fns() for domain labels") +Signed-off-by: Tom Rix +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/label.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/security/apparmor/label.c ++++ b/security/apparmor/label.c +@@ -1750,7 +1750,7 @@ void aa_label_xaudit(struct audit_buffer + if (!use_label_hname(ns, label, flags) || + display_mode(ns, label, flags)) { + len = aa_label_asxprint(&name, ns, label, flags, gfp); +- if (len == -1) { ++ if (len < 0) { + AA_DEBUG("label print error"); + return; + } +@@ -1778,7 +1778,7 @@ void aa_label_seq_xprint(struct seq_file + int len; + + len = aa_label_asxprint(&str, ns, label, flags, gfp); +- if (len == -1) { ++ if (len < 0) { + AA_DEBUG("label print error"); + return; + } +@@ -1801,7 +1801,7 @@ void aa_label_xprintk(struct aa_ns *ns, + int len; + + len = aa_label_asxprint(&str, ns, label, flags, gfp); +- if (len == -1) { ++ if (len < 0) { + AA_DEBUG("label print error"); + return; + } diff --git a/queue-5.4/apparmor-fix-absroot-causing-audited-secids-to-begin-with.patch b/queue-5.4/apparmor-fix-absroot-causing-audited-secids-to-begin-with.patch new file mode 100644 index 00000000000..32f84ff2c80 --- /dev/null +++ b/queue-5.4/apparmor-fix-absroot-causing-audited-secids-to-begin-with.patch @@ -0,0 +1,76 @@ +From 511f7b5b835726e844a5fc7444c18e4b8672edfd Mon Sep 17 00:00:00 2001 +From: John Johansen +Date: Tue, 14 Dec 2021 02:59:28 -0800 +Subject: apparmor: fix absroot causing audited secids to begin with = + +From: John Johansen + +commit 511f7b5b835726e844a5fc7444c18e4b8672edfd upstream. + +AppArmor is prefixing secids that are converted to secctx with the = +to indicate the secctx should only be parsed from an absolute root +POV. This allows catching errors where secctx are reparsed back into +internal labels. + +Unfortunately because audit is using secid to secctx conversion this +means that subject and object labels can result in a very unfortunate +== that can break audit parsing. + +eg. the subj==unconfined term in the below audit message + +type=USER_LOGIN msg=audit(1639443365.233:160): pid=1633 uid=0 auid=1000 +ses=3 subj==unconfined msg='op=login id=1000 exe="/usr/sbin/sshd" +hostname=192.168.122.1 addr=192.168.122.1 terminal=/dev/pts/1 res=success' + +Fix this by switch the prepending of = to a _. This still works as a +special character to flag this case without breaking audit. Also move +this check behind debug as it should not be needed during normal +operqation. + +Fixes: 26b7899510ae ("apparmor: add support for absolute root view based labels") +Reported-by: Casey Schaufler +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/include/lib.h | 5 +++++ + security/apparmor/label.c | 7 ++++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +--- a/security/apparmor/include/lib.h ++++ b/security/apparmor/include/lib.h +@@ -22,6 +22,11 @@ + */ + + #define DEBUG_ON (aa_g_debug) ++/* ++ * split individual debug cases out in preparation for finer grained ++ * debug controls in the future. ++ */ ++#define AA_DEBUG_LABEL DEBUG_ON + #define dbg_printk(__fmt, __args...) pr_debug(__fmt, ##__args) + #define AA_DEBUG(fmt, args...) \ + do { \ +--- a/security/apparmor/label.c ++++ b/security/apparmor/label.c +@@ -1637,9 +1637,9 @@ int aa_label_snxprint(char *str, size_t + AA_BUG(!str && size != 0); + AA_BUG(!label); + +- if (flags & FLAG_ABS_ROOT) { ++ if (AA_DEBUG_LABEL && (flags & FLAG_ABS_ROOT)) { + ns = root_ns; +- len = snprintf(str, size, "="); ++ len = snprintf(str, size, "_"); + update_for_len(total, len, size, str); + } else if (!ns) { + ns = labels_ns(label); +@@ -1901,7 +1901,8 @@ struct aa_label *aa_label_strn_parse(str + AA_BUG(!str); + + str = skipn_spaces(str, n); +- if (str == NULL || (*str == '=' && base != &root_ns->unconfined->label)) ++ if (str == NULL || (AA_DEBUG_LABEL && *str == '_' && ++ base != &root_ns->unconfined->label)) + return ERR_PTR(-EINVAL); + + len = label_count_strn_entries(str, end - str); diff --git a/queue-5.4/apparmor-fix-failed-mount-permission-check-error-message.patch b/queue-5.4/apparmor-fix-failed-mount-permission-check-error-message.patch new file mode 100644 index 00000000000..d075a7ccbbc --- /dev/null +++ b/queue-5.4/apparmor-fix-failed-mount-permission-check-error-message.patch @@ -0,0 +1,45 @@ +From ec240b5905bbb09a03dccffee03062cf39e38dc2 Mon Sep 17 00:00:00 2001 +From: John Johansen +Date: Tue, 25 Jan 2022 00:37:42 -0800 +Subject: apparmor: Fix failed mount permission check error message + +From: John Johansen + +commit ec240b5905bbb09a03dccffee03062cf39e38dc2 upstream. + +When the mount check fails due to a permission check failure instead +of explicitly at one of the subcomponent checks, AppArmor is reporting +a failure in the flags match. However this is not true and AppArmor +can not attribute the error at this point to any particular component, +and should only indicate the mount failed due to missing permissions. + +Fixes: 2ea3ffb7782a ("apparmor: add mount mediation") +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/mount.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/security/apparmor/mount.c ++++ b/security/apparmor/mount.c +@@ -229,7 +229,8 @@ static const char * const mnt_info_table + "failed srcname match", + "failed type match", + "failed flags match", +- "failed data match" ++ "failed data match", ++ "failed perms check" + }; + + /* +@@ -284,8 +285,8 @@ static int do_match_mnt(struct aa_dfa *d + return 0; + } + +- /* failed at end of flags match */ +- return 4; ++ /* failed at perms check, don't confuse with flags match */ ++ return 6; + } + + diff --git a/queue-5.4/apparmor-fix-memleak-in-aa_simple_write_to_buffer.patch b/queue-5.4/apparmor-fix-memleak-in-aa_simple_write_to_buffer.patch new file mode 100644 index 00000000000..39b88459581 --- /dev/null +++ b/queue-5.4/apparmor-fix-memleak-in-aa_simple_write_to_buffer.patch @@ -0,0 +1,33 @@ +From 417ea9fe972d2654a268ad66e89c8fcae67017c3 Mon Sep 17 00:00:00 2001 +From: Xiu Jianfeng +Date: Tue, 14 Jun 2022 17:00:01 +0800 +Subject: apparmor: Fix memleak in aa_simple_write_to_buffer() + +From: Xiu Jianfeng + +commit 417ea9fe972d2654a268ad66e89c8fcae67017c3 upstream. + +When copy_from_user failed, the memory is freed by kvfree. however the +management struct and data blob are allocated independently, so only +kvfree(data) cause a memleak issue here. Use aa_put_loaddata(data) to +fix this issue. + +Fixes: a6a52579e52b5 ("apparmor: split load data into management struct and data blob") +Signed-off-by: Xiu Jianfeng +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/apparmorfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/security/apparmor/apparmorfs.c ++++ b/security/apparmor/apparmorfs.c +@@ -403,7 +403,7 @@ static struct aa_loaddata *aa_simple_wri + + data->size = copy_size; + if (copy_from_user(data->data, userbuf, copy_size)) { +- kvfree(data); ++ aa_put_loaddata(data); + return ERR_PTR(-EFAULT); + } + diff --git a/queue-5.4/apparmor-fix-overlapping-attachment-computation.patch b/queue-5.4/apparmor-fix-overlapping-attachment-computation.patch new file mode 100644 index 00000000000..7ca1b0d5f90 --- /dev/null +++ b/queue-5.4/apparmor-fix-overlapping-attachment-computation.patch @@ -0,0 +1,46 @@ +From 2504db207146543736e877241f3b3de005cbe056 Mon Sep 17 00:00:00 2001 +From: John Johansen +Date: Sat, 26 Mar 2022 01:58:15 -0700 +Subject: apparmor: fix overlapping attachment computation + +From: John Johansen + +commit 2504db207146543736e877241f3b3de005cbe056 upstream. + +When finding the profile via patterned attachments, the longest left +match is being set to the static compile time value and not using the +runtime computed value. + +Fix this by setting the candidate value to the greater of the +precomputed value or runtime computed value. + +Fixes: 21f606610502 ("apparmor: improve overlapping domain attachment resolution") +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/domain.c | 2 +- + security/apparmor/include/policy.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +--- a/security/apparmor/domain.c ++++ b/security/apparmor/domain.c +@@ -460,7 +460,7 @@ restart: + * xattrs, or a longer match + */ + candidate = profile; +- candidate_len = profile->xmatch_len; ++ candidate_len = max(count, profile->xmatch_len); + candidate_xattrs = ret; + conflict = false; + } +--- a/security/apparmor/include/policy.h ++++ b/security/apparmor/include/policy.h +@@ -135,7 +135,7 @@ struct aa_profile { + + const char *attach; + struct aa_dfa *xmatch; +- int xmatch_len; ++ unsigned int xmatch_len; + enum audit_mode audit; + long mode; + u32 path_flags; diff --git a/queue-5.4/apparmor-fix-quiet_denied-for-file-rules.patch b/queue-5.4/apparmor-fix-quiet_denied-for-file-rules.patch new file mode 100644 index 00000000000..139be069d48 --- /dev/null +++ b/queue-5.4/apparmor-fix-quiet_denied-for-file-rules.patch @@ -0,0 +1,31 @@ +From 68ff8540cc9e4ab557065b3f635c1ff4c96e1f1c Mon Sep 17 00:00:00 2001 +From: John Johansen +Date: Thu, 29 Apr 2021 01:48:28 -0700 +Subject: apparmor: fix quiet_denied for file rules + +From: John Johansen + +commit 68ff8540cc9e4ab557065b3f635c1ff4c96e1f1c upstream. + +Global quieting of denied AppArmor generated file events is not +handled correctly. Unfortunately the is checking if quieting of all +audit events is set instead of just denied events. + +Fixes: 67012e8209df ("AppArmor: basic auditing infrastructure.") +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/audit.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/security/apparmor/audit.c ++++ b/security/apparmor/audit.c +@@ -139,7 +139,7 @@ int aa_audit(int type, struct aa_profile + } + if (AUDIT_MODE(profile) == AUDIT_QUIET || + (type == AUDIT_APPARMOR_DENIED && +- AUDIT_MODE(profile) == AUDIT_QUIET)) ++ AUDIT_MODE(profile) == AUDIT_QUIET_DENIED)) + return aad(sa)->error; + + if (KILL_MODE(profile) && type == AUDIT_APPARMOR_DENIED) diff --git a/queue-5.4/apparmor-fix-reference-count-leak-in-aa_pivotroot.patch b/queue-5.4/apparmor-fix-reference-count-leak-in-aa_pivotroot.patch new file mode 100644 index 00000000000..b42965b2bdc --- /dev/null +++ b/queue-5.4/apparmor-fix-reference-count-leak-in-aa_pivotroot.patch @@ -0,0 +1,41 @@ +From 11c3627ec6b56c1525013f336f41b79a983b4d46 Mon Sep 17 00:00:00 2001 +From: Xin Xiong +Date: Thu, 28 Apr 2022 11:39:08 +0800 +Subject: apparmor: fix reference count leak in aa_pivotroot() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Xin Xiong + +commit 11c3627ec6b56c1525013f336f41b79a983b4d46 upstream. + +The aa_pivotroot() function has a reference counting bug in a specific +path. When aa_replace_current_label() returns on success, the function +forgets to decrement the reference count of “target”, which is +increased earlier by build_pivotroot(), causing a reference leak. + +Fix it by decreasing the refcount of “target” in that path. + +Fixes: 2ea3ffb7782a ("apparmor: add mount mediation") +Co-developed-by: Xiyu Yang +Signed-off-by: Xiyu Yang +Co-developed-by: Xin Tan +Signed-off-by: Xin Tan +Signed-off-by: Xin Xiong +Signed-off-by: John Johansen +Signed-off-by: Greg Kroah-Hartman +--- + security/apparmor/mount.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/security/apparmor/mount.c ++++ b/security/apparmor/mount.c +@@ -683,6 +683,7 @@ int aa_pivotroot(struct aa_label *label, + aa_put_label(target); + goto out; + } ++ aa_put_label(target); + } else + /* already audited error */ + error = PTR_ERR(target); diff --git a/queue-5.4/can-ems_usb-fix-clang-s-wunaligned-access-warning.patch b/queue-5.4/can-ems_usb-fix-clang-s-wunaligned-access-warning.patch new file mode 100644 index 00000000000..a52e8a864d8 --- /dev/null +++ b/queue-5.4/can-ems_usb-fix-clang-s-wunaligned-access-warning.patch @@ -0,0 +1,65 @@ +From a4cb6e62ea4d36e53fb3c0f18ea4503d7b76674f Mon Sep 17 00:00:00 2001 +From: Marc Kleine-Budde +Date: Mon, 1 Aug 2022 22:47:16 +0200 +Subject: can: ems_usb: fix clang's -Wunaligned-access warning + +From: Marc Kleine-Budde + +commit a4cb6e62ea4d36e53fb3c0f18ea4503d7b76674f upstream. + +clang emits a -Wunaligned-access warning on struct __packed +ems_cpc_msg. + +The reason is that the anonymous union msg (not declared as packed) is +being packed right after some non naturally aligned variables (3*8 +bits + 2*32) inside a packed struct: + +| struct __packed ems_cpc_msg { +| u8 type; /* type of message */ +| u8 length; /* length of data within union 'msg' */ +| u8 msgid; /* confirmation handle */ +| __le32 ts_sec; /* timestamp in seconds */ +| __le32 ts_nsec; /* timestamp in nano seconds */ +| /* ^ not naturally aligned */ +| +| union { +| /* ^ not declared as packed */ +| u8 generic[64]; +| struct cpc_can_msg can_msg; +| struct cpc_can_params can_params; +| struct cpc_confirm confirmation; +| struct cpc_overrun overrun; +| struct cpc_can_error error; +| struct cpc_can_err_counter err_counter; +| u8 can_state; +| } msg; +| }; + +Starting from LLVM 14, having an unpacked struct nested in a packed +struct triggers a warning. c.f. [1]. + +Fix the warning by marking the anonymous union as packed. + +[1] https://github.com/llvm/llvm-project/issues/55520 + +Fixes: 702171adeed3 ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface") +Link: https://lore.kernel.org/all/20220802094021.959858-1-mkl@pengutronix.de +Cc: Gerhard Uttenthaler +Cc: Sebastian Haas +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/can/usb/ems_usb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/can/usb/ems_usb.c ++++ b/drivers/net/can/usb/ems_usb.c +@@ -194,7 +194,7 @@ struct __packed ems_cpc_msg { + __le32 ts_sec; /* timestamp in seconds */ + __le32 ts_nsec; /* timestamp in nano seconds */ + +- union { ++ union __packed { + u8 generic[64]; + struct cpc_can_msg can_msg; + struct cpc_can_params can_params; diff --git a/queue-5.4/can-mcp251x-fix-race-condition-on-receive-interrupt.patch b/queue-5.4/can-mcp251x-fix-race-condition-on-receive-interrupt.patch new file mode 100644 index 00000000000..31b7be3a5d6 --- /dev/null +++ b/queue-5.4/can-mcp251x-fix-race-condition-on-receive-interrupt.patch @@ -0,0 +1,88 @@ +From d80d60b0db6ff3dd2e29247cc2a5166d7e9ae37e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sebastian=20W=C3=BCrl?= +Date: Thu, 4 Aug 2022 10:14:11 +0200 +Subject: can: mcp251x: Fix race condition on receive interrupt +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Sebastian Würl + +commit d80d60b0db6ff3dd2e29247cc2a5166d7e9ae37e upstream. + +The mcp251x driver uses both receiving mailboxes of the CAN controller +chips. For retrieving the CAN frames from the controller via SPI, it checks +once per interrupt which mailboxes have been filled and will retrieve the +messages accordingly. + +This introduces a race condition, as another CAN frame can enter mailbox 1 +while mailbox 0 is emptied. If now another CAN frame enters mailbox 0 until +the interrupt handler is called next, mailbox 0 is emptied before +mailbox 1, leading to out-of-order CAN frames in the network device. + +This is fixed by checking the interrupt flags once again after freeing +mailbox 0, to correctly also empty mailbox 1 before leaving the handler. + +For reproducing the bug I created the following setup: + - Two CAN devices, one Raspberry Pi with MCP2515, the other can be any. + - Setup CAN to 1 MHz + - Spam bursts of 5 CAN-messages with increasing CAN-ids + - Continue sending the bursts while sleeping a second between the bursts + - Check on the RPi whether the received messages have increasing CAN-ids + - Without this patch, every burst of messages will contain a flipped pair + +v3: https://lore.kernel.org/all/20220804075914.67569-1-sebastian.wuerl@ororatech.com +v2: https://lore.kernel.org/all/20220804064803.63157-1-sebastian.wuerl@ororatech.com +v1: https://lore.kernel.org/all/20220803153300.58732-1-sebastian.wuerl@ororatech.com + +Fixes: bf66f3736a94 ("can: mcp251x: Move to threaded interrupts instead of workqueues.") +Signed-off-by: Sebastian Würl +Link: https://lore.kernel.org/all/20220804081411.68567-1-sebastian.wuerl@ororatech.com +[mkl: reduce scope of intf1, eflag1] +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/can/spi/mcp251x.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +--- a/drivers/net/can/spi/mcp251x.c ++++ b/drivers/net/can/spi/mcp251x.c +@@ -756,9 +756,6 @@ static irqreturn_t mcp251x_can_ist(int i + + mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); + +- /* mask out flags we don't care about */ +- intf &= CANINTF_RX | CANINTF_TX | CANINTF_ERR; +- + /* receive buffer 0 */ + if (intf & CANINTF_RX0IF) { + mcp251x_hw_rx(spi, 0); +@@ -768,6 +765,18 @@ static irqreturn_t mcp251x_can_ist(int i + if (mcp251x_is_2510(spi)) + mcp251x_write_bits(spi, CANINTF, + CANINTF_RX0IF, 0x00); ++ ++ /* check if buffer 1 is already known to be full, no need to re-read */ ++ if (!(intf & CANINTF_RX1IF)) { ++ u8 intf1, eflag1; ++ ++ /* intf needs to be read again to avoid a race condition */ ++ mcp251x_read_2regs(spi, CANINTF, &intf1, &eflag1); ++ ++ /* combine flags from both operations for error handling */ ++ intf |= intf1; ++ eflag |= eflag1; ++ } + } + + /* receive buffer 1 */ +@@ -778,6 +787,9 @@ static irqreturn_t mcp251x_can_ist(int i + clear_intf |= CANINTF_RX1IF; + } + ++ /* mask out flags we don't care about */ ++ intf &= CANINTF_RX | CANINTF_TX | CANINTF_ERR; ++ + /* any error or tx interrupt we need to clear? */ + if (intf & (CANINTF_ERR | CANINTF_TX)) + clear_intf |= intf & (CANINTF_ERR | CANINTF_TX); diff --git a/queue-5.4/devlink-fix-use-after-free-after-a-failed-reload.patch b/queue-5.4/devlink-fix-use-after-free-after-a-failed-reload.patch new file mode 100644 index 00000000000..070c403c820 --- /dev/null +++ b/queue-5.4/devlink-fix-use-after-free-after-a-failed-reload.patch @@ -0,0 +1,105 @@ +From 6b4db2e528f650c7fb712961aac36455468d5902 Mon Sep 17 00:00:00 2001 +From: Ido Schimmel +Date: Tue, 9 Aug 2022 14:35:06 +0300 +Subject: devlink: Fix use-after-free after a failed reload + +From: Ido Schimmel + +commit 6b4db2e528f650c7fb712961aac36455468d5902 upstream. + +After a failed devlink reload, devlink parameters are still registered, +which means user space can set and get their values. In the case of the +mlxsw "acl_region_rehash_interval" parameter, these operations will +trigger a use-after-free [1]. + +Fix this by rejecting set and get operations while in the failed state. +Return the "-EOPNOTSUPP" error code which does not abort the parameters +dump, but instead causes it to skip over the problematic parameter. + +Another possible fix is to perform these checks in the mlxsw parameter +callbacks, but other drivers might be affected by the same problem and I +am not aware of scenarios where these stricter checks will cause a +regression. + +[1] +mlxsw_spectrum3 0000:00:10.0: Port 125: Failed to register netdev +mlxsw_spectrum3 0000:00:10.0: Failed to create ports + +================================================================== +BUG: KASAN: use-after-free in mlxsw_sp_acl_tcam_vregion_rehash_intrvl_get+0xbd/0xd0 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c:904 +Read of size 4 at addr ffff8880099dcfd8 by task kworker/u4:4/777 + +CPU: 1 PID: 777 Comm: kworker/u4:4 Not tainted 5.19.0-rc7-custom-126601-gfe26f28c586d #1 +Hardware name: QEMU MSN4700, BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 +Workqueue: netns cleanup_net +Call Trace: + + __dump_stack lib/dump_stack.c:88 [inline] + dump_stack_lvl+0x92/0xbd lib/dump_stack.c:106 + print_address_description mm/kasan/report.c:313 [inline] + print_report.cold+0x5e/0x5cf mm/kasan/report.c:429 + kasan_report+0xb9/0xf0 mm/kasan/report.c:491 + __asan_report_load4_noabort+0x14/0x20 mm/kasan/report_generic.c:306 + mlxsw_sp_acl_tcam_vregion_rehash_intrvl_get+0xbd/0xd0 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c:904 + mlxsw_sp_acl_region_rehash_intrvl_get+0x49/0x60 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c:1106 + mlxsw_sp_params_acl_region_rehash_intrvl_get+0x33/0x80 drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3854 + devlink_param_get net/core/devlink.c:4981 [inline] + devlink_nl_param_fill+0x238/0x12d0 net/core/devlink.c:5089 + devlink_param_notify+0xe5/0x230 net/core/devlink.c:5168 + devlink_ns_change_notify net/core/devlink.c:4417 [inline] + devlink_ns_change_notify net/core/devlink.c:4396 [inline] + devlink_reload+0x15f/0x700 net/core/devlink.c:4507 + devlink_pernet_pre_exit+0x112/0x1d0 net/core/devlink.c:12272 + ops_pre_exit_list net/core/net_namespace.c:152 [inline] + cleanup_net+0x494/0xc00 net/core/net_namespace.c:582 + process_one_work+0x9fc/0x1710 kernel/workqueue.c:2289 + worker_thread+0x675/0x10b0 kernel/workqueue.c:2436 + kthread+0x30c/0x3d0 kernel/kthread.c:376 + ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:306 + + +The buggy address belongs to the physical page: +page:ffffea0000267700 refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x99dc +flags: 0x100000000000000(node=0|zone=1) +raw: 0100000000000000 0000000000000000 dead000000000122 0000000000000000 +raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 +page dumped because: kasan: bad access detected + +Memory state around the buggy address: + ffff8880099dce80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff + ffff8880099dcf00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +>ffff8880099dcf80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff + ^ + ffff8880099dd000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff + ffff8880099dd080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +================================================================== + +Fixes: 98bbf70c1c41 ("mlxsw: spectrum: add "acl_region_rehash_interval" devlink param") +Signed-off-by: Ido Schimmel +Reviewed-by: Jiri Pirko +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + net/core/devlink.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/net/core/devlink.c ++++ b/net/core/devlink.c +@@ -2953,7 +2953,7 @@ static int devlink_param_get(struct devl + const struct devlink_param *param, + struct devlink_param_gset_ctx *ctx) + { +- if (!param->get) ++ if (!param->get || devlink->reload_failed) + return -EOPNOTSUPP; + return param->get(devlink, param->id, ctx); + } +@@ -2962,7 +2962,7 @@ static int devlink_param_set(struct devl + const struct devlink_param *param, + struct devlink_param_gset_ctx *ctx) + { +- if (!param->set) ++ if (!param->set || devlink->reload_failed) + return -EOPNOTSUPP; + return param->set(devlink, param->id, ctx); + } diff --git a/queue-5.4/documentation-acpi-einj-fix-obsolete-example.patch b/queue-5.4/documentation-acpi-einj-fix-obsolete-example.patch new file mode 100644 index 00000000000..549691e6de6 --- /dev/null +++ b/queue-5.4/documentation-acpi-einj-fix-obsolete-example.patch @@ -0,0 +1,33 @@ +From 9066e151c37950af92c3be6a7270daa8e8063db9 Mon Sep 17 00:00:00 2001 +From: Qifu Zhang +Date: Tue, 19 Jul 2022 19:50:13 +0800 +Subject: Documentation: ACPI: EINJ: Fix obsolete example + +From: Qifu Zhang + +commit 9066e151c37950af92c3be6a7270daa8e8063db9 upstream. + +Since commit 488dac0c9237 ("libfs: fix error cast of negative value in +simple_attr_write()"), the EINJ debugfs interface no longer accepts +negative values as input. Attempt to do so will result in EINVAL. + +Fixes: 488dac0c9237 ("libfs: fix error cast of negative value in simple_attr_write()") +Signed-off-by: Qifu Zhang +Reviewed-by: Tony Luck +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman +--- + Documentation/firmware-guide/acpi/apei/einj.rst | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/Documentation/firmware-guide/acpi/apei/einj.rst ++++ b/Documentation/firmware-guide/acpi/apei/einj.rst +@@ -168,7 +168,7 @@ An error injection example:: + 0x00000008 Memory Correctable + 0x00000010 Memory Uncorrectable non-fatal + # echo 0x12345000 > param1 # Set memory address for injection +- # echo $((-1 << 12)) > param2 # Mask 0xfffffffffffff000 - anywhere in this page ++ # echo 0xfffffffffffff000 > param2 # Mask - anywhere in this page + # echo 0x8 > error_type # Choose correctable memory error + # echo 1 > error_inject # Inject now + diff --git a/queue-5.4/geneve-do-not-use-rt_tos-for-ipv6-flowlabel.patch b/queue-5.4/geneve-do-not-use-rt_tos-for-ipv6-flowlabel.patch new file mode 100644 index 00000000000..5fd1ebaafaa --- /dev/null +++ b/queue-5.4/geneve-do-not-use-rt_tos-for-ipv6-flowlabel.patch @@ -0,0 +1,42 @@ +From ca2bb69514a8bc7f83914122f0d596371352416c Mon Sep 17 00:00:00 2001 +From: Matthias May +Date: Fri, 5 Aug 2022 21:19:03 +0200 +Subject: geneve: do not use RT_TOS for IPv6 flowlabel + +From: Matthias May + +commit ca2bb69514a8bc7f83914122f0d596371352416c upstream. + +According to Guillaume Nault RT_TOS should never be used for IPv6. + +Quote: +RT_TOS() is an old macro used to interprete IPv4 TOS as described in +the obsolete RFC 1349. It's conceptually wrong to use it even in IPv4 +code, although, given the current state of the code, most of the +existing calls have no consequence. + +But using RT_TOS() in IPv6 code is always a bug: IPv6 never had a "TOS" +field to be interpreted the RFC 1349 way. There's no historical +compatibility to worry about. + +Fixes: 3a56f86f1be6 ("geneve: handle ipv6 priority like ipv4 tos") +Acked-by: Guillaume Nault +Signed-off-by: Matthias May +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/geneve.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/net/geneve.c ++++ b/drivers/net/geneve.c +@@ -851,8 +851,7 @@ static struct dst_entry *geneve_get_v6_d + use_cache = false; + } + +- fl6->flowlabel = ip6_make_flowinfo(RT_TOS(prio), +- info->key.label); ++ fl6->flowlabel = ip6_make_flowinfo(prio, info->key.label); + dst_cache = (struct dst_cache *)&info->dst_cache; + if (use_cache) { + dst = dst_cache_get_ip6(dst_cache, &fl6->saddr); diff --git a/queue-5.4/net-bgmac-fix-a-bug-triggered-by-wrong-bytes_compl.patch b/queue-5.4/net-bgmac-fix-a-bug-triggered-by-wrong-bytes_compl.patch new file mode 100644 index 00000000000..25502b2084c --- /dev/null +++ b/queue-5.4/net-bgmac-fix-a-bug-triggered-by-wrong-bytes_compl.patch @@ -0,0 +1,91 @@ +From 1b7680c6c1f6de9904f1d9b05c952f0c64a03350 Mon Sep 17 00:00:00 2001 +From: Sandor Bodo-Merle +Date: Mon, 8 Aug 2022 19:39:39 +0200 +Subject: net: bgmac: Fix a BUG triggered by wrong bytes_compl + +From: Sandor Bodo-Merle + +commit 1b7680c6c1f6de9904f1d9b05c952f0c64a03350 upstream. + +On one of our machines we got: + +kernel BUG at lib/dynamic_queue_limits.c:27! +Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM +CPU: 0 PID: 1166 Comm: irq/41-bgmac Tainted: G W O 4.14.275-rt132 #1 +Hardware name: BRCM XGS iProc +task: ee3415c0 task.stack: ee32a000 +PC is at dql_completed+0x168/0x178 +LR is at bgmac_poll+0x18c/0x6d8 +pc : [] lr : [] psr: 800a0313 +sp : ee32be14 ip : 000005ea fp : 00000bd4 +r10: ee558500 r9 : c0116298 r8 : 00000002 +r7 : 00000000 r6 : ef128810 r5 : 01993267 r4 : 01993851 +r3 : ee558000 r2 : 000070e1 r1 : 00000bd4 r0 : ee52c180 +Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none +Control: 12c5387d Table: 8e88c04a DAC: 00000051 +Process irq/41-bgmac (pid: 1166, stack limit = 0xee32a210) +Stack: (0xee32be14 to 0xee32c000) +be00: ee558520 ee52c100 ef128810 +be20: 00000000 00000002 c0116298 c04b5a18 00000000 c0a0c8c4 c0951780 00000040 +be40: c0701780 ee558500 ee55d520 ef05b340 ef6f9780 ee558520 00000001 00000040 +be60: ffffe000 c0a56878 ef6fa040 c0952040 0000012c c0528744 ef6f97b0 fffcfb6a +be80: c0a04104 2eda8000 c0a0c4ec c0a0d368 ee32bf44 c0153534 ee32be98 ee32be98 +bea0: ee32bea0 ee32bea0 ee32bea8 ee32bea8 00000000 c01462e4 ffffe000 ef6f22a8 +bec0: ffffe000 00000008 ee32bee4 c0147430 ffffe000 c094a2a8 00000003 ffffe000 +bee0: c0a54528 00208040 0000000c c0a0c8c4 c0a65980 c0124d3c 00000008 ee558520 +bf00: c094a23c c0a02080 00000000 c07a9910 ef136970 ef136970 ee30a440 ef136900 +bf20: ee30a440 00000001 ef136900 ee30a440 c016d990 00000000 c0108db0 c012500c +bf40: ef136900 c016da14 ee30a464 ffffe000 00000001 c016dd14 00000000 c016db28 +bf60: ffffe000 ee21a080 ee30a400 00000000 ee32a000 ee30a440 c016dbfc ee25fd70 +bf80: ee21a09c c013edcc ee32a000 ee30a400 c013ec7c 00000000 00000000 00000000 +bfa0: 00000000 00000000 00000000 c0108470 00000000 00000000 00000000 00000000 +bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 +bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000 +[] (dql_completed) from [] (bgmac_poll+0x18c/0x6d8) +[] (bgmac_poll) from [] (net_rx_action+0x1c4/0x494) +[] (net_rx_action) from [] (do_current_softirqs+0x1ec/0x43c) +[] (do_current_softirqs) from [] (__local_bh_enable+0x80/0x98) +[] (__local_bh_enable) from [] (irq_forced_thread_fn+0x84/0x98) +[] (irq_forced_thread_fn) from [] (irq_thread+0x118/0x1c0) +[] (irq_thread) from [] (kthread+0x150/0x158) +[] (kthread) from [] (ret_from_fork+0x14/0x24) +Code: a83f15e0 0200001a 0630a0e1 c3ffffea (f201f0e7) + +The issue seems similar to commit 90b3b339364c ("net: hisilicon: Fix a BUG +trigered by wrong bytes_compl") and potentially introduced by commit +b38c83dd0866 ("bgmac: simplify tx ring index handling"). + +If there is an RX interrupt between setting ring->end +and netdev_sent_queue() we can hit the BUG_ON as bgmac_dma_tx_free() +can miscalculate the queue size while called from bgmac_poll(). + +The machine which triggered the BUG runs a v4.14 RT kernel - but the issue +seems present in mainline too. + +Fixes: b38c83dd0866 ("bgmac: simplify tx ring index handling") +Signed-off-by: Sandor Bodo-Merle +Reviewed-by: Florian Fainelli +Link: https://lore.kernel.org/r/20220808173939.193804-1-sbodomerle@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/broadcom/bgmac.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c +index 2dfc1e32bbb3..93580484a3f4 100644 +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -189,8 +189,8 @@ static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac, + } + + slot->skb = skb; +- ring->end += nr_frags + 1; + netdev_sent_queue(net_dev, skb->len); ++ ring->end += nr_frags + 1; + + wmb(); + +-- +2.37.2 + diff --git a/queue-5.4/nfsv4-fix-races-in-the-legacy-idmapper-upcall.patch b/queue-5.4/nfsv4-fix-races-in-the-legacy-idmapper-upcall.patch new file mode 100644 index 00000000000..7b75814d3f5 --- /dev/null +++ b/queue-5.4/nfsv4-fix-races-in-the-legacy-idmapper-upcall.patch @@ -0,0 +1,138 @@ +From 51fd2eb52c0ca8275a906eed81878ef50ae94eb0 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Wed, 13 Jul 2022 17:46:52 -0400 +Subject: NFSv4: Fix races in the legacy idmapper upcall + +From: Trond Myklebust + +commit 51fd2eb52c0ca8275a906eed81878ef50ae94eb0 upstream. + +nfs_idmap_instantiate() will cause the process that is waiting in +request_key_with_auxdata() to wake up and exit. If there is a second +process waiting for the idmap->idmap_mutex, then it may wake up and +start a new call to request_key_with_auxdata(). If the call to +idmap_pipe_downcall() from the first process has not yet finished +calling nfs_idmap_complete_pipe_upcall_locked(), then we may end up +triggering the WARN_ON_ONCE() in nfs_idmap_prepare_pipe_upcall(). + +The fix is to ensure that we clear idmap->idmap_upcall_data before +calling nfs_idmap_instantiate(). + +Fixes: e9ab41b620e4 ("NFSv4: Clean up the legacy idmapper upcall") +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfs/nfs4idmap.c | 46 ++++++++++++++++++++++++---------------------- + 1 file changed, 24 insertions(+), 22 deletions(-) + +--- a/fs/nfs/nfs4idmap.c ++++ b/fs/nfs/nfs4idmap.c +@@ -560,22 +560,20 @@ nfs_idmap_prepare_pipe_upcall(struct idm + return true; + } + +-static void +-nfs_idmap_complete_pipe_upcall_locked(struct idmap *idmap, int ret) ++static void nfs_idmap_complete_pipe_upcall(struct idmap_legacy_upcalldata *data, ++ int ret) + { +- struct key *authkey = idmap->idmap_upcall_data->authkey; +- +- kfree(idmap->idmap_upcall_data); +- idmap->idmap_upcall_data = NULL; +- complete_request_key(authkey, ret); +- key_put(authkey); ++ complete_request_key(data->authkey, ret); ++ key_put(data->authkey); ++ kfree(data); + } + +-static void +-nfs_idmap_abort_pipe_upcall(struct idmap *idmap, int ret) ++static void nfs_idmap_abort_pipe_upcall(struct idmap *idmap, ++ struct idmap_legacy_upcalldata *data, ++ int ret) + { +- if (idmap->idmap_upcall_data != NULL) +- nfs_idmap_complete_pipe_upcall_locked(idmap, ret); ++ if (cmpxchg(&idmap->idmap_upcall_data, data, NULL) == data) ++ nfs_idmap_complete_pipe_upcall(data, ret); + } + + static int nfs_idmap_legacy_upcall(struct key *authkey, void *aux) +@@ -612,7 +610,7 @@ static int nfs_idmap_legacy_upcall(struc + + ret = rpc_queue_upcall(idmap->idmap_pipe, msg); + if (ret < 0) +- nfs_idmap_abort_pipe_upcall(idmap, ret); ++ nfs_idmap_abort_pipe_upcall(idmap, data, ret); + + return ret; + out2: +@@ -668,6 +666,7 @@ idmap_pipe_downcall(struct file *filp, c + struct request_key_auth *rka; + struct rpc_inode *rpci = RPC_I(file_inode(filp)); + struct idmap *idmap = (struct idmap *)rpci->private; ++ struct idmap_legacy_upcalldata *data; + struct key *authkey; + struct idmap_msg im; + size_t namelen_in; +@@ -677,10 +676,11 @@ idmap_pipe_downcall(struct file *filp, c + * will have been woken up and someone else may now have used + * idmap_key_cons - so after this point we may no longer touch it. + */ +- if (idmap->idmap_upcall_data == NULL) ++ data = xchg(&idmap->idmap_upcall_data, NULL); ++ if (data == NULL) + goto out_noupcall; + +- authkey = idmap->idmap_upcall_data->authkey; ++ authkey = data->authkey; + rka = get_request_key_auth(authkey); + + if (mlen != sizeof(im)) { +@@ -702,18 +702,17 @@ idmap_pipe_downcall(struct file *filp, c + if (namelen_in == 0 || namelen_in == IDMAP_NAMESZ) { + ret = -EINVAL; + goto out; +-} ++ } + +- ret = nfs_idmap_read_and_verify_message(&im, +- &idmap->idmap_upcall_data->idmap_msg, +- rka->target_key, authkey); ++ ret = nfs_idmap_read_and_verify_message(&im, &data->idmap_msg, ++ rka->target_key, authkey); + if (ret >= 0) { + key_set_timeout(rka->target_key, nfs_idmap_cache_timeout); + ret = mlen; + } + + out: +- nfs_idmap_complete_pipe_upcall_locked(idmap, ret); ++ nfs_idmap_complete_pipe_upcall(data, ret); + out_noupcall: + return ret; + } +@@ -727,7 +726,7 @@ idmap_pipe_destroy_msg(struct rpc_pipe_m + struct idmap *idmap = data->idmap; + + if (msg->errno) +- nfs_idmap_abort_pipe_upcall(idmap, msg->errno); ++ nfs_idmap_abort_pipe_upcall(idmap, data, msg->errno); + } + + static void +@@ -735,8 +734,11 @@ idmap_release_pipe(struct inode *inode) + { + struct rpc_inode *rpci = RPC_I(inode); + struct idmap *idmap = (struct idmap *)rpci->private; ++ struct idmap_legacy_upcalldata *data; + +- nfs_idmap_abort_pipe_upcall(idmap, -EPIPE); ++ data = xchg(&idmap->idmap_upcall_data, NULL); ++ if (data) ++ nfs_idmap_complete_pipe_upcall(data, -EPIPE); + } + + int nfs_map_name_to_uid(const struct nfs_server *server, const char *name, size_t namelen, kuid_t *uid) diff --git a/queue-5.4/nfsv4-pnfs-fix-a-use-after-free-bug-in-open.patch b/queue-5.4/nfsv4-pnfs-fix-a-use-after-free-bug-in-open.patch new file mode 100644 index 00000000000..30f5598b15c --- /dev/null +++ b/queue-5.4/nfsv4-pnfs-fix-a-use-after-free-bug-in-open.patch @@ -0,0 +1,41 @@ +From 2135e5d56278ffdb1c2e6d325dc6b87f669b9dac Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Tue, 2 Aug 2022 15:48:50 -0400 +Subject: NFSv4/pnfs: Fix a use-after-free bug in open + +From: Trond Myklebust + +commit 2135e5d56278ffdb1c2e6d325dc6b87f669b9dac upstream. + +If someone cancels the open RPC call, then we must not try to free +either the open slot or the layoutget operation arguments, since they +are likely still in use by the hung RPC call. + +Fixes: 6949493884fe ("NFSv4: Don't hold the layoutget locks across multiple RPC calls") +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfs/nfs4proc.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -3039,12 +3039,13 @@ static int _nfs4_open_and_get_state(stru + } + + out: +- if (opendata->lgp) { +- nfs4_lgopen_release(opendata->lgp); +- opendata->lgp = NULL; +- } +- if (!opendata->cancelled) ++ if (!opendata->cancelled) { ++ if (opendata->lgp) { ++ nfs4_lgopen_release(opendata->lgp); ++ opendata->lgp = NULL; ++ } + nfs4_sequence_free_slot(&opendata->o_res.seq_res); ++ } + return ret; + } + diff --git a/queue-5.4/nfsv4.1-don-t-decrease-the-value-of-seq_nr_highest_sent.patch b/queue-5.4/nfsv4.1-don-t-decrease-the-value-of-seq_nr_highest_sent.patch new file mode 100644 index 00000000000..92c98dbf097 --- /dev/null +++ b/queue-5.4/nfsv4.1-don-t-decrease-the-value-of-seq_nr_highest_sent.patch @@ -0,0 +1,36 @@ +From f07a5d2427fc113dc50c5c818eba8929bc27b8ca Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Tue, 12 Jul 2022 09:16:04 -0400 +Subject: NFSv4.1: Don't decrease the value of seq_nr_highest_sent + +From: Trond Myklebust + +commit f07a5d2427fc113dc50c5c818eba8929bc27b8ca upstream. + +When we're trying to figure out what the server may or may not have seen +in terms of request numbers, do not assume that requests with a larger +number were missed, just because we saw a reply to a request with a +smaller number. + +Fixes: 3453d5708b33 ("NFSv4.1: Avoid false retries when RPC calls are interrupted") +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfs/nfs4proc.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -779,10 +779,9 @@ static void nfs4_slot_sequence_record_se + if ((s32)(seqnr - slot->seq_nr_highest_sent) > 0) + slot->seq_nr_highest_sent = seqnr; + } +-static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, +- u32 seqnr) ++static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, u32 seqnr) + { +- slot->seq_nr_highest_sent = seqnr; ++ nfs4_slot_sequence_record_sent(slot, seqnr); + slot->seq_nr_last_acked = seqnr; + } + diff --git a/queue-5.4/nfsv4.1-handle-nfs4err_delay-replies-to-op_sequence-correctly.patch b/queue-5.4/nfsv4.1-handle-nfs4err_delay-replies-to-op_sequence-correctly.patch new file mode 100644 index 00000000000..f62c9d0889e --- /dev/null +++ b/queue-5.4/nfsv4.1-handle-nfs4err_delay-replies-to-op_sequence-correctly.patch @@ -0,0 +1,29 @@ +From 7ccafd4b2b9f34e6d8185f796f151c47424e273e Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Tue, 12 Jul 2022 09:22:40 -0400 +Subject: NFSv4.1: Handle NFS4ERR_DELAY replies to OP_SEQUENCE correctly + +From: Trond Myklebust + +commit 7ccafd4b2b9f34e6d8185f796f151c47424e273e upstream. + +Don't assume that the NFS4ERR_DELAY means that the server is processing +this slot id. + +Fixes: 3453d5708b33 ("NFSv4.1: Avoid false retries when RPC calls are interrupted") +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfs/nfs4proc.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -848,7 +848,6 @@ static int nfs41_sequence_process(struct + __func__, + slot->slot_nr, + slot->seq_nr); +- nfs4_slot_sequence_acked(slot, slot->seq_nr); + goto out_retry; + case -NFS4ERR_RETRY_UNCACHED_REP: + case -NFS4ERR_SEQ_FALSE_RETRY: diff --git a/queue-5.4/nfsv4.1-reclaim_complete-must-handle-eacces.patch b/queue-5.4/nfsv4.1-reclaim_complete-must-handle-eacces.patch new file mode 100644 index 00000000000..116197e10b6 --- /dev/null +++ b/queue-5.4/nfsv4.1-reclaim_complete-must-handle-eacces.patch @@ -0,0 +1,38 @@ +From e35a5e782f67ed76a65ad0f23a484444a95f000f Mon Sep 17 00:00:00 2001 +From: Zhang Xianwei +Date: Wed, 27 Jul 2022 18:01:07 +0800 +Subject: NFSv4.1: RECLAIM_COMPLETE must handle EACCES + +From: Zhang Xianwei + +commit e35a5e782f67ed76a65ad0f23a484444a95f000f upstream. + +A client should be able to handle getting an EACCES error while doing +a mount operation to reclaim state due to NFS4CLNT_RECLAIM_REBOOT +being set. If the server returns RPC_AUTH_BADCRED because authentication +failed when we execute "exportfs -au", then RECLAIM_COMPLETE will go a +wrong way. After mount succeeds, all OPEN call will fail due to an +NFS4ERR_GRACE error being returned. This patch is to fix it by resending +a RPC request. + +Signed-off-by: Zhang Xianwei +Signed-off-by: Yi Wang +Fixes: aa5190d0ed7d ("NFSv4: Kill nfs4_async_handle_error() abuses by NFSv4.1") +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfs/nfs4proc.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -8986,6 +8986,9 @@ static int nfs41_reclaim_complete_handle + rpc_delay(task, NFS4_POLL_RETRY_MAX); + /* fall through */ + case -NFS4ERR_RETRY_UNCACHED_REP: ++ case -EACCES: ++ dprintk("%s: failed to reclaim complete error %d for server %s, retrying\n", ++ __func__, task->tk_status, clp->cl_hostname); + return -EAGAIN; + case -NFS4ERR_BADSESSION: + case -NFS4ERR_DEADSESSION: diff --git a/queue-5.4/pinctrl-nomadik-fix-refcount-leak-in-nmk_pinctrl_dt_subnode_to_map.patch b/queue-5.4/pinctrl-nomadik-fix-refcount-leak-in-nmk_pinctrl_dt_subnode_to_map.patch new file mode 100644 index 00000000000..fa0c054ba02 --- /dev/null +++ b/queue-5.4/pinctrl-nomadik-fix-refcount-leak-in-nmk_pinctrl_dt_subnode_to_map.patch @@ -0,0 +1,36 @@ +From 4b32e054335ea0ce50967f63a7bfd4db058b14b9 Mon Sep 17 00:00:00 2001 +From: Miaoqian Lin +Date: Tue, 7 Jun 2022 15:16:01 +0400 +Subject: pinctrl: nomadik: Fix refcount leak in nmk_pinctrl_dt_subnode_to_map + +From: Miaoqian Lin + +commit 4b32e054335ea0ce50967f63a7bfd4db058b14b9 upstream. + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak." + +Fixes: c2f6d059abfc ("pinctrl: nomadik: refactor DT parser to take two paths") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220607111602.57355-1-linmq006@gmail.com +Signed-off-by: Linus Walleij +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pinctrl/nomadik/pinctrl-nomadik.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/pinctrl/nomadik/pinctrl-nomadik.c ++++ b/drivers/pinctrl/nomadik/pinctrl-nomadik.c +@@ -1461,8 +1461,10 @@ static int nmk_pinctrl_dt_subnode_to_map + + has_config = nmk_pinctrl_dt_get_config(np, &configs); + np_config = of_parse_phandle(np, "ste,config", 0); +- if (np_config) ++ if (np_config) { + has_config |= nmk_pinctrl_dt_get_config(np_config, &configs); ++ of_node_put(np_config); ++ } + if (has_config) { + const char *gpio_name; + const char *pin; diff --git a/queue-5.4/pinctrl-qcom-msm8916-allow-camss-gp-clocks-to-be-muxed.patch b/queue-5.4/pinctrl-qcom-msm8916-allow-camss-gp-clocks-to-be-muxed.patch new file mode 100644 index 00000000000..d1360376d48 --- /dev/null +++ b/queue-5.4/pinctrl-qcom-msm8916-allow-camss-gp-clocks-to-be-muxed.patch @@ -0,0 +1,37 @@ +From 44339391c666e46cba522d19c65a6ad1071c68b7 Mon Sep 17 00:00:00 2001 +From: Nikita Travkin +Date: Sun, 12 Jun 2022 19:59:54 +0500 +Subject: pinctrl: qcom: msm8916: Allow CAMSS GP clocks to be muxed + +From: Nikita Travkin + +commit 44339391c666e46cba522d19c65a6ad1071c68b7 upstream. + +GPIO 31, 32 can be muxed to GCC_CAMSS_GP(1,2)_CLK respectively but the +function was never assigned to the pingroup (even though the function +exists already). + +Add this mode to the related pins. + +Fixes: 5373a2c5abb6 ("pinctrl: qcom: Add msm8916 pinctrl driver") +Signed-off-by: Nikita Travkin +Link: https://lore.kernel.org/r/20220612145955.385787-4-nikita@trvn.ru +Signed-off-by: Linus Walleij +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pinctrl/qcom/pinctrl-msm8916.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/pinctrl/qcom/pinctrl-msm8916.c ++++ b/drivers/pinctrl/qcom/pinctrl-msm8916.c +@@ -844,8 +844,8 @@ static const struct msm_pingroup msm8916 + PINGROUP(28, pwr_modem_enabled_a, NA, NA, NA, NA, NA, qdss_tracedata_b, NA, atest_combodac), + PINGROUP(29, cci_i2c, NA, NA, NA, NA, NA, qdss_tracedata_b, NA, atest_combodac), + PINGROUP(30, cci_i2c, NA, NA, NA, NA, NA, NA, NA, qdss_tracedata_b), +- PINGROUP(31, cci_timer0, NA, NA, NA, NA, NA, NA, NA, NA), +- PINGROUP(32, cci_timer1, NA, NA, NA, NA, NA, NA, NA, NA), ++ PINGROUP(31, cci_timer0, flash_strobe, NA, NA, NA, NA, NA, NA, NA), ++ PINGROUP(32, cci_timer1, flash_strobe, NA, NA, NA, NA, NA, NA, NA), + PINGROUP(33, cci_async, NA, NA, NA, NA, NA, NA, NA, qdss_tracedata_b), + PINGROUP(34, pwr_nav_enabled_a, NA, NA, NA, NA, NA, NA, NA, qdss_tracedata_b), + PINGROUP(35, pwr_crypto_enabled_a, NA, NA, NA, NA, NA, NA, NA, qdss_tracedata_b), diff --git a/queue-5.4/pinctrl-sunxi-add-i-o-bias-setting-for-h6-r-pio.patch b/queue-5.4/pinctrl-sunxi-add-i-o-bias-setting-for-h6-r-pio.patch new file mode 100644 index 00000000000..a17f860ca8b --- /dev/null +++ b/queue-5.4/pinctrl-sunxi-add-i-o-bias-setting-for-h6-r-pio.patch @@ -0,0 +1,67 @@ +From fc153c8f283bf5925615195fc9d4056414d7b168 Mon Sep 17 00:00:00 2001 +From: Samuel Holland +Date: Tue, 12 Jul 2022 21:52:29 -0500 +Subject: pinctrl: sunxi: Add I/O bias setting for H6 R-PIO + +From: Samuel Holland + +commit fc153c8f283bf5925615195fc9d4056414d7b168 upstream. + +H6 requires I/O bias configuration on both of its PIO devices. +Previously it was only done for the main PIO. + +The setting for Port L is at bit 0, so the bank calculation needs to +account for the pin base. Otherwise the wrong bit is used. + +Fixes: cc62383fcebe ("pinctrl: sunxi: Support I/O bias voltage setting on H6") +Reviewed-by: Jernej Skrabec +Tested-by: Heiko Stuebner +Signed-off-by: Samuel Holland +Link: https://lore.kernel.org/r/20220713025233.27248-3-samuel@sholland.org +Signed-off-by: Linus Walleij +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c | 1 + + drivers/pinctrl/sunxi/pinctrl-sunxi.c | 7 ++++--- + 2 files changed, 5 insertions(+), 3 deletions(-) + +--- a/drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c +@@ -105,6 +105,7 @@ static const struct sunxi_pinctrl_desc s + .npins = ARRAY_SIZE(sun50i_h6_r_pins), + .pin_base = PL_BASE, + .irq_banks = 2, ++ .io_bias_cfg_variant = BIAS_VOLTAGE_PIO_POW_MODE_SEL, + }; + + static int sun50i_h6_r_pinctrl_probe(struct platform_device *pdev) +--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +@@ -616,7 +616,7 @@ static int sunxi_pinctrl_set_io_bias_cfg + unsigned pin, + struct regulator *supply) + { +- unsigned short bank = pin / PINS_PER_BANK; ++ unsigned short bank; + unsigned long flags; + u32 val, reg; + int uV; +@@ -632,6 +632,9 @@ static int sunxi_pinctrl_set_io_bias_cfg + if (uV == 0) + return 0; + ++ pin -= pctl->desc->pin_base; ++ bank = pin / PINS_PER_BANK; ++ + switch (pctl->desc->io_bias_cfg_variant) { + case BIAS_VOLTAGE_GRP_CONFIG: + /* +@@ -649,8 +652,6 @@ static int sunxi_pinctrl_set_io_bias_cfg + else + val = 0xD; /* 3.3V */ + +- pin -= pctl->desc->pin_base; +- + reg = readl(pctl->membase + sunxi_grp_config_reg(pin)); + reg &= ~IO_BIAS_MASK; + writel(reg | val, pctl->membase + sunxi_grp_config_reg(pin)); diff --git a/queue-5.4/plip-avoid-rcu-debug-splat.patch b/queue-5.4/plip-avoid-rcu-debug-splat.patch new file mode 100644 index 00000000000..efb822266db --- /dev/null +++ b/queue-5.4/plip-avoid-rcu-debug-splat.patch @@ -0,0 +1,36 @@ +From bc3c8fe3c79bcdae4d90e3726054fac5cca8ac32 Mon Sep 17 00:00:00 2001 +From: Florian Westphal +Date: Sun, 7 Aug 2022 13:53:04 +0200 +Subject: plip: avoid rcu debug splat + +From: Florian Westphal + +commit bc3c8fe3c79bcdae4d90e3726054fac5cca8ac32 upstream. + +WARNING: suspicious RCU usage +5.2.0-rc2-00605-g2638eb8b50cfc #1 Not tainted +drivers/net/plip/plip.c:1110 suspicious rcu_dereference_check() usage! + +plip_open is called with RTNL held, switch to the correct helper. + +Fixes: 2638eb8b50cf ("net: ipv4: provide __rcu annotation for ifa_list") +Reported-by: kernel test robot +Signed-off-by: Florian Westphal +Link: https://lore.kernel.org/r/20220807115304.13257-1-fw@strlen.de +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/plip/plip.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/plip/plip.c ++++ b/drivers/net/plip/plip.c +@@ -1103,7 +1103,7 @@ plip_open(struct net_device *dev) + /* Any address will do - we take the first. We already + have the first two bytes filled with 0xfc, from + plip_init_dev(). */ +- const struct in_ifaddr *ifa = rcu_dereference(in_dev->ifa_list); ++ const struct in_ifaddr *ifa = rtnl_dereference(in_dev->ifa_list); + if (ifa != NULL) { + memcpy(dev->dev_addr+2, &ifa->ifa_local, 4); + } diff --git a/queue-5.4/series b/queue-5.4/series index b26a5c144f0..8a7a5e5b7c4 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -291,3 +291,30 @@ mmc-pxamci-fix-another-error-handling-path-in-pxamci_probe.patch mmc-pxamci-fix-an-error-handling-path-in-pxamci_probe.patch btrfs-fix-lost-error-handling-when-looking-up-extended-ref-on-log-replay.patch tracing-have-filter-accept-common_cpu-to-be-consistent.patch +can-ems_usb-fix-clang-s-wunaligned-access-warning.patch +apparmor-fix-quiet_denied-for-file-rules.patch +apparmor-fix-absroot-causing-audited-secids-to-begin-with.patch +apparmor-fix-failed-mount-permission-check-error-message.patch +apparmor-fix-aa_label_asxprint-return-check.patch +apparmor-fix-overlapping-attachment-computation.patch +apparmor-fix-reference-count-leak-in-aa_pivotroot.patch +apparmor-fix-memleak-in-aa_simple_write_to_buffer.patch +documentation-acpi-einj-fix-obsolete-example.patch +nfsv4.1-don-t-decrease-the-value-of-seq_nr_highest_sent.patch +nfsv4.1-handle-nfs4err_delay-replies-to-op_sequence-correctly.patch +nfsv4-fix-races-in-the-legacy-idmapper-upcall.patch +nfsv4.1-reclaim_complete-must-handle-eacces.patch +nfsv4-pnfs-fix-a-use-after-free-bug-in-open.patch +can-mcp251x-fix-race-condition-on-receive-interrupt.patch +sunrpc-fix-expiry-of-auth-creds.patch +sunrpc-reinitialise-the-backchannel-request-buffers-before-reuse.patch +devlink-fix-use-after-free-after-a-failed-reload.patch +net-bgmac-fix-a-bug-triggered-by-wrong-bytes_compl.patch +pinctrl-nomadik-fix-refcount-leak-in-nmk_pinctrl_dt_subnode_to_map.patch +pinctrl-qcom-msm8916-allow-camss-gp-clocks-to-be-muxed.patch +pinctrl-sunxi-add-i-o-bias-setting-for-h6-r-pio.patch +acpi-property-return-type-of-acpi_add_nondev_subnodes-should-be-bool.patch +geneve-do-not-use-rt_tos-for-ipv6-flowlabel.patch +plip-avoid-rcu-debug-splat.patch +vsock-fix-memory-leak-in-vsock_connect.patch +vsock-set-socket-state-back-to-ss_unconnected-in-vsock_connect_timeout.patch diff --git a/queue-5.4/sunrpc-fix-expiry-of-auth-creds.patch b/queue-5.4/sunrpc-fix-expiry-of-auth-creds.patch new file mode 100644 index 00000000000..a90c52aadfa --- /dev/null +++ b/queue-5.4/sunrpc-fix-expiry-of-auth-creds.patch @@ -0,0 +1,32 @@ +From f1bafa7375c01ff71fb7cb97c06caadfcfe815f3 Mon Sep 17 00:00:00 2001 +From: Dan Aloni +Date: Mon, 4 Jul 2022 15:56:57 +0300 +Subject: sunrpc: fix expiry of auth creds + +From: Dan Aloni + +commit f1bafa7375c01ff71fb7cb97c06caadfcfe815f3 upstream. + +Before this commit, with a large enough LRU of expired items (100), the +loop skipped all the expired items and was entirely ineffectual in +trimming the LRU list. + +Fixes: 95cd623250ad ('SUNRPC: Clean up the AUTH cache code') +Signed-off-by: Dan Aloni +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + net/sunrpc/auth.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/sunrpc/auth.c ++++ b/net/sunrpc/auth.c +@@ -494,7 +494,7 @@ rpcauth_prune_expired(struct list_head * + * Enforce a 60 second garbage collection moratorium + * Note that the cred_unused list must be time-ordered. + */ +- if (!time_in_range(cred->cr_expire, expired, jiffies)) ++ if (time_in_range(cred->cr_expire, expired, jiffies)) + continue; + if (!rpcauth_unhash_cred(cred)) + continue; diff --git a/queue-5.4/sunrpc-reinitialise-the-backchannel-request-buffers-before-reuse.patch b/queue-5.4/sunrpc-reinitialise-the-backchannel-request-buffers-before-reuse.patch new file mode 100644 index 00000000000..aaf33a3033f --- /dev/null +++ b/queue-5.4/sunrpc-reinitialise-the-backchannel-request-buffers-before-reuse.patch @@ -0,0 +1,50 @@ +From 6622e3a73112fc336c1c2c582428fb5ef18e456a Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Wed, 27 Jul 2022 12:27:54 -0400 +Subject: SUNRPC: Reinitialise the backchannel request buffers before reuse + +From: Trond Myklebust + +commit 6622e3a73112fc336c1c2c582428fb5ef18e456a upstream. + +When we're reusing the backchannel requests instead of freeing them, +then we should reinitialise any values of the send/receive xdr_bufs so +that they reflect the available space. + +Fixes: 0d2a970d0ae5 ("SUNRPC: Fix a backchannel race") +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + net/sunrpc/backchannel_rqst.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/net/sunrpc/backchannel_rqst.c ++++ b/net/sunrpc/backchannel_rqst.c +@@ -64,6 +64,17 @@ static void xprt_free_allocation(struct + kfree(req); + } + ++static void xprt_bc_reinit_xdr_buf(struct xdr_buf *buf) ++{ ++ buf->head[0].iov_len = PAGE_SIZE; ++ buf->tail[0].iov_len = 0; ++ buf->pages = NULL; ++ buf->page_len = 0; ++ buf->flags = 0; ++ buf->len = 0; ++ buf->buflen = PAGE_SIZE; ++} ++ + static int xprt_alloc_xdr_buf(struct xdr_buf *buf, gfp_t gfp_flags) + { + struct page *page; +@@ -292,6 +303,9 @@ void xprt_free_bc_rqst(struct rpc_rqst * + */ + spin_lock_bh(&xprt->bc_pa_lock); + if (xprt_need_to_requeue(xprt)) { ++ xprt_bc_reinit_xdr_buf(&req->rq_snd_buf); ++ xprt_bc_reinit_xdr_buf(&req->rq_rcv_buf); ++ req->rq_rcv_buf.len = PAGE_SIZE; + list_add_tail(&req->rq_bc_pa_list, &xprt->bc_pa_list); + xprt->bc_alloc_count++; + atomic_inc(&xprt->bc_slot_count); diff --git a/queue-5.4/vsock-fix-memory-leak-in-vsock_connect.patch b/queue-5.4/vsock-fix-memory-leak-in-vsock_connect.patch new file mode 100644 index 00000000000..c54e51006bb --- /dev/null +++ b/queue-5.4/vsock-fix-memory-leak-in-vsock_connect.patch @@ -0,0 +1,83 @@ +From 7e97cfed9929eaabc41829c395eb0d1350fccb9d Mon Sep 17 00:00:00 2001 +From: Peilin Ye +Date: Mon, 8 Aug 2022 11:04:47 -0700 +Subject: vsock: Fix memory leak in vsock_connect() + +From: Peilin Ye + +commit 7e97cfed9929eaabc41829c395eb0d1350fccb9d upstream. + +An O_NONBLOCK vsock_connect() request may try to reschedule +@connect_work. Imagine the following sequence of vsock_connect() +requests: + + 1. The 1st, non-blocking request schedules @connect_work, which will + expire after 200 jiffies. Socket state is now SS_CONNECTING; + + 2. Later, the 2nd, blocking request gets interrupted by a signal after + a few jiffies while waiting for the connection to be established. + Socket state is back to SS_UNCONNECTED, but @connect_work is still + pending, and will expire after 100 jiffies. + + 3. Now, the 3rd, non-blocking request tries to schedule @connect_work + again. Since @connect_work is already scheduled, + schedule_delayed_work() silently returns. sock_hold() is called + twice, but sock_put() will only be called once in + vsock_connect_timeout(), causing a memory leak reported by syzbot: + + BUG: memory leak + unreferenced object 0xffff88810ea56a40 (size 1232): + comm "syz-executor756", pid 3604, jiffies 4294947681 (age 12.350s) + hex dump (first 32 bytes): + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 28 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00 (..@............ + backtrace: + [] sk_prot_alloc+0x3e/0x1b0 net/core/sock.c:1930 + [] sk_alloc+0x32/0x2e0 net/core/sock.c:1989 + [] __vsock_create.constprop.0+0x38/0x320 net/vmw_vsock/af_vsock.c:734 + [] vsock_create+0xc1/0x2d0 net/vmw_vsock/af_vsock.c:2203 + [] __sock_create+0x1ab/0x2b0 net/socket.c:1468 + [] sock_create net/socket.c:1519 [inline] + [] __sys_socket+0x6f/0x140 net/socket.c:1561 + [] __do_sys_socket net/socket.c:1570 [inline] + [] __se_sys_socket net/socket.c:1568 [inline] + [] __x64_sys_socket+0x1a/0x20 net/socket.c:1568 + [] do_syscall_x64 arch/x86/entry/common.c:50 [inline] + [] do_syscall_64+0x35/0x80 arch/x86/entry/common.c:80 + [] entry_SYSCALL_64_after_hwframe+0x44/0xae + <...> + +Use mod_delayed_work() instead: if @connect_work is already scheduled, +reschedule it, and undo sock_hold() to keep the reference count +balanced. + +Reported-and-tested-by: syzbot+b03f55bf128f9a38f064@syzkaller.appspotmail.com +Fixes: d021c344051a ("VSOCK: Introduce VM Sockets") +Co-developed-by: Stefano Garzarella +Signed-off-by: Stefano Garzarella +Reviewed-by: Stefano Garzarella +Signed-off-by: Peilin Ye +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + net/vmw_vsock/af_vsock.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/net/vmw_vsock/af_vsock.c ++++ b/net/vmw_vsock/af_vsock.c +@@ -1207,7 +1207,14 @@ static int vsock_stream_connect(struct s + * timeout fires. + */ + sock_hold(sk); +- schedule_delayed_work(&vsk->connect_work, timeout); ++ ++ /* If the timeout function is already scheduled, ++ * reschedule it, then ungrab the socket refcount to ++ * keep it balanced. ++ */ ++ if (mod_delayed_work(system_wq, &vsk->connect_work, ++ timeout)) ++ sock_put(sk); + + /* Skip ahead to preserve error code set above. */ + goto out_wait; diff --git a/queue-5.4/vsock-set-socket-state-back-to-ss_unconnected-in-vsock_connect_timeout.patch b/queue-5.4/vsock-set-socket-state-back-to-ss_unconnected-in-vsock_connect_timeout.patch new file mode 100644 index 00000000000..f91bc485678 --- /dev/null +++ b/queue-5.4/vsock-set-socket-state-back-to-ss_unconnected-in-vsock_connect_timeout.patch @@ -0,0 +1,41 @@ +From a3e7b29e30854ed67be0d17687e744ad0c769c4b Mon Sep 17 00:00:00 2001 +From: Peilin Ye +Date: Mon, 8 Aug 2022 11:05:25 -0700 +Subject: vsock: Set socket state back to SS_UNCONNECTED in vsock_connect_timeout() + +From: Peilin Ye + +commit a3e7b29e30854ed67be0d17687e744ad0c769c4b upstream. + +Imagine two non-blocking vsock_connect() requests on the same socket. +The first request schedules @connect_work, and after it times out, +vsock_connect_timeout() sets *sock* state back to TCP_CLOSE, but keeps +*socket* state as SS_CONNECTING. + +Later, the second request returns -EALREADY, meaning the socket "already +has a pending connection in progress", even though the first request has +already timed out. + +As suggested by Stefano, fix it by setting *socket* state back to +SS_UNCONNECTED, so that the second request will return -ETIMEDOUT. + +Suggested-by: Stefano Garzarella +Fixes: d021c344051a ("VSOCK: Introduce VM Sockets") +Reviewed-by: Stefano Garzarella +Signed-off-by: Peilin Ye +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + net/vmw_vsock/af_vsock.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/net/vmw_vsock/af_vsock.c ++++ b/net/vmw_vsock/af_vsock.c +@@ -1110,6 +1110,7 @@ static void vsock_connect_timeout(struct + if (sk->sk_state == TCP_SYN_SENT && + (sk->sk_shutdown != SHUTDOWN_MASK)) { + sk->sk_state = TCP_CLOSE; ++ sk->sk_socket->state = SS_UNCONNECTED; + sk->sk_err = ETIMEDOUT; + sk->sk_error_report(sk); + vsock_transport_cancel_pkt(vsk);