summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-09-29 17:32:55 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-09-29 20:50:37 +0900
commit4c78dc17e533b382af0db1cbb08aa89b1b36885f (patch)
tree80f6c357f92a51d8fa3953fec2beac9ad8573d73 /src
parent92fc611cac3cf251e12513ea9fab4a449fde34f6 (diff)
downloadsystemd-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.c2
-rw-r--r--src/network/fuzz-network-parser.c2
-rw-r--r--src/network/networkd-link.c19
-rw-r--r--src/network/networkd-lldp-rx.c4
-rw-r--r--src/network/networkd-manager.c7
-rw-r--r--src/network/networkd-manager.h5
-rw-r--r--src/network/networkd-state-file.c9
-rw-r--r--src/network/networkd.c4
-rw-r--r--src/network/test-network.c4
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);