diff mbox series

tls splice: check SPLICE_F_NONBLOCK instead of MSG_DONTWAIT

Message ID 96f2e74095e655a401bb921062a6f09e94f8a57a.1620961779.git.majinjing3@gmail.com
State New
Headers show
Series tls splice: check SPLICE_F_NONBLOCK instead of MSG_DONTWAIT | expand

Commit Message

Jim Ma May 14, 2021, 3:11 a.m. UTC
In tls_sw_splice_read, checkout MSG_* is inappropriate, should use
SPLICE_*, update tls_wait_data to accept nonblock arguments instead
of flags for recvmsg and splice.

Signed-off-by: Jim Ma <majinjing3@gmail.com>
---
 net/tls/tls_sw.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

Comments

Jakub Kicinski May 17, 2021, 4:01 p.m. UTC | #1
On Sun, 16 May 2021 04:58:11 +0000 Jim Ma wrote:
> No, this patch fix using MSG_* in splice.

> 

> I have tested read, write, sendmsg, recvmsg fot tls, and try to

> implement tls in golang. In develop, I have found those issues and

> try to fix them.


To be clear the Fixes tag points to the commit where the issue was
first introduced. AFAICT the issue was there from the start, that
is commit c46234ebb4d1 ("tls: RX path for ktls"). Are you saying that 
it used to work in the beginning and then another commit broke it?

We need the fixes tag to be able to tell how far back (in terms of
LTS releases) to backport.

> An other issue, when before enable TLS_RX in cleint, the server sends

> a tls record, client will receive bad message or message too long

> error. I'm try to fix this issue.


Please reply all and don't top post.
Jim Ma May 18, 2021, 6:17 a.m. UTC | #2
Thanks for reminder.
I'm sure that, fix patch fixes: c46234ebb4d1 ("tls: RX path for ktls")

 On 2021/5/18, 00:01, "Jakub Kicinski" <kuba@kernel.org> wrote:

    On Sun, 16 May 2021 04:58:11 +0000 Jim Ma wrote:
    > No, this patch fix using MSG_* in splice.

    > 

    > I have tested read, write, sendmsg, recvmsg fot tls, and try to

    > implement tls in golang. In develop, I have found those issues and

    > try to fix them.


    To be clear the Fixes tag points to the commit where the issue was
    first introduced. AFAICT the issue was there from the start, that
    is commit c46234ebb4d1 ("tls: RX path for ktls"). Are you saying that 
    it used to work in the beginning and then another commit broke it?

    We need the fixes tag to be able to tell how far back (in terms of
    LTS releases) to backport.

    > An other issue, when before enable TLS_RX in cleint, the server sends

    > a tls record, client will receive bad message or message too long

    > error. I'm try to fix this issue.


    Please reply all and don't top post.

On 2021/5/15, 03:27, "Jakub Kicinski" <kuba@kernel.org> wrote:

    On Fri, 14 May 2021 11:11:02 +0800 Jim Ma wrote:
    > In tls_sw_splice_read, checkout MSG_* is inappropriate, should use

    > SPLICE_*, update tls_wait_data to accept nonblock arguments instead

    > of flags for recvmsg and splice.

    > 

    > Signed-off-by: Jim Ma <majinjing3@gmail.com>


    Fixes: c46234ebb4d1 ("tls: RX path for ktls")

    right?
diff mbox series

Patch

diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index 1dcb34dfd56b..694de024d0ee 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -37,6 +37,7 @@ 
 
 #include <linux/sched/signal.h>
 #include <linux/module.h>
+#include <linux/splice.h>
 #include <crypto/aead.h>
 
 #include <net/strparser.h>
@@ -1281,7 +1282,7 @@  int tls_sw_sendpage(struct sock *sk, struct page *page,
 }
 
 static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock,
-				     int flags, long timeo, int *err)
+				     bool nonblock, long timeo, int *err)
 {
 	struct tls_context *tls_ctx = tls_get_ctx(sk);
 	struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
@@ -1306,7 +1307,7 @@  static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock,
 		if (sock_flag(sk, SOCK_DONE))
 			return NULL;
 
-		if ((flags & MSG_DONTWAIT) || !timeo) {
+		if (nonblock || !timeo) {
 			*err = -EAGAIN;
 			return NULL;
 		}
@@ -1786,7 +1787,7 @@  int tls_sw_recvmsg(struct sock *sk,
 		bool async_capable;
 		bool async = false;
 
-		skb = tls_wait_data(sk, psock, flags, timeo, &err);
+		skb = tls_wait_data(sk, psock, flags & MSG_DONTWAIT, timeo, &err);
 		if (!skb) {
 			if (psock) {
 				int ret = sk_msg_recvmsg(sk, psock, msg, len,
@@ -1990,9 +1991,9 @@  ssize_t tls_sw_splice_read(struct socket *sock,  loff_t *ppos,
 
 	lock_sock(sk);
 
-	timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
+	timeo = sock_rcvtimeo(sk, flags & SPLICE_F_NONBLOCK);
 
-	skb = tls_wait_data(sk, NULL, flags, timeo, &err);
+	skb = tls_wait_data(sk, NULL, flags & SPLICE_F_NONBLOCK, timeo, &err);
 	if (!skb)
 		goto splice_read_end;