nspawn: rework how we determine private networking settings

Make sure we acquire CAP_NET_ADMIN if we require virtual networking.

Make sure we imply virtual ethernet correctly when bridge is request.

Fixes: #1511
Fixes: #1554
Fixes: #1590
This commit is contained in:
Lennart Poettering
2015-10-22 01:59:25 +02:00
parent a2c90f05f1
commit 0e2656744f
3 changed files with 36 additions and 8 deletions
+13 -8
View File
@@ -2912,11 +2912,17 @@ static int load_settings(void) {
}
if ((arg_settings_mask & SETTING_CAPABILITY) == 0) {
uint64_t plus;
if (!arg_settings_trusted && settings->capability != 0)
log_warning("Ignoring Capability= setting, file %s is not trusted.", p);
else
arg_retain |= settings->capability;
plus = settings->capability;
if (settings_private_network(settings))
plus |= (1ULL << CAP_NET_ADMIN);
if (!arg_settings_trusted && plus != 0) {
if (settings->capability != 0)
log_warning("Ignoring Capability= setting, file %s is not trusted.", p);
} else
arg_retain |= plus;
arg_retain &= ~settings->drop_capability;
}
@@ -2972,6 +2978,9 @@ static int load_settings(void) {
if (!arg_settings_trusted)
log_warning("Ignoring network settings, file %s is not trusted.", p);
else {
arg_network_veth = settings_private_network(settings);
arg_private_network = settings_private_network(settings);
strv_free(arg_network_interfaces);
arg_network_interfaces = settings->network_interfaces;
settings->network_interfaces = NULL;
@@ -2987,10 +2996,6 @@ static int load_settings(void) {
free(arg_network_bridge);
arg_network_bridge = settings->network_bridge;
settings->network_bridge = NULL;
arg_network_veth = settings->network_veth > 0 || settings->network_bridge;
arg_private_network = true; /* all these settings imply private networking */
}
}