public inbox for linux-kernel-mentees@lists.linux-foundation.org
 help / color / mirror / Atom feed
* [PATCH 6.6.y 0/2] fix push_nsh() validation + silence selftest warnings
@ 2025-12-26  5:56 Adrian Yip
  2025-12-26  5:56 ` [PATCH 6.6.y 1/2] selftests: openvswitch: Fix escape chars in regexp Adrian Yip
  2025-12-26  5:56 ` [PATCH 6.6.y 2/2] net: openvswitch: fix middle attribute validation in push_nsh() action Adrian Yip
  0 siblings, 2 replies; 3+ messages in thread
From: Adrian Yip @ 2025-12-26  5:56 UTC (permalink / raw)
  To: stable
  Cc: Adrian Yip, Pravin B Shelar, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-kernel-mentees, skhan,
	david.hunter.linux, khalid

Hi maintainers,

This is a v6.6 backport mainly for an upstream commit `5ace7ef87f05 net: 
openvswitch: fix middle attribute validation in push_nsh() action`.

I built the kernel then tested it with selftest. The selftest that ran
with a a bunch of SyntaxWarning.

Example:
  /ovs-dpctl.py:598: SyntaxWarning: invalid escape sequence '\d'
    actstr, ":", "(\d+)", int, False
  /ovs-dpctl.py:601: SyntaxWarning: invalid escape sequence '\d'
    actstr, "-", "(\d+)", int, False
  /ovs-dpctl.py:505: SyntaxWarning: invalid escape sequence '\d'
    elif parse_starts_block(actstr, "^(\d+)", False, True):

This error was then easily fixed with another minimal backport for the
file tools/testing/selftests/net/openvswitch/ovs-dpctl.py. Hence the
series.

Both patches was applied cleanly and was tested with selftest and passed
though the timeout had to be increased for drop_reason to pass.

Adrian Moreno (1):
  selftests: openvswitch: Fix escape chars in regexp.

Ilya Maximets (1):
  net: openvswitch: fix middle attribute validation in push_nsh() action

 net/openvswitch/flow_netlink.c                   | 13 ++++++++++---
 .../selftests/net/openvswitch/ovs-dpctl.py       | 16 ++++++++--------
 2 files changed, 18 insertions(+), 11 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 6.6.y 1/2] selftests: openvswitch: Fix escape chars in regexp.
  2025-12-26  5:56 [PATCH 6.6.y 0/2] fix push_nsh() validation + silence selftest warnings Adrian Yip
@ 2025-12-26  5:56 ` Adrian Yip
  2025-12-26  5:56 ` [PATCH 6.6.y 2/2] net: openvswitch: fix middle attribute validation in push_nsh() action Adrian Yip
  1 sibling, 0 replies; 3+ messages in thread
From: Adrian Yip @ 2025-12-26  5:56 UTC (permalink / raw)
  To: stable
  Cc: Adrian Moreno, Pravin B Shelar, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-kernel-mentees, skhan,
	david.hunter.linux, khalid, Aaron Conole, Adrian Yip

From: Adrian Moreno <amorenoz@redhat.com>

[ Upstream commit 3fde60afe1f84746c1177861bd27b3ebb00cb8f5 ]

