From 28444e51e49b356b432bb4f935a9ad7443d61fdb Mon Sep 17 00:00:00 2001 From: bitcoffee Date: Fri, 3 Mar 2023 22:48:31 +0800 Subject: [PATCH] fix ubuf skip sockops and incorrect tcp state occur crash. Signed-off-by: bitcoffee --- ...x-ubuf-not-use-sockops-and-tcp-state.patch | 72 +++++++++++++++++++ Kmesh.spec | 6 +- 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 0002-fix-ubuf-not-use-sockops-and-tcp-state.patch diff --git a/0002-fix-ubuf-not-use-sockops-and-tcp-state.patch b/0002-fix-ubuf-not-use-sockops-and-tcp-state.patch new file mode 100644 index 0000000..ce66c5c --- /dev/null +++ b/0002-fix-ubuf-not-use-sockops-and-tcp-state.patch @@ -0,0 +1,72 @@ +From dcfed2c68310330deb69a08023361e92cfa5e95e Mon Sep 17 00:00:00 2001 +From: bitcoffee +Date: Fri, 3 Mar 2023 22:45:22 +0800 +Subject: [PATCH] fix ubuf not use sockops and tcp state + +Signed-off-by: bitcoffee +--- + kernel/ko_src/kmesh/defer_connect.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +diff --git a/kernel/ko_src/kmesh/defer_connect.c b/kernel/ko_src/kmesh/defer_connect.c +index 12638da..b74d64c 100644 +--- a/kernel/ko_src/kmesh/defer_connect.c ++++ b/kernel/ko_src/kmesh/defer_connect.c +@@ -24,21 +24,28 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size) + struct sockaddr_in addr_in; + long timeo = 1; + const struct iovec *iov; ++ void __user *ubase; + int err; + +- if (iov_iter_is_kvec(&msg->msg_iter)) ++ if (iov_iter_is_kvec(&msg->msg_iter)) { + iov = (struct iovec *)msg->msg_iter.kvec; +- else if (iter_is_iovec(&msg->msg_iter)) ++ ubase = iov->iov_base; ++ kbuf_size = iov->iov_len; ++ } else if (iter_is_iovec(&msg->msg_iter)) { + iov = msg->msg_iter.iov; +- else ++ ubase = iov->iov_base; ++ kbuf_size = iov->iov_len; ++ } else if (iter_is_ubuf(&msg->msg_iter)){ ++ ubase = msg->msg_iter.ubuf; ++ kbuf_size = msg->msg_iter.count; ++ } else + goto connect; + +- kbuf_size = iov->iov_len; + kbuf = (void *)kmalloc(kbuf_size, GFP_KERNEL); + if (!kbuf) + return -EFAULT; + +- if (copy_from_user(kbuf, iov->iov_base, iov->iov_len)) { ++ if (copy_from_user(kbuf, ubase, kbuf_size)) { + err = -EFAULT; + goto out; + } +@@ -78,6 +85,7 @@ static int defer_connect_and_sendmsg(struct sock *sk, struct msghdr *msg, size_t + + if (unlikely(inet_sk(sk)->bpf_defer_connect == 1)) { + lock_sock(sk); ++ inet_sk(sk)->defer_connect = 0; + + err = defer_connect(sk, msg, size); + if (err) { +@@ -111,9 +119,12 @@ static int defer_tcp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_l + * of bpf_defer_connect should be 1 and the normal connect function + * needs to be used. + */ ++ if (inet_sk(sk)->defer_connect == 1) ++ return -ENOTSUPP; + if (inet_sk(sk)->bpf_defer_connect) + return tcp_v4_connect(sk, uaddr, addr_len); + inet_sk(sk)->bpf_defer_connect = 1; ++ inet_sk(sk)->defer_connect = 1; + sk->sk_dport = ((struct sockaddr_in *)uaddr)->sin_port; + sk_daddr_set(sk, ((struct sockaddr_in *)uaddr)->sin_addr.s_addr); + sk->sk_socket->state = SS_CONNECTING; +-- +2.39.1 + diff --git a/Kmesh.spec b/Kmesh.spec index 63a9883..8d2c61e 100644 --- a/Kmesh.spec +++ b/Kmesh.spec @@ -2,7 +2,7 @@ Name: Kmesh Version: 0.2.0 -Release: 1 +Release: 2 Summary: %{name} is a eBPF-based service mesh kernel solution License: Mulan PSL v2 URL: https://gitee.com/openeuler/%{name} @@ -21,6 +21,7 @@ Requires: libbpf Requires: libboundscheck Patch0001: 0001-fix-makefile-not-found-pc-file.patch +Patch0002: 0002-fix-ubuf-not-use-sockops-and-tcp-state.patch %description %{name} is a eBPF-based service mesh kernel solution. @@ -101,5 +102,8 @@ rm -rf %{buildroot} %attr(0550,root,root) /usr/bin/kmesh-stop-post.sh %changelog +* Fri Mar 03 2023 liuxin - 0.2.0-2 +- fix ubuf skip sockops and incorrect tcp state occur crash + * Fri Mar 03 2023 liuxin - 0.2.0-1 - init package -- Gitee