selftests: tls: add test with a partially invalid iov
authorSabrina Dubroca <sd@queasysnail.net>
Mon, 25 Mar 2024 15:56:47 +0000 (16:56 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 27 Mar 2024 03:48:24 +0000 (20:48 -0700)
Make sure that we don't return more bytes than we actually received if
the userspace buffer was bogus. We expect to receive at least the rest
of rec1, and possibly some of rec2 (currently, we don't, but that
would be ok).

Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/720e61b3d3eab40af198a58ce2cd1ee019f0ceb1.1711120964.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/tls.c

index c6eda21cefb6b881f9180c730485f9fe28c0e59a..f27a12d2a2c9979adba840ab1065e8af9bc44aab 100644 (file)
@@ -1615,6 +1615,40 @@ TEST_F(tls, getsockopt)
        EXPECT_EQ(errno, EINVAL);
 }
 
+TEST_F(tls, recv_efault)
+{
+       char *rec1 = "1111111111";
+       char *rec2 = "2222222222";
+       struct msghdr hdr = {};
+       struct iovec iov[2];
+       char recv_mem[12];
+       int ret;
+
+       if (self->notls)
+               SKIP(return, "no TLS support");
+
+       EXPECT_EQ(send(self->fd, rec1, 10, 0), 10);
+       EXPECT_EQ(send(self->fd, rec2, 10, 0), 10);
+
+       iov[0].iov_base = recv_mem;
+       iov[0].iov_len = sizeof(recv_mem);
+       iov[1].iov_base = NULL; /* broken iov to make process_rx_list fail */
+       iov[1].iov_len = 1;
+
+       hdr.msg_iovlen = 2;
+       hdr.msg_iov = iov;
+
+       EXPECT_EQ(recv(self->cfd, recv_mem, 1, 0), 1);
+       EXPECT_EQ(recv_mem[0], rec1[0]);
+
+       ret = recvmsg(self->cfd, &hdr, 0);
+       EXPECT_LE(ret, sizeof(recv_mem));
+       EXPECT_GE(ret, 9);
+       EXPECT_EQ(memcmp(rec1, recv_mem, 9), 0);
+       if (ret > 9)
+               EXPECT_EQ(memcmp(rec2, recv_mem + 9, ret - 9), 0);
+}
+
 FIXTURE(tls_err)
 {
        int fd, cfd;