Compare commits

..

3 Commits

Author SHA1 Message Date
Yu Watanabe 91e50467f5
Merge pull request #14761 from keszybz/link-network-no-match
Refuse .network and .link files with no matches
2020-02-04 20:26:37 +09:00
Zbigniew Jędrzejewski-Szmek dade734917 network,udev: refuse .link and .network settings with no matches
Two releases ago we started warning about this, and I think it is now to turn
this into a hard error. People get bitten by this every once in a while, and
there doesn't see to be any legitimate use case where the same .link or
.network files should be applied to _all_ interfaces, since in particular that
configuration would apply both to lo and any other interfaces. And if for
whatever reason that is actually desired, OriginalName=* or Name=* can be
easily added to silence the warning and achieve the effect.

(The case described in #12098 is particularly nasty: 'echo -n >foo.network'
creates a mask file, 'echo >foo.network' creates a "match all" file.)

Fixes #717, #12098 for realz now.
2020-02-04 08:45:52 +01:00
Zbigniew Jędrzejewski-Szmek e519e20ae1 test-network: do not fail if lo has a .network file
Fixes #9895.
2020-02-04 08:30:40 +01:00
3 changed files with 20 additions and 12 deletions

View File

@ -164,10 +164,10 @@ int network_verify(Network *network) {
strv_isempty(network->match_path) && strv_isempty(network->match_driver) && strv_isempty(network->match_path) && strv_isempty(network->match_driver) &&
strv_isempty(network->match_type) && strv_isempty(network->match_name) && strv_isempty(network->match_type) && strv_isempty(network->match_name) &&
strv_isempty(network->match_property) && strv_isempty(network->match_ssid) && !network->conditions) strv_isempty(network->match_property) && strv_isempty(network->match_ssid) && !network->conditions)
log_warning("%s: No valid settings found in the [Match] section. " return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"The file will match all interfaces. " "%s: No valid settings found in the [Match] section, ignoring file. "
"If that is intended, please add Name=* in the [Match] section.", "To match all interfaces, add Name=* in the [Match] section.",
network->filename); network->filename);
/* skip out early if configuration does not match the environment */ /* skip out early if configuration does not match the environment */
if (!condition_test_list(network->conditions, NULL, NULL, NULL)) if (!condition_test_list(network->conditions, NULL, NULL, NULL))

View File

@ -122,11 +122,18 @@ static int test_load_config(Manager *manager) {
static void test_network_get(Manager *manager, sd_device *loopback) { static void test_network_get(Manager *manager, sd_device *loopback) {
Network *network; Network *network;
const struct ether_addr mac = ETHER_ADDR_NULL; const struct ether_addr mac = ETHER_ADDR_NULL;
int r;
/* let's assume that the test machine does not have a .network file /* Let's hope that the test machine does not have a .network file that applies to loopback device…
that applies to the loopback device... */ * But it is still possible, so let's allow that case too. */
assert_se(network_get(manager, loopback, "lo", NULL, &mac, &mac, 0, NULL, NULL, &network) == -ENOENT); r = network_get(manager, loopback, "lo", NULL, &mac, &mac, 0, NULL, NULL, &network);
assert_se(!network); if (r == -ENOENT)
/* The expected case */
assert_se(!network);
else if (r >= 0)
assert_se(network);
else
assert_not_reached("bad error!");
} }
static void test_address_equality(void) { static void test_address_equality(void) {

View File

@ -162,11 +162,12 @@ int link_load_one(link_config_ctx *ctx, const char *filename) {
if (set_isempty(link->match_mac) && set_isempty(link->match_permanent_mac) && if (set_isempty(link->match_mac) && set_isempty(link->match_permanent_mac) &&
strv_isempty(link->match_path) && strv_isempty(link->match_driver) && strv_isempty(link->match_type) && strv_isempty(link->match_path) && strv_isempty(link->match_driver) && strv_isempty(link->match_type) &&
strv_isempty(link->match_name) && strv_isempty(link->match_property) && !link->conditions) strv_isempty(link->match_name) && strv_isempty(link->match_property) && !link->conditions) {
log_warning("%s: No valid settings found in the [Match] section. " log_warning("%s: No valid settings found in the [Match] section, ignoring file. "
"The file will match all interfaces. " "To match all interfaces, add OriginalName=* in the [Match] section.",
"If that is intended, please add OriginalName=* in the [Match] section.",
filename); filename);
return 0;
}
if (!condition_test_list(link->conditions, NULL, NULL, NULL)) { if (!condition_test_list(link->conditions, NULL, NULL, NULL)) {
log_debug("%s: Conditions do not match the system environment, skipping.", filename); log_debug("%s: Conditions do not match the system environment, skipping.", filename);