Skip to content

Commit 23fcb62

Browse files
kuba-moodavem330
authored andcommitted
selftests: tls: add tests for poll behavior
Make sure we don't generate premature POLLIN events. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 121dca7 commit 23fcb62

File tree

1 file changed

+131
-0
lines changed
  • tools/testing/selftests/net

1 file changed

+131
-0
lines changed

tools/testing/selftests/net/tls.c

+131
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/tcp.h>
1616
#include <linux/socket.h>
1717

18+
#include <sys/epoll.h>
1819
#include <sys/types.h>
1920
#include <sys/sendfile.h>
2021
#include <sys/socket.h>
@@ -1637,6 +1638,136 @@ TEST_F(tls_err, timeo)
16371638
}
16381639
}
16391640

1641+
TEST_F(tls_err, poll_partial_rec)
1642+
{
1643+
struct pollfd pfd = { };
1644+
ssize_t rec_len;
1645+
char rec[256];
1646+
char buf[128];
1647+
1648+
if (self->notls)
1649+
SKIP(return, "no TLS support");
1650+
1651+
pfd.fd = self->cfd2;
1652+
pfd.events = POLLIN;
1653+
EXPECT_EQ(poll(&pfd, 1, 1), 0);
1654+
1655+
memrnd(buf, sizeof(buf));
1656+
EXPECT_EQ(send(self->fd, buf, sizeof(buf), 0), sizeof(buf));
1657+
rec_len = recv(self->cfd, rec, sizeof(rec), 0);
1658+
EXPECT_GT(rec_len, sizeof(buf));
1659+
1660+
/* Write 100B, not the full record ... */
1661+
EXPECT_EQ(send(self->fd2, rec, 100, 0), 100);
1662+
/* ... no full record should mean no POLLIN */
1663+
pfd.fd = self->cfd2;
1664+
pfd.events = POLLIN;
1665+
EXPECT_EQ(poll(&pfd, 1, 1), 0);
1666+
/* Now write the rest, and it should all pop out of the other end. */
1667+
EXPECT_EQ(send(self->fd2, rec + 100, rec_len - 100, 0), rec_len - 100);
1668+
pfd.fd = self->cfd2;
1669+
pfd.events = POLLIN;
1670+
EXPECT_EQ(poll(&pfd, 1, 1), 1);
1671+
EXPECT_EQ(recv(self->cfd2, rec, sizeof(rec), 0), sizeof(buf));
1672+
EXPECT_EQ(memcmp(buf, rec, sizeof(buf)), 0);
1673+
}
1674+
1675+
TEST_F(tls_err, epoll_partial_rec)
1676+
{
1677+
struct epoll_event ev, events[10];
1678+
ssize_t rec_len;
1679+
char rec[256];
1680+
char buf[128];
1681+
int epollfd;
1682+
1683+
if (self->notls)
1684+
SKIP(return, "no TLS support");
1685+
1686+
epollfd = epoll_create1(0);
1687+
ASSERT_GE(epollfd, 0);
1688+
1689+
memset(&ev, 0, sizeof(ev));
1690+
ev.events = EPOLLIN;
1691+
ev.data.fd = self->cfd2;
1692+
ASSERT_GE(epoll_ctl(epollfd, EPOLL_CTL_ADD, self->cfd2, &ev), 0);
1693+
1694+
EXPECT_EQ(epoll_wait(epollfd, events, 10, 0), 0);
1695+
1696+
memrnd(buf, sizeof(buf));
1697+
EXPECT_EQ(send(self->fd, buf, sizeof(buf), 0), sizeof(buf));
1698+
rec_len = recv(self->cfd, rec, sizeof(rec), 0);
1699+
EXPECT_GT(rec_len, sizeof(buf));
1700+
1701+
/* Write 100B, not the full record ... */
1702+
EXPECT_EQ(send(self->fd2, rec, 100, 0), 100);
1703+
/* ... no full record should mean no POLLIN */
1704+
EXPECT_EQ(epoll_wait(epollfd, events, 10, 0), 0);
1705+
/* Now write the rest, and it should all pop out of the other end. */
1706+
EXPECT_EQ(send(self->fd2, rec + 100, rec_len - 100, 0), rec_len - 100);
1707+
EXPECT_EQ(epoll_wait(epollfd, events, 10, 0), 1);
1708+
EXPECT_EQ(recv(self->cfd2, rec, sizeof(rec), 0), sizeof(buf));
1709+
EXPECT_EQ(memcmp(buf, rec, sizeof(buf)), 0);
1710+
1711+
close(epollfd);
1712+
}
1713+
1714+
TEST_F(tls_err, poll_partial_rec_async)
1715+
{
1716+
struct pollfd pfd = { };
1717+
ssize_t rec_len;
1718+
char rec[256];
1719+
char buf[128];
1720+
char token;
1721+
int p[2];
1722+
int ret;
1723+
1724+
if (self->notls)
1725+
SKIP(return, "no TLS support");
1726+
1727+
ASSERT_GE(pipe(p), 0);
1728+
1729+
memrnd(buf, sizeof(buf));
1730+
EXPECT_EQ(send(self->fd, buf, sizeof(buf), 0), sizeof(buf));
1731+
rec_len = recv(self->cfd, rec, sizeof(rec), 0);
1732+
EXPECT_GT(rec_len, sizeof(buf));
1733+
1734+
ret = fork();
1735+
ASSERT_GE(ret, 0);
1736+
1737+
if (ret) {
1738+
int status, pid2;
1739+
1740+
close(p[1]);
1741+
usleep(1000); /* Give child a head start */
1742+
1743+
EXPECT_EQ(send(self->fd2, rec, 100, 0), 100);
1744+
1745+
EXPECT_EQ(read(p[0], &token, 1), 1); /* Barrier #1 */
1746+
1747+
EXPECT_EQ(send(self->fd2, rec + 100, rec_len - 100, 0),
1748+
rec_len - 100);
1749+
1750+
pid2 = wait(&status);
1751+
EXPECT_EQ(pid2, ret);
1752+
EXPECT_EQ(status, 0);
1753+
} else {
1754+
close(p[0]);
1755+
1756+
/* Child should sleep in poll(), never get a wake */
1757+
pfd.fd = self->cfd2;
1758+
pfd.events = POLLIN;
1759+
EXPECT_EQ(poll(&pfd, 1, 5), 0);
1760+
1761+
EXPECT_EQ(write(p[1], &token, 1), 1); /* Barrier #1 */
1762+
1763+
pfd.fd = self->cfd2;
1764+
pfd.events = POLLIN;
1765+
EXPECT_EQ(poll(&pfd, 1, 5), 1);
1766+
1767+
exit(!_metadata->passed);
1768+
}
1769+
}
1770+
16401771
TEST(non_established) {
16411772
struct tls12_crypto_info_aes_gcm_256 tls12;
16421773
struct sockaddr_in addr;

0 commit comments

Comments
 (0)