Message ID | 20220829170401.834298-14-konstantin.meskhidze@huawei.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Network support for Landlock | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch, async |
On 29/08/2022 19:03, Konstantin Meskhidze wrote: > Adds two selftests for connect() action with AF_UNSPEC family flag. > The one is with no landlock restrictions allows to disconnect already > connected socket with connect(..., AF_UNSPEC, ...): > - connect_afunspec_no_restictions; Typo: "restrictions" (everywhere) > The second one refuses landlocked process to disconnect already > connected socket: > - connect_afunspec_with_restictions; > > Signed-off-by: Konstantin Meskhidze <konstantin.meskhidze@huawei.com> > --- > > Changes since v6: > * None. > > Changes since v5: > * Formats code with clang-format-14. > > Changes since v4: > * Refactors code with self->port, self->addr4 variables. > * Adds bind() hook check for with AF_UNSPEC family. > > Changes since v3: > * Adds connect_afunspec_no_restictions test. > * Adds connect_afunspec_with_restictions test. > > --- > tools/testing/selftests/landlock/net_test.c | 113 ++++++++++++++++++++ > 1 file changed, 113 insertions(+) > > diff --git a/tools/testing/selftests/landlock/net_test.c b/tools/testing/selftests/landlock/net_test.c > index 9c3d1e425439..40aef7c683af 100644 > --- a/tools/testing/selftests/landlock/net_test.c > +++ b/tools/testing/selftests/landlock/net_test.c > @@ -351,4 +351,117 @@ TEST_F(socket, connect_with_restrictions) > ASSERT_EQ(1, WIFEXITED(status)); > ASSERT_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); > } > + > +TEST_F(socket, connect_afunspec_no_restictions) > +{ > + int sockfd; > + pid_t child; > + int status; > + > + /* Creates a server socket 1. */ > + sockfd = create_socket_variant(variant, SOCK_STREAM); > + ASSERT_LE(0, sockfd); > + > + /* Binds the socket 1 to address with port[0]. */ > + ASSERT_EQ(0, bind_variant(variant, sockfd, self, 0)); > + > + /* Makes connection to the socket with port[0]. */ > + ASSERT_EQ(0, connect_variant(variant, sockfd, self, 0)); > + > + child = fork(); > + ASSERT_LE(0, child); > + if (child == 0) { > + struct sockaddr addr_unspec = { .sa_family = AF_UNSPEC }; You can constify several variable like this one (in all tests).
9/6/2022 11:09 AM, Mickaël Salaün пишет: > > On 29/08/2022 19:03, Konstantin Meskhidze wrote: >> Adds two selftests for connect() action with AF_UNSPEC family flag. >> The one is with no landlock restrictions allows to disconnect already >> connected socket with connect(..., AF_UNSPEC, ...): >> - connect_afunspec_no_restictions; > > Typo: "restrictions" (everywhere) > My mistake. Thanks. > >> The second one refuses landlocked process to disconnect already >> connected socket: >> - connect_afunspec_with_restictions; >> >> Signed-off-by: Konstantin Meskhidze <konstantin.meskhidze@huawei.com> >> --- >> >> Changes since v6: >> * None. >> >> Changes since v5: >> * Formats code with clang-format-14. >> >> Changes since v4: >> * Refactors code with self->port, self->addr4 variables. >> * Adds bind() hook check for with AF_UNSPEC family. >> >> Changes since v3: >> * Adds connect_afunspec_no_restictions test. >> * Adds connect_afunspec_with_restictions test. >> >> --- >> tools/testing/selftests/landlock/net_test.c | 113 ++++++++++++++++++++ >> 1 file changed, 113 insertions(+) >> >> diff --git a/tools/testing/selftests/landlock/net_test.c b/tools/testing/selftests/landlock/net_test.c >> index 9c3d1e425439..40aef7c683af 100644 >> --- a/tools/testing/selftests/landlock/net_test.c >> +++ b/tools/testing/selftests/landlock/net_test.c >> @@ -351,4 +351,117 @@ TEST_F(socket, connect_with_restrictions) >> ASSERT_EQ(1, WIFEXITED(status)); >> ASSERT_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); >> } >> + >> +TEST_F(socket, connect_afunspec_no_restictions) >> +{ >> + int sockfd; >> + pid_t child; >> + int status; >> + >> + /* Creates a server socket 1. */ >> + sockfd = create_socket_variant(variant, SOCK_STREAM); >> + ASSERT_LE(0, sockfd); >> + >> + /* Binds the socket 1 to address with port[0]. */ >> + ASSERT_EQ(0, bind_variant(variant, sockfd, self, 0)); >> + >> + /* Makes connection to the socket with port[0]. */ >> + ASSERT_EQ(0, connect_variant(variant, sockfd, self, 0)); >> + >> + child = fork(); >> + ASSERT_LE(0, child); >> + if (child == 0) { >> + struct sockaddr addr_unspec = { .sa_family = AF_UNSPEC }; > > You can constify several variable like this one (in all tests). Got it. thanks. > > .
diff --git a/tools/testing/selftests/landlock/net_test.c b/tools/testing/selftests/landlock/net_test.c index 9c3d1e425439..40aef7c683af 100644 --- a/tools/testing/selftests/landlock/net_test.c +++ b/tools/testing/selftests/landlock/net_test.c @@ -351,4 +351,117 @@ TEST_F(socket, connect_with_restrictions) ASSERT_EQ(1, WIFEXITED(status)); ASSERT_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); } + +TEST_F(socket, connect_afunspec_no_restictions) +{ + int sockfd; + pid_t child; + int status; + + /* Creates a server socket 1. */ + sockfd = create_socket_variant(variant, SOCK_STREAM); + ASSERT_LE(0, sockfd); + + /* Binds the socket 1 to address with port[0]. */ + ASSERT_EQ(0, bind_variant(variant, sockfd, self, 0)); + + /* Makes connection to the socket with port[0]. */ + ASSERT_EQ(0, connect_variant(variant, sockfd, self, 0)); + + child = fork(); + ASSERT_LE(0, child); + if (child == 0) { + struct sockaddr addr_unspec = { .sa_family = AF_UNSPEC }; + + /* Child tries to disconnect already connected socket. */ + ASSERT_EQ(0, connect(sockfd, (struct sockaddr *)&addr_unspec, + sizeof(addr_unspec))); + _exit(_metadata->passed ? EXIT_SUCCESS : EXIT_FAILURE); + return; + } + /* Closes listening socket 1 for the parent. */ + ASSERT_EQ(0, close(sockfd)); + + ASSERT_EQ(child, waitpid(child, &status, 0)); + ASSERT_EQ(1, WIFEXITED(status)); + ASSERT_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); +} + +TEST_F(socket, connect_afunspec_with_restictions) +{ + int sockfd; + pid_t child; + int status; + + struct landlock_ruleset_attr ruleset_attr_1 = { + .handled_access_net = LANDLOCK_ACCESS_NET_BIND_TCP, + }; + struct landlock_net_service_attr net_service_1 = { + .allowed_access = LANDLOCK_ACCESS_NET_BIND_TCP, + + .port = self->port[0], + }; + + struct landlock_ruleset_attr ruleset_attr_2 = { + .handled_access_net = LANDLOCK_ACCESS_NET_BIND_TCP | + LANDLOCK_ACCESS_NET_CONNECT_TCP, + }; + struct landlock_net_service_attr net_service_2 = { + .allowed_access = LANDLOCK_ACCESS_NET_BIND_TCP | + LANDLOCK_ACCESS_NET_CONNECT_TCP, + + .port = self->port[0], + }; + + const int ruleset_fd_1 = landlock_create_ruleset( + &ruleset_attr_1, sizeof(ruleset_attr_1), 0); + ASSERT_LE(0, ruleset_fd_1); + + /* Allows bind operations to the port[0] socket. */ + ASSERT_EQ(0, landlock_add_rule(ruleset_fd_1, LANDLOCK_RULE_NET_SERVICE, + &net_service_1, 0)); + + /* Enforces the ruleset. */ + enforce_ruleset(_metadata, ruleset_fd_1); + + /* Creates a server socket 1. */ + sockfd = create_socket_variant(variant, SOCK_STREAM); + ASSERT_LE(0, sockfd); + + /* Binds the socket 1 to address with port[0]. */ + ASSERT_EQ(0, bind_variant(variant, sockfd, self, 0)); + + /* Makes connection to socket with port[0]. */ + ASSERT_EQ(0, connect_variant(variant, sockfd, self, 0)); + + const int ruleset_fd_2 = landlock_create_ruleset( + &ruleset_attr_2, sizeof(ruleset_attr_2), 0); + ASSERT_LE(0, ruleset_fd_2); + + /* Allows connect and bind operations to the port[0] socket. */ + ASSERT_EQ(0, landlock_add_rule(ruleset_fd_2, LANDLOCK_RULE_NET_SERVICE, + &net_service_2, 0)); + + /* Enforces the ruleset. */ + enforce_ruleset(_metadata, ruleset_fd_2); + + child = fork(); + ASSERT_LE(0, child); + if (child == 0) { + struct sockaddr addr_unspec = { .sa_family = AF_UNSPEC }; + + /* Child tries to disconnect already connected socket. */ + ASSERT_EQ(-1, connect(sockfd, (struct sockaddr *)&addr_unspec, + sizeof(addr_unspec))); + ASSERT_EQ(EACCES, errno); + _exit(_metadata->passed ? EXIT_SUCCESS : EXIT_FAILURE); + return; + } + /* Closes listening socket 1 for the parent. */ + ASSERT_EQ(0, close(sockfd)); + + ASSERT_EQ(child, waitpid(child, &status, 0)); + ASSERT_EQ(1, WIFEXITED(status)); + ASSERT_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); +} TEST_HARNESS_MAIN
Adds two selftests for connect() action with AF_UNSPEC family flag. The one is with no landlock restrictions allows to disconnect already connected socket with connect(..., AF_UNSPEC, ...): - connect_afunspec_no_restictions; The second one refuses landlocked process to disconnect already connected socket: - connect_afunspec_with_restictions; Signed-off-by: Konstantin Meskhidze <konstantin.meskhidze@huawei.com> --- Changes since v6: * None. Changes since v5: * Formats code with clang-format-14. Changes since v4: * Refactors code with self->port, self->addr4 variables. * Adds bind() hook check for with AF_UNSPEC family. Changes since v3: * Adds connect_afunspec_no_restictions test. * Adds connect_afunspec_with_restictions test. --- tools/testing/selftests/landlock/net_test.c | 113 ++++++++++++++++++++ 1 file changed, 113 insertions(+) -- 2.25.1