Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'tls-recvmsg-fixes'

Sabrina Dubroca says:

====================
tls: recvmsg fixes

The first two fixes are again related to async decrypt. The last one
is unrelated but I stumbled upon it while reading the code.
====================

Link: https://lore.kernel.org/r/cover.1711120964.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+39 -2
+5 -2
net/tls/tls_sw.c
··· 1976 1976 if (unlikely(flags & MSG_ERRQUEUE)) 1977 1977 return sock_recv_errqueue(sk, msg, len, SOL_IP, IP_RECVERR); 1978 1978 1979 - psock = sk_psock_get(sk); 1980 1979 err = tls_rx_reader_lock(sk, ctx, flags & MSG_DONTWAIT); 1981 1980 if (err < 0) 1982 1981 return err; 1982 + psock = sk_psock_get(sk); 1983 1983 bpf_strp_enabled = sk_psock_strp_enabled(psock); 1984 1984 1985 1985 /* If crypto failed the connection is broken */ ··· 2152 2152 } 2153 2153 2154 2154 /* Drain records from the rx_list & copy if required */ 2155 - if (is_peek || is_kvec) 2155 + if (is_peek) 2156 2156 err = process_rx_list(ctx, msg, &control, copied + peeked, 2157 2157 decrypted - peeked, is_peek, NULL); 2158 2158 else 2159 2159 err = process_rx_list(ctx, msg, &control, 0, 2160 2160 async_copy_bytes, is_peek, NULL); 2161 + 2162 + /* we could have copied less than we wanted, and possibly nothing */ 2163 + decrypted += max(err, 0) - async_copy_bytes; 2161 2164 } 2162 2165 2163 2166 copied += decrypted;
+34
tools/testing/selftests/net/tls.c
··· 1615 1615 EXPECT_EQ(errno, EINVAL); 1616 1616 } 1617 1617 1618 + TEST_F(tls, recv_efault) 1619 + { 1620 + char *rec1 = "1111111111"; 1621 + char *rec2 = "2222222222"; 1622 + struct msghdr hdr = {}; 1623 + struct iovec iov[2]; 1624 + char recv_mem[12]; 1625 + int ret; 1626 + 1627 + if (self->notls) 1628 + SKIP(return, "no TLS support"); 1629 + 1630 + EXPECT_EQ(send(self->fd, rec1, 10, 0), 10); 1631 + EXPECT_EQ(send(self->fd, rec2, 10, 0), 10); 1632 + 1633 + iov[0].iov_base = recv_mem; 1634 + iov[0].iov_len = sizeof(recv_mem); 1635 + iov[1].iov_base = NULL; /* broken iov to make process_rx_list fail */ 1636 + iov[1].iov_len = 1; 1637 + 1638 + hdr.msg_iovlen = 2; 1639 + hdr.msg_iov = iov; 1640 + 1641 + EXPECT_EQ(recv(self->cfd, recv_mem, 1, 0), 1); 1642 + EXPECT_EQ(recv_mem[0], rec1[0]); 1643 + 1644 + ret = recvmsg(self->cfd, &hdr, 0); 1645 + EXPECT_LE(ret, sizeof(recv_mem)); 1646 + EXPECT_GE(ret, 9); 1647 + EXPECT_EQ(memcmp(rec1, recv_mem, 9), 0); 1648 + if (ret > 9) 1649 + EXPECT_EQ(memcmp(rec2, recv_mem + 9, ret - 9), 0); 1650 + } 1651 + 1618 1652 FIXTURE(tls_err) 1619 1653 { 1620 1654 int fd, cfd;