]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: tls: add test for data loss on small pipe
authorJakub Kicinski <kuba@kernel.org>
Wed, 29 Apr 2026 22:29:39 +0000 (15:29 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sun, 3 May 2026 01:27:14 +0000 (18:27 -0700)
Add selftest for data loss on short splice.

Link: https://patch.msgid.link/20260429222944.2139041-3-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/tls.c

index 9e2ccea13d7023a977aa853ff6e3531166e48fb8..30a236b8e9f733ff34dd21d95cb62c8c58bc7ecc 100644 (file)
@@ -946,6 +946,49 @@ TEST_F(tls, peek_and_splice)
        EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
 }
 
+TEST_F(tls, splice_to_pipe_small)
+{
+       int send_len = TLS_PAYLOAD_MAX_LEN;
+       char mem_send[TLS_PAYLOAD_MAX_LEN];
+       char mem_recv[TLS_PAYLOAD_MAX_LEN];
+       size_t total = 0;
+       int p[2];
+
+       memrnd(mem_send, sizeof(mem_send));
+
+       ASSERT_GE(pipe(p), 0);
+
+       /* Shrink pipe to 1 page (typically 4096 bytes) to force multiple
+        * splice iterations for a 16384-byte TLS record.
+        */
+       EXPECT_GE(fcntl(p[1], F_SETPIPE_SZ, 4096), 4096);
+
+       EXPECT_EQ(send(self->fd, mem_send, send_len, 0), send_len);
+
+       while (total < (size_t)send_len) {
+               ssize_t spliced, drained;
+
+               spliced = splice(self->cfd, NULL, p[1], NULL,
+                                send_len - total, 0);
+               EXPECT_GT(spliced, 0);
+               if (spliced <= 0)
+                       break;
+
+               drained = read(p[0], mem_recv + total, spliced);
+               EXPECT_EQ(drained, spliced);
+               if (drained <= 0)
+                       break;
+
+               total += drained;
+       }
+
+       EXPECT_EQ(total, (size_t)send_len);
+       EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
+
+       close(p[0]);
+       close(p[1]);
+}
+
 #define MAX_FRAGS 48
 TEST_F(tls, splice_short)
 {