]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-ndisc: fix memleak and fd leak
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 20 Jan 2023 05:37:12 +0000 (14:37 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 20 Jan 2023 05:54:53 +0000 (14:54 +0900)
Fixes issues reported at #22576.

src/libsystemd-network/test-ndisc-ra.c
src/libsystemd-network/test-ndisc-rs.c

index 001df4d473915a039561ae240efaf58dc2d69805..bd8c0fd426a1dcbd115fc883778e0f1fdb3cddeb 100644 (file)
@@ -53,7 +53,6 @@ static uint8_t advertisement[] = {
 
 static bool test_stopped;
 static int test_fd[2];
-static sd_event_source *recv_router_advertisement;
 static struct {
         struct in6_addr address;
         unsigned char prefixlen;
@@ -281,9 +280,9 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
 }
 
 TEST(ra) {
-        sd_event *e;
-        sd_radv *ra;
-        unsigned i;
+        _cleanup_(sd_event_unrefp) sd_event *e = NULL;
+        _cleanup_(sd_event_source_unrefp) sd_event_source *recv_router_advertisement = NULL;
+        _cleanup_(sd_radv_unrefp) sd_radv *ra = NULL;
 
         assert_se(socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, test_fd) >= 0);
 
@@ -303,7 +302,7 @@ TEST(ra) {
         assert_se(sd_radv_set_rdnss(ra, 60, &test_rdnss, 1) >= 0);
         assert_se(sd_radv_set_dnssl(ra, 60, (char **)test_dnssl) >= 0);
 
-        for (i = 0; i < ELEMENTSOF(prefix); i++) {
+        for (unsigned i = 0; i < ELEMENTSOF(prefix); i++) {
                 sd_radv_prefix *p;
 
                 printf("Test prefix %u\n", i);
@@ -324,8 +323,8 @@ TEST(ra) {
                 assert_se(!p);
         }
 
-        assert_se(sd_event_add_io(e, &recv_router_advertisement, test_fd[0],
-                                  EPOLLIN, radv_recv, ra) >= 0);
+        assert_se(sd_event_add_io(e, &recv_router_advertisement, test_fd[0], EPOLLIN, radv_recv, ra) >= 0);
+        assert_se(sd_event_source_set_io_fd_own(recv_router_advertisement, true) >= 0);
 
         assert_se(sd_event_add_time_relative(e, NULL, CLOCK_BOOTTIME,
                                              2 * USEC_PER_SEC, 0,
@@ -334,13 +333,6 @@ TEST(ra) {
         assert_se(sd_radv_start(ra) >= 0);
 
         assert_se(sd_event_loop(e) >= 0);
-
-        ra = sd_radv_unref(ra);
-        assert_se(!ra);
-
-        close(test_fd[0]);
-
-        sd_event_unref(e);
 }
 
 DEFINE_TEST_MAIN(LOG_DEBUG);
index 3c679f60b547c91b07921d0b88c2ec4456d5f34c..e501b6437744bc21edc16e5c99f362b0d2460d8e 100644 (file)
@@ -10,6 +10,7 @@
 #include "sd-ndisc.h"
 
 #include "alloc-util.h"
+#include "fd-util.h"
 #include "hexdecoct.h"
 #include "icmp6-util.h"
 #include "socket-util.h"
@@ -255,8 +256,8 @@ static void test_callback(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router
 }
 
 TEST(rs) {
-        sd_event *e;
-        sd_ndisc *nd;
+        _cleanup_(sd_event_unrefp) sd_event *e = NULL;
+        _cleanup_(sd_ndisc_unrefp) sd_ndisc *nd = NULL;
 
         send_ra_function = send_ra;
 
@@ -279,17 +280,13 @@ TEST(rs) {
         assert_se(sd_ndisc_start(nd) >= 0);
         assert_se(sd_ndisc_start(nd) >= 0);
         assert_se(sd_ndisc_stop(nd) >= 0);
+        test_fd[1] = safe_close(test_fd[1]);
 
         assert_se(sd_ndisc_start(nd) >= 0);
 
         assert_se(sd_event_loop(e) >= 0);
 
-        nd = sd_ndisc_unref(nd);
-        assert_se(!nd);
-
-        close(test_fd[1]);
-
-        sd_event_unref(e);
+        test_fd[1] = safe_close(test_fd[1]);
 }
 
 static int test_timeout_value(uint8_t flags) {
@@ -342,8 +339,8 @@ static int test_timeout_value(uint8_t flags) {
 }
 
 TEST(timeout) {
-        sd_event *e;
-        sd_ndisc *nd;
+        _cleanup_(sd_event_unrefp) sd_event *e = NULL;
+        _cleanup_(sd_ndisc_unrefp) sd_ndisc *nd = NULL;
 
         send_ra_function = test_timeout_value;
 
@@ -367,9 +364,7 @@ TEST(timeout) {
 
         assert_se(sd_event_loop(e) >= 0);
 
-        nd = sd_ndisc_unref(nd);
-
-        sd_event_unref(e);
+        test_fd[1] = safe_close(test_fd[1]);
 }
 
 DEFINE_TEST_MAIN(LOG_DEBUG);