]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: do not update state files when running in test mode
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 29 Sep 2021 08:32:55 +0000 (17:32 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 29 Sep 2021 11:50:37 +0000 (20:50 +0900)
Fixes #20862.

src/network/fuzz-netdev-parser.c
src/network/fuzz-network-parser.c
src/network/networkd-link.c
src/network/networkd-lldp-rx.c
src/network/networkd-manager.c
src/network/networkd-manager.h
src/network/networkd-state-file.c
src/network/networkd.c
src/network/test-network.c

index ddabe1c27b1adfd77c3292d38c4ba47557097997..bb4b487ab21094628958529fdfd686eb78245dec 100644 (file)
@@ -19,7 +19,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
                 assert_se(fwrite(data, size, 1, f) == 1);
 
         fflush(f);
-        assert_se(manager_new(&manager) >= 0);
+        assert_se(manager_new(&manager, /* test_mode = */ true) >= 0);
         (void) netdev_load_one(manager, netdev_config);
         return 0;
 }
index 1292ebacd1776506c59b21a5a74ffb9b33ba6912..9290aa58d6ebd3e294452b229ec8d584a93ca25c 100644 (file)
@@ -22,7 +22,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
                 assert_se(fwrite(data, size, 1, f) == 1);
 
         fflush(f);
-        assert_se(manager_new(&manager) >= 0);
+        assert_se(manager_new(&manager, /* test_mode = */ true) >= 0);
         (void) network_load_one(manager, &manager->networks, network_config);
         return 0;
 }
index 43428182e6dae3262cb650455ea59368212e676f..39a87296c34397042f6723e6c39b5039ba9b1b3b 100644 (file)
@@ -982,7 +982,9 @@ static Link *link_drop(Link *link) {
 
         link_drop_from_master(link);
 
-        (void) unlink(link->state_file);
+        if (link->state_file)
+                (void) unlink(link->state_file);
+
         link_clean(link);
 
         STRV_FOREACH(n, link->alternative_names)
@@ -2358,14 +2360,17 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
                         return log_debug_errno(r, "rtnl: failed to exit IFLA_LINKINFO container: %m");
         }
 
-        if (asprintf(&state_file, "/run/systemd/netif/links/%d", ifindex) < 0)
-                return log_oom_debug();
+        if (!manager->test_mode) {
+                /* Do not update state files when running in test mode. */
+                if (asprintf(&state_file, "/run/systemd/netif/links/%d", ifindex) < 0)
+                        return log_oom_debug();
 
-        if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", ifindex) < 0)
-                return log_oom_debug();
+                if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", ifindex) < 0)
+                        return log_oom_debug();
 
-        if (asprintf(&lldp_file, "/run/systemd/netif/lldp/%d", ifindex) < 0)
-                return log_oom_debug();
+                if (asprintf(&lldp_file, "/run/systemd/netif/lldp/%d", ifindex) < 0)
+                        return log_oom_debug();
+        }
 
         link = new(Link, 1);
         if (!link)
