Commit d1384e03 authored by Paolo Abeni's avatar Paolo Abeni Committed by Ma Wupeng
Browse files

selftests: net: more strict check in net_helper

stable inclusion
from stable-v6.6.34
commit 50f3931746b5fab057ff91c0c9ffa3900e6eaa43
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAD6H2

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=50f3931746b5fab057ff91c0c9ffa3900e6eaa43



--------------------------------

commit a71d0908e32f3dd41e355d83eeadd44d94811fd6 upstream.

The helper waiting for a listener port can match any socket whose
hexadecimal representation of source or destination addresses
matches that of the given port.

Additionally, any socket state is accepted.

All the above can let the helper return successfully before the
relevant listener is actually ready, with unexpected results.

So far I could not find any related failure in the netdev CI, but
the next patch is going to make the critical event more easily
reproducible.

Address the issue matching the port hex only vs the relevant socket
field and additionally checking the socket state for TCP sockets.

Fixes: 3bdd9fd29cb0 ("selftests/net: synchronize udpgro tests' tx and rx connection")
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Link: https://lore.kernel.org/r/192b3dbc443d953be32991d1b0ca432bd4c65008.1707731086.git.pabeni@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarWang Hai <wanghai38@huawei.com>
parent c27c39b8
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -8,13 +8,16 @@ wait_local_port_listen()
	local listener_ns="${1}"
	local port="${2}"
	local protocol="${3}"
	local port_hex
	local pattern
	local i

	port_hex="$(printf "%04X" "${port}")"
	pattern=":$(printf "%04X" "${port}") "

	# for tcp protocol additionally check the socket state
	[ ${protocol} = "tcp" ] && pattern="${pattern}0A"
	for i in $(seq 10); do
		if ip netns exec "${listener_ns}" cat /proc/net/"${protocol}"* | \
		   grep -q "${port_hex}"; then
		if ip netns exec "${listener_ns}" awk '{print $2" "$4}' \
		   /proc/net/"${protocol}"* | grep -q "${pattern}"; then
			break
		fi
		sleep 0.1