diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-29 17:32:55 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-29 20:50:37 +0900 |
commit | 4c78dc17e533b382af0db1cbb08aa89b1b36885f (patch) | |
tree | 80f6c357f92a51d8fa3953fec2beac9ad8573d73 /src | |
parent | 92fc611cac3cf251e12513ea9fab4a449fde34f6 (diff) | |
download | systemd-4c78dc17e533b382af0db1cbb08aa89b1b36885f.tar.gz |
network: do not update state files when running in test mode
Fixes #20862.
Diffstat (limited to 'src')
-rw-r--r-- | src/network/fuzz-netdev-parser.c | 2 | ||||
-rw-r--r-- | src/network/fuzz-network-parser.c | 2 | ||||
-rw-r--r-- | src/network/networkd-link.c | 19 | ||||
-rw-r--r-- | src/network/networkd-lldp-rx.c | 4 | ||||
-rw-r--r-- | src/network/networkd-manager.c | 7 | ||||
-rw-r--r-- | src/network/networkd-manager.h | 5 | ||||
-rw-r--r-- | src/network/networkd-state-file.c | 9 | ||||
-rw-r--r-- | src/network/networkd.c | 4 | ||||
-rw-r--r-- | src/network/test-network.c | 4 |
9 files changed, 34 insertions, 22 deletions
diff --git a/src/network/fuzz-netdev-parser.c b/src/network/fuzz-netdev-parser.c index ddabe1c27b..bb4b487ab2 100644 --- a/src/network/fuzz-netdev-parser.c +++ b/src/network/fuzz-netdev-parser.c @@ -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; } diff --git a/src/network/fuzz-network-parser.c b/src/network/fuzz-network-parser.c index 1292ebacd1..9290aa58d6 100644 --- a/src/network/fuzz-network-parser.c +++ b/src/network/fuzz-network-parser.c @@ -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; } diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 43428182e6..39a87296c3 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -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) diff --git a/src/network/networkd-lldp-rx.c b/src/network/networkd-lldp-rx.c index c441047a37..3ae4cada9e 100644 --- a/src/network/networkd-lldp-rx.c +++ b/src/network/networkd-lldp-rx.c @@ -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); diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index f9cfb64512..5c6afdb0ff 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -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, diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index 9fce86bb04..365b567d1e 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -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); diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index 745aa4a995..7a0abc5f5b 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -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; diff --git a/src/network/networkd.c b/src/network/networkd.c index b79cac1418..d274885264 100644 --- a/src/network/networkd.c +++ b/src/network/networkd.c @@ -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"); diff --git a/src/network/test-network.c b/src/network/test-network.c index 5498d9ef04..65627182cd 100644 --- a/src/network/test-network.c +++ b/src/network/test-network.c @@ -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); |