index c441047a37d6fa75c5fa3432504836dcca3878e3..3ae4cada9e0fc5b9847e0b3891c27c96a3d15423 100644 (file)
@@ -114,7 +114,9 @@ int link_lldp_save(Link *link) {
         int n = 0, r, i;
 
         assert(link);
-        assert(link->lldp_file);
+
+        if (isempty(link->lldp_file))
+                return 0; /* Do not update state file when running in test mode. */
 
         if (!link->lldp_rx) {
                 (void) unlink(link->lldp_file);
index f9cfb6451283251cea545586eef055ae0b5e49eb..5c6afdb0ff7e95fd4b2185c2d2f8f842f217056e 100644 (file)
@@ -382,7 +382,7 @@ static int signal_restart_callback(sd_event_source *s, const struct signalfd_sig
         return sd_event_exit(sd_event_source_get_event(s), 0);
 }
 
-int manager_setup(Manager *m, bool test_mode) {
+int manager_setup(Manager *m) {
         int r;
 
         assert(m);
@@ -414,7 +414,7 @@ int manager_setup(Manager *m, bool test_mode) {
         if (r < 0)
                 return r;
 
-        if (test_mode)
+        if (m->test_mode)
                 return 0;
 
         r = manager_connect_bus(m);
@@ -444,7 +444,7 @@ int manager_setup(Manager *m, bool test_mode) {
         return 0;
 }
 
-int manager_new(Manager **ret) {
+int manager_new(Manager **ret, bool test_mode) {
         _cleanup_(manager_freep) Manager *m = NULL;
 
         m = new(Manager, 1);
@@ -452,6 +452,7 @@ int manager_new(Manager **ret) {
                 return -ENOMEM;
 
         *m = (Manager) {
+                .test_mode = test_mode,
                 .speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
                 .online_state = _LINK_ONLINE_STATE_INVALID,
                 .manage_foreign_routes = true,
index 9fce86bb04d7aa7f9da14caad3f517b7faac217a..365b567d1eda4d591553f766ba2ad5d1887fc138 100644 (file)
@@ -28,6 +28,7 @@ struct Manager {
         Hashmap *polkit_registry;
         int ethtool_fd;
 
+        bool test_mode;
         bool enumerating;
         bool dirty;
         bool restarting;
@@ -96,10 +97,10 @@ struct Manager {
         OrderedSet *request_queue;
 };
 
-int manager_new(Manager **ret);
+int manager_new(Manager **ret, bool test_mode);
 Manager* manager_free(Manager *m);
 
-int manager_setup(Manager *m, bool test_mode);
+int manager_setup(Manager *m);
 int manager_start(Manager *m);
 
 int manager_load_config(Manager *m);
index 745aa4a995e0f72ff0a6ab63a098c973a581dd1f..7a0abc5f5b2ac535ef0f6c49f03cf6db145a4378 100644 (file)
@@ -119,7 +119,9 @@ int manager_save(Manager *m) {
         int r;
 
         assert(m);
-        assert(m->state_file);
+
+        if (isempty(m->state_file))
+                return 0; /* Do not update state file when running in test mode. */
 
         HASHMAP_FOREACH(link, m->links_by_index) {
                 const struct in_addr *addresses;
@@ -423,10 +425,11 @@ int link_save(Link *link) {
         int r;
 
         assert(link);
-        assert(link->state_file);
-        assert(link->lease_file);
         assert(link->manager);
 
+        if (isempty(link->state_file))
+                return 0; /* Do not update state files when running in test mode. */
+
         if (link->state == LINK_STATE_LINGER)
                 return 0;
 
index b79cac1418ccea6c629c6146adae3b11fd425a42..d2748852641c4eb04f4168a86f189e7a612dfa94 100644 (file)
@@ -73,11 +73,11 @@ static int run(int argc, char *argv[]) {
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
 
-        r = manager_new(&m);
+        r = manager_new(&m, /* test_mode = */ false);
         if (r < 0)
                 return log_error_errno(r, "Could not create manager: %m");
 
-        r = manager_setup(m, /* test_mode = */ false);
+        r = manager_setup(m);
         if (r < 0)
                 return log_error_errno(r, "Could not setup manager: %m");
 
index 5498d9ef042d92fcc0a066c5e288085cc1543888..65627182cd63e5713bf14d7c47e2910e2bdbe1e1 100644 (file)
@@ -269,8 +269,8 @@ int main(void) {
         test_address_equality();
         test_dhcp_hostname_shorten_overlong();
 
-        assert_se(manager_new(&manager) >= 0);
-        assert_se(manager_setup(manager, /* test_mode = */ true) >= 0);
+        assert_se(manager_new(&manager, /* test_mode = */ true) >= 0);
+        assert_se(manager_setup(manager) >= 0);
 
         test_route_tables(manager);