Skip to content

Commit 646fc4b

Browse files
committed
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/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents c1fd3a9 + 417e91e commit 646fc4b

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

net/tls/tls_sw.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,10 +1976,10 @@ int tls_sw_recvmsg(struct sock *sk,
19761976
if (unlikely(flags & MSG_ERRQUEUE))
19771977
return sock_recv_errqueue(sk, msg, len, SOL_IP, IP_RECVERR);
19781978

1979-
psock = sk_psock_get(sk);
19801979
err = tls_rx_reader_lock(sk, ctx, flags & MSG_DONTWAIT);
19811980
if (err < 0)
19821981
return err;
1982+
psock = sk_psock_get(sk);
19831983
bpf_strp_enabled = sk_psock_strp_enabled(psock);
19841984

19851985
/* If crypto failed the connection is broken */
@@ -2152,12 +2152,15 @@ int tls_sw_recvmsg(struct sock *sk,
21522152
}
21532153

21542154
/* Drain records from the rx_list & copy if required */
2155-
if (is_peek || is_kvec)
2155+
if (is_peek)
21562156
err = process_rx_list(ctx, msg, &control, copied + peeked,
21572157
decrypted - peeked, is_peek, NULL);
21582158
else
21592159
err = process_rx_list(ctx, msg, &control, 0,
21602160
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;
21612164
}
21622165

21632166
copied += decrypted;

tools/testing/selftests/net/tls.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,6 +1615,40 @@ TEST_F(tls, getsockopt)
16151615
EXPECT_EQ(errno, EINVAL);
16161616
}
16171617

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+
16181652
FIXTURE(tls_err)
16191653
{
16201654
int fd, cfd;

0 commit comments

Comments
 (0)