提交 e9cf5bc2 编写于 作者: M Martin KaFai Lau 提交者: Zheng Zengkai

bpf, selftests: Fix racing issue in btf_skc_cls_ingress test

stable inclusion
from stable-v5.10.88
commit fcf9194d366c5c2e903c4f0f594d6bffbd92da8e
bugzilla: 186058 https://gitee.com/openeuler/kernel/issues/I4QW6A

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

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

[ Upstream commit c2fcbf81 ]

The libbpf CI reported occasional failure in btf_skc_cls_ingress:

  test_syncookie:FAIL:Unexpected syncookie states gen_cookie:80326634 recv_cookie:0
  bpf prog error at line 97

"error at line 97" means the bpf prog cannot find the listening socket
when the final ack is received.  It then skipped processing
the syncookie in the final ack which then led to "recv_cookie:0".

The problem is the userspace program did not do accept() and went
ahead to close(listen_fd) before the kernel (and the bpf prog) had
a chance to process the final ack.

The fix is to add accept() call so that the userspace will wait for
the kernel to finish processing the final ack first before close()-ing
everything.

Fixes: 9a856cae ("bpf: selftest: Add test_btf_skc_cls_ingress")
Reported-by: NAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: NMartin KaFai Lau <kafai@fb.com>
Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20211216191630.466151-1-kafai@fb.comSigned-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 780bb7e3
...@@ -90,7 +90,7 @@ static void print_err_line(void) ...@@ -90,7 +90,7 @@ static void print_err_line(void)
static void test_conn(void) static void test_conn(void)
{ {
int listen_fd = -1, cli_fd = -1, err; int listen_fd = -1, cli_fd = -1, srv_fd = -1, err;
socklen_t addrlen = sizeof(srv_sa6); socklen_t addrlen = sizeof(srv_sa6);
int srv_port; int srv_port;
...@@ -112,6 +112,10 @@ static void test_conn(void) ...@@ -112,6 +112,10 @@ static void test_conn(void)
if (CHECK_FAIL(cli_fd == -1)) if (CHECK_FAIL(cli_fd == -1))
goto done; goto done;
srv_fd = accept(listen_fd, NULL, NULL);
if (CHECK_FAIL(srv_fd == -1))
goto done;
if (CHECK(skel->bss->listen_tp_sport != srv_port || if (CHECK(skel->bss->listen_tp_sport != srv_port ||
skel->bss->req_sk_sport != srv_port, skel->bss->req_sk_sport != srv_port,
"Unexpected sk src port", "Unexpected sk src port",
...@@ -134,11 +138,13 @@ static void test_conn(void) ...@@ -134,11 +138,13 @@ static void test_conn(void)
close(listen_fd); close(listen_fd);
if (cli_fd != -1) if (cli_fd != -1)
close(cli_fd); close(cli_fd);
if (srv_fd != -1)
close(srv_fd);
} }
static void test_syncookie(void) static void test_syncookie(void)
{ {
int listen_fd = -1, cli_fd = -1, err; int listen_fd = -1, cli_fd = -1, srv_fd = -1, err;
socklen_t addrlen = sizeof(srv_sa6); socklen_t addrlen = sizeof(srv_sa6);
int srv_port; int srv_port;
...@@ -161,6 +167,10 @@ static void test_syncookie(void) ...@@ -161,6 +167,10 @@ static void test_syncookie(void)
if (CHECK_FAIL(cli_fd == -1)) if (CHECK_FAIL(cli_fd == -1))
goto done; goto done;
srv_fd = accept(listen_fd, NULL, NULL);
if (CHECK_FAIL(srv_fd == -1))
goto done;
if (CHECK(skel->bss->listen_tp_sport != srv_port, if (CHECK(skel->bss->listen_tp_sport != srv_port,
"Unexpected tp src port", "Unexpected tp src port",
"listen_tp_sport:%u expected:%u\n", "listen_tp_sport:%u expected:%u\n",
...@@ -188,6 +198,8 @@ static void test_syncookie(void) ...@@ -188,6 +198,8 @@ static void test_syncookie(void)
close(listen_fd); close(listen_fd);
if (cli_fd != -1) if (cli_fd != -1)
close(cli_fd); close(cli_fd);
if (srv_fd != -1)
close(srv_fd);
} }
struct test { struct test {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册