Character sequences starting with `\` are interpreted by python as
escaped Unicode characters. However, they have other meaning in
regular expressions (e.g: "\d").

It seems Python >= 3.12 starts emitting a SyntaxWarning when these
escaped sequences are not recognized as valid Unicode characters.

An example of these warnings:

tools/testing/selftests/net/openvswitch/ovs-dpctl.py:505:
SyntaxWarning: invalid escape sequence '\d'

Fix all the warnings by flagging literals as raw strings.

Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
Reviewed-by: Aaron Conole <aconole@redhat.com>
Link: https://lore.kernel.org/r/20240416090913.2028475-1-amorenoz@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
(cherry picked from commit 3fde60afe1f84746c1177861bd27b3ebb00cb8f5)
Signed-off-by: Adrian Yip <adrian.ytw@gmail.com>
---
 .../selftests/net/openvswitch/ovs-dpctl.py       | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
index 8b120718768e..9f8dec2f6539 100644
--- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
+++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
@@ -489,7 +489,7 @@ class ovsactions(nla):
                     actstr, reason = parse_extract_field(
                         actstr,
                         "drop(",
-                        "([0-9]+)",
+                        r"([0-9]+)",
                         lambda x: int(x, 0),
                         False,
                         None,
@@ -502,9 +502,9 @@ class ovsactions(nla):
                     actstr = actstr[len("drop"): ]
                     return (totallen - len(actstr))
 
-            elif parse_starts_block(actstr, "^(\d+)", False, True):
+            elif parse_starts_block(actstr, r"^(\d+)", False, True):
                 actstr, output = parse_extract_field(
-                    actstr, None, "(\d+)", lambda x: int(x), False, "0"
+                    actstr, None, r"(\d+)", lambda x: int(x), False, "0"
                 )
                 self["attrs"].append(["OVS_ACTION_ATTR_OUTPUT", output])
                 parsed = True
@@ -512,7 +512,7 @@ class ovsactions(nla):
                 actstr, recircid = parse_extract_field(
                     actstr,
                     "recirc(",
-                    "([0-9a-fA-Fx]+)",
+                    r"([0-9a-fA-Fx]+)",
                     lambda x: int(x, 0),
                     False,
                     0,
@@ -588,17 +588,17 @@ class ovsactions(nla):
                                 actstr = actstr[3:]
 
                             actstr, ip_block_min = parse_extract_field(
-                                actstr, "=", "([0-9a-fA-F\.]+)", str, False
+                                actstr, "=", r"([0-9a-fA-F\.]+)", str, False
                             )
                             actstr, ip_block_max = parse_extract_field(
-                                actstr, "-", "([0-9a-fA-F\.]+)", str, False
+                                actstr, "-", r"([0-9a-fA-F\.]+)", str, False
                             )
 
                             actstr, proto_min = parse_extract_field(
-                                actstr, ":", "(\d+)", int, False
+                                actstr, ":", r"(\d+)", int, False
                             )
                             actstr, proto_max = parse_extract_field(
-                                actstr, "-", "(\d+)", int, False
+                                actstr, "-", r"(\d+)", int, False
                             )
 
                             if t is not None:
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 6.6.y 2/2] net: openvswitch: fix middle attribute validation in push_nsh() action
  2025-12-26  5:56 [PATCH 6.6.y 0/2] fix push_nsh() validation + silence selftest warnings Adrian Yip
  2025-12-26  5:56 ` [PATCH 6.6.y 1/2] selftests: openvswitch: Fix escape chars in regexp Adrian Yip
