]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: refuse to override predefined route table name 28387/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 14 Jul 2023 07:08:03 +0000 (16:08 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 14 Jul 2023 17:56:25 +0000 (02:56 +0900)
man/networkd.conf.xml
src/network/networkd-route-util.c
src/network/test-network.c

index abf47d17b61e6a8dbd8bf64604642ba32f30bc74..bf597cac2ecb0e70ccb5d792e95d07e5fd77bd9a 100644 (file)
         colon, i.e., <literal><replaceable>name</replaceable>:<replaceable>number</replaceable></literal>.
         The route table name must not be <literal>default</literal>, <literal>main</literal>, or
         <literal>local</literal>, as these route table names are predefined with route table number 253,
-        254, and 255, respectively. The route table number must be an integer in the range 1…4294967295.
-        This setting can be specified multiple times. If an empty string is specified, then the list
-        specified earlier are cleared. Defaults to unset.</para></listitem>
+        254, and 255, respectively. The route table number must be an integer in the range 1…4294967295,
+        except for predefined numbers 253, 254, and 255. This setting can be specified multiple times.
+        If an empty string is specified, then the list specified earlier are cleared. Defaults to unset.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
index aa7a4f93b36c4867a8dd62f7e593c8e712d3ff82..9831a84991249d387bac369b35085534a624f4b0 100644 (file)
@@ -501,9 +501,10 @@ int config_parse_route_table_names(
                                    "Route table name cannot be numeric. Ignoring assignment: %s:%s", name, num);
                         continue;
                 }
-                if (STR_IN_SET(name, "default", "main", "local")) {
+                if (route_table_from_string(name) >= 0) {
                         log_syntax(unit, LOG_WARNING, filename, line, 0,
-                                   "Route table name %s is already predefined. Ignoring assignment: %s:%s", name, name, num);
+                                   "Route table name %s is predefined for %i. Ignoring assignment: %s:%s",
+                                   name, route_table_from_string(name), name, num);
                         continue;
                 }
 
@@ -518,6 +519,12 @@ int config_parse_route_table_names(
                                    "Invalid route table number, ignoring assignment: %s:%s", name, num);
                         continue;
                 }
+                if (route_table_to_string(table)) {
+                        log_syntax(unit, LOG_WARNING, filename, line, 0,
+                                   "Route table name for %s is predefined (%s). Ignoring assignment: %s:%s",
+                                   num, route_table_to_string(table), name, num);
+                        continue;
+                }
 
                 r = hashmap_ensure_put(&m->route_table_numbers_by_name, &string_hash_ops_free, name, UINT32_TO_PTR(table));
                 if (r == -ENOMEM)
index a8db2029414d3abf7ce61be8662b3345fedeae6b..35592e07339aa84ae33ecad60e4df239b0a923b1 100644 (file)
@@ -153,6 +153,7 @@ static void test_route_tables(Manager *manager) {
 
         /* Invalid pairs */
         assert_se(config_parse_route_table_names("manager", "filename", 1, "section", 1, "RouteTable", 0, "main:123 default:333 local:999", manager, manager) >= 0);
+        assert_se(config_parse_route_table_names("manager", "filename", 1, "section", 1, "RouteTable", 0, "xxx:253 yyy:254 local:255", manager, manager) >= 0);
         assert_se(config_parse_route_table_names("manager", "filename", 1, "section", 1, "RouteTable", 0, "1234:321 :567 hoge:foo aaa:-888", manager, manager) >= 0);
         assert_se(!manager->route_table_names_by_number);
         assert_se(!manager->route_table_numbers_by_name);