Skip to content

Commit cf51d61

Browse files
committed
Merge branch 'tls-misc-bugfixes'
Sabrina Dubroca says: ==================== tls: misc bugfixes Jann Horn reported multiple bugs in kTLS. This series addresses them, and adds some corresponding selftests for those that are reproducible (and without failure injection). ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 0c3f2e6 + 3667e9b commit cf51d61

File tree

3 files changed

+92
-11
lines changed

3 files changed

+92
-11
lines changed

net/tls/tls_main.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,9 @@ int tls_process_cmsg(struct sock *sk, struct msghdr *msg,
255255
if (msg->msg_flags & MSG_MORE)
256256
return -EINVAL;
257257

258-
rc = tls_handle_open_record(sk, msg->msg_flags);
259-
if (rc)
260-
return rc;
261-
262258
*record_type = *(unsigned char *)CMSG_DATA(cmsg);
263-
rc = 0;
259+
260+
rc = tls_handle_open_record(sk, msg->msg_flags);
264261
break;
265262
default:
266263
return -EINVAL;

net/tls/tls_sw.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,7 +1054,7 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,
10541054
if (ret == -EINPROGRESS)
10551055
num_async++;
10561056
else if (ret != -EAGAIN)
1057-
goto send_end;
1057+
goto end;
10581058
}
10591059
}
10601060

@@ -1112,8 +1112,11 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,
11121112
goto send_end;
11131113
tls_ctx->pending_open_record_frags = true;
11141114

1115-
if (sk_msg_full(msg_pl))
1115+
if (sk_msg_full(msg_pl)) {
11161116
full_record = true;
1117+
sk_msg_trim(sk, msg_en,
1118+
msg_pl->sg.size + prot->overhead_size);
1119+
}
11171120

11181121
if (full_record || eor)
11191122
goto copied;
@@ -1149,6 +1152,13 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,
11491152
} else if (ret != -EAGAIN)
11501153
goto send_end;
11511154
}
1155+
1156+
/* Transmit if any encryptions have completed */
1157+
if (test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) {
1158+
cancel_delayed_work(&ctx->tx_work.work);
1159+
tls_tx_records(sk, msg->msg_flags);
1160+
}
1161+
11521162
continue;
11531163
rollback_iter:
11541164
copied -= try_to_copy;
@@ -1204,6 +1214,12 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,
12041214
goto send_end;
12051215
}
12061216
}
1217+
1218+
/* Transmit if any encryptions have completed */
1219+
if (test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) {
1220+
cancel_delayed_work(&ctx->tx_work.work);
1221+
tls_tx_records(sk, msg->msg_flags);
1222+
}
12071223
}
12081224

12091225
continue;
@@ -1223,8 +1239,9 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,
12231239
goto alloc_encrypted;
12241240
}
12251241

1242+
send_end:
12261243
if (!num_async) {
1227-
goto send_end;
1244+
goto end;
12281245
} else if (num_zc || eor) {
12291246
int err;
12301247

@@ -1242,7 +1259,7 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,
12421259
tls_tx_records(sk, msg->msg_flags);
12431260
}
12441261

1245-
send_end:
1262+
end:
12461263
ret = sk_stream_error(sk, msg->msg_flags, ret);
12471264
return copied > 0 ? copied : ret;
12481265
}
@@ -1637,8 +1654,10 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
16371654

16381655
if (unlikely(darg->async)) {
16391656
err = tls_strp_msg_hold(&ctx->strp, &ctx->async_hold);
1640-
if (err)
1641-
__skb_queue_tail(&ctx->async_hold, darg->skb);
1657+
if (err) {
1658+
err = tls_decrypt_async_wait(ctx);
1659+
darg->async = false;
1660+
}
16421661
return err;
16431662
}
16441663

tools/testing/selftests/net/tls.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,40 @@ TEST_F(tls, msg_more)
564564
EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
565565
}
566566

567+
TEST_F(tls, cmsg_msg_more)
568+
{
569+
char *test_str = "test_read";
570+
char record_type = 100;
571+
int send_len = 10;
572+
573+
/* we don't allow MSG_MORE with non-DATA records */
574+
EXPECT_EQ(tls_send_cmsg(self->fd, record_type, test_str, send_len,
575+
MSG_MORE), -1);
576+
EXPECT_EQ(errno, EINVAL);
577+
}
578+
579+
TEST_F(tls, msg_more_then_cmsg)
580+
{
581+
char *test_str = "test_read";
582+
char record_type = 100;
583+
int send_len = 10;
584+
char buf[10 * 2];
585+
int ret;
586+
587+
EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
588+
EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_DONTWAIT), -1);
589+
590+
ret = tls_send_cmsg(self->fd, record_type, test_str, send_len, 0);
591+
EXPECT_EQ(ret, send_len);
592+
593+
/* initial DATA record didn't get merged with the non-DATA record */
594+
EXPECT_EQ(recv(self->cfd, buf, send_len * 2, 0), send_len);
595+
596+
EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
597+
buf, sizeof(buf), MSG_WAITALL),
598+
send_len);
599+
}
600+
567601
TEST_F(tls, msg_more_unsent)
568602
{
569603
char const *test_str = "test_read";
@@ -912,6 +946,37 @@ TEST_F(tls, peek_and_splice)
912946
EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
913947
}
914948

949+
#define MAX_FRAGS 48
950+
TEST_F(tls, splice_short)
951+
{
952+
struct iovec sendchar_iov;
953+
char read_buf[0x10000];
954+
char sendbuf[0x100];
955+
char sendchar = 'S';
956+
int pipefds[2];
957+
int i;
958+
959+
sendchar_iov.iov_base = &sendchar;
960+
sendchar_iov.iov_len = 1;
961+
962+
memset(sendbuf, 's', sizeof(sendbuf));
963+
964+
ASSERT_GE(pipe2(pipefds, O_NONBLOCK), 0);
965+
ASSERT_GE(fcntl(pipefds[0], F_SETPIPE_SZ, (MAX_FRAGS + 1) * 0x1000), 0);
966+
967+
for (i = 0; i < MAX_FRAGS; i++)
968+
ASSERT_GE(vmsplice(pipefds[1], &sendchar_iov, 1, 0), 0);
969+
970+
ASSERT_EQ(write(pipefds[1], sendbuf, sizeof(sendbuf)), sizeof(sendbuf));
971+
972+
EXPECT_EQ(splice(pipefds[0], NULL, self->fd, NULL, MAX_FRAGS + 0x1000, 0),
973+
MAX_FRAGS + sizeof(sendbuf));
974+
EXPECT_EQ(recv(self->cfd, read_buf, sizeof(read_buf), 0), MAX_FRAGS + sizeof(sendbuf));
975+
EXPECT_EQ(recv(self->cfd, read_buf, sizeof(read_buf), MSG_DONTWAIT), -1);
976+
EXPECT_EQ(errno, EAGAIN);
977+
}
978+
#undef MAX_FRAGS
979+
915980
TEST_F(tls, recvmsg_single)
916981
{
917982
char const *test_str = "test_recvmsg_single";

0 commit comments

Comments
 (0)