@ 2025-12-26  5:56 ` Adrian Yip
  1 sibling, 0 replies; 3+ messages in thread
From: Adrian Yip @ 2025-12-26  5:56 UTC (permalink / raw)
  To: stable
  Cc: Ilya Maximets, Pravin B Shelar, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-kernel-mentees, skhan,
	david.hunter.linux, khalid, Junvy Yang, Eelco Chaudron,
	Aaron Conole, Adrian Yip

From: Ilya Maximets <i.maximets@ovn.org>

[ Upstream commit 5ace7ef87f059d68b5f50837ef3e8a1a4870c36e ]

The push_nsh() action structure looks like this:

 OVS_ACTION_ATTR_PUSH_NSH(OVS_KEY_ATTR_NSH(OVS_NSH_KEY_ATTR_BASE,...))

The outermost OVS_ACTION_ATTR_PUSH_NSH attribute is OK'ed by the
nla_for_each_nested() inside __ovs_nla_copy_actions().  The innermost
OVS_NSH_KEY_ATTR_BASE/MD1/MD2 are OK'ed by the nla_for_each_nested()
inside nsh_key_put_from_nlattr().  But nothing checks if the attribute
in the middle is OK.  We don't even check that this attribute is the
OVS_KEY_ATTR_NSH.  We just do a double unwrap with a pair of nla_data()
calls - first time directly while calling validate_push_nsh() and the
second time as part of the nla_for_each_nested() macro, which isn't
safe, potentially causing invalid memory access if the size of this
attribute is incorrect.  The failure may not be noticed during
validation due to larger netlink buffer, but cause trouble later during
action execution where the buffer is allocated exactly to the size:

 BUG: KASAN: slab-out-of-bounds in nsh_hdr_from_nlattr+0x1dd/0x6a0 [openvswitch]
 Read of size 184 at addr ffff88816459a634 by task a.out/22624

 CPU: 8 UID: 0 PID: 22624 6.18.0-rc7+ #115 PREEMPT(voluntary)
 Call Trace:
  <TASK>
  dump_stack_lvl+0x51/0x70
  print_address_description.constprop.0+0x2c/0x390
  kasan_report+0xdd/0x110
  kasan_check_range+0x35/0x1b0
  __asan_memcpy+0x20/0x60
  nsh_hdr_from_nlattr+0x1dd/0x6a0 [openvswitch]
  push_nsh+0x82/0x120 [openvswitch]
  do_execute_actions+0x1405/0x2840 [openvswitch]
  ovs_execute_actions+0xd5/0x3b0 [openvswitch]
  ovs_packet_cmd_execute+0x949/0xdb0 [openvswitch]
  genl_family_rcv_msg_doit+0x1d6/0x2b0
  genl_family_rcv_msg+0x336/0x580
  genl_rcv_msg+0x9f/0x130
  netlink_rcv_skb+0x11f/0x370
  genl_rcv+0x24/0x40
  netlink_unicast+0x73e/0xaa0
  netlink_sendmsg+0x744/0xbf0
  __sys_sendto+0x3d6/0x450
  do_syscall_64+0x79/0x2c0
  entry_SYSCALL_64_after_hwframe+0x76/0x7e
  </TASK>

Let's add some checks that the attribute is properly sized and it's
the only one attribute inside the action.  Technically, there is no
real reason for OVS_KEY_ATTR_NSH to be there, as we know that we're
pushing an NSH header already, it just creates extra nesting, but
that's how uAPI works today.  So, keeping as it is.

Fixes: b2d0f5d5dc53 ("openvswitch: enable NSH support")
Reported-by: Junvy Yang <zhuque@tencent.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Acked-by: Eelco Chaudron <echaudro@redhat.com>
Reviewed-by: Aaron Conole <aconole@redhat.com>
Link: https://patch.msgid.link/20251204105334.900379-1-i.maximets@ovn.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
(cherry picked from commit 5ace7ef87f059d68b5f50837ef3e8a1a4870c36e)
Signed-off-by: Adrian Yip <adrian.ytw@gmail.com>
---
 net/openvswitch/flow_netlink.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
index 836e8e705d40..1d9a44d6216a 100644
--- a/net/openvswitch/flow_netlink.c
+++ b/net/openvswitch/flow_netlink.c
@@ -2788,13 +2788,20 @@ static int validate_and_copy_set_tun(const struct nlattr *attr,
 	return err;
 }
 
-static bool validate_push_nsh(const struct nlattr *attr, bool log)
+static bool validate_push_nsh(const struct nlattr *a, bool log)
 {
+	struct nlattr *nsh_key = nla_data(a);
 	struct sw_flow_match match;
 	struct sw_flow_key key;
 
+	/* There must be one and only one NSH header. */
+	if (!nla_ok(nsh_key, nla_len(a)) ||
+	    nla_total_size(nla_len(nsh_key)) != nla_len(a) ||
+	    nla_type(nsh_key) != OVS_KEY_ATTR_NSH)
+		return false;
+
 	ovs_match_init(&match, &key, true, NULL);
-	return !nsh_key_put_from_nlattr(attr, &match, false, true, log);
+	return !nsh_key_put_from_nlattr(nsh_key, &match, false, true, log);
 }
 
 /* Return false if there are any non-masked bits set.
@@ -3351,7 +3358,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
 					return -EINVAL;
 			}
 			mac_proto = MAC_PROTO_NONE;
-			if (!validate_push_nsh(nla_data(a), log))
+			if (!validate_push_nsh(a, log))
 				return -EINVAL;
 			break;
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-12-26  5:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-26  5:56 [PATCH 6.6.y 0/2] fix push_nsh() validation + silence selftest warnings Adrian Yip
2025-12-26  5:56 ` [PATCH 6.6.y 1/2] selftests: openvswitch: Fix escape chars in regexp Adrian Yip
2025-12-26  5:56 ` [PATCH 6.6.y 2/2] net: openvswitch: fix middle attribute validation in push_nsh() action Adrian Yip

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox