TLS requires the entire record to fit into the receive buffer.
If user sets the receive buffer too low when larger record
arrives strparser returns EMSGSIZE.

Add a test case for this situation.

Signed-off-by: Jakub Kicinski <[email protected]>
Reviewed-by: Simon Horman <[email protected]>
---
 tools/testing/selftests/net/tls.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/tools/testing/selftests/net/tls.c 
b/tools/testing/selftests/net/tls.c
index 4c285b6e1db8..39dfbc4a3652 100644
--- a/tools/testing/selftests/net/tls.c
+++ b/tools/testing/selftests/net/tls.c
@@ -694,6 +694,34 @@ TEST_F(tls, recv_lowat)
        EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0);
 }
 
+TEST_F(tls, recv_rcvbuf)
+{
+       char send_mem[4096];
+       char recv_mem[4096];
+       int rcv_buf = 1024;
+
+       memset(send_mem, 0x1c, sizeof(send_mem));
+
+       EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVBUF,
+                            &rcv_buf, sizeof(rcv_buf)), 0);
+
+       EXPECT_EQ(send(self->fd, send_mem, 512, 0), 512);
+       memset(recv_mem, 0, sizeof(recv_mem));
+       EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), 512);
+       EXPECT_EQ(memcmp(send_mem, recv_mem, 512), 0);
+
+       if (self->notls)
+               return;
+
+       EXPECT_EQ(send(self->fd, send_mem, 4096, 0), 4096);
+       memset(recv_mem, 0, sizeof(recv_mem));
+       EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1);
+       EXPECT_EQ(errno, EMSGSIZE);
+
+       EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1);
+       EXPECT_EQ(errno, EMSGSIZE);
+}
+
 TEST_F(tls, bidir)
 {
        char const *test_str = "test_read";
-- 
2.21.0

Reply via email to