From: Yu Watanabe Date: Thu, 10 Mar 2022 05:40:18 +0000 (+0900) Subject: conf-parser: introduce config_parse_dns_name() and config_parse_hostname() X-Git-Tag: v251-rc1~165^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa787a13e219c9c342abb9bb2353a1f2cc16961a;p=thirdparty%2Fsystemd.git conf-parser: introduce config_parse_dns_name() and config_parse_hostname() This makes nspawn refuse hostnames which are invalid DNS domain names. --- diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 5dae7b4de11..cdd2ef48d98 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -982,52 +982,6 @@ int config_parse_domains( } } -int config_parse_hostname( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - char **hostname = data; - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(data); - - if (isempty(rvalue)) { - *hostname = mfree(*hostname); - return 0; - } - - if (!hostname_is_valid(rvalue, 0)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "Hostname is not valid, ignoring assignment: %s", rvalue); - return 0; - } - - r = dns_name_is_valid(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to check validity of hostname '%s', ignoring assignment: %m", rvalue); - return 0; - } - if (r == 0) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "Hostname is not a valid DNS domain name, ignoring assignment: %s", rvalue); - return 0; - } - - return free_and_strdup_warn(hostname, rvalue); -} - int config_parse_timezone( const char *unit, const char *filename, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 74d71735fbc..c764f69f529 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -374,7 +374,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_stacked_netdev); CONFIG_PARSER_PROTOTYPE(config_parse_tunnel); CONFIG_PARSER_PROTOTYPE(config_parse_domains); CONFIG_PARSER_PROTOTYPE(config_parse_dns); -CONFIG_PARSER_PROTOTYPE(config_parse_hostname); CONFIG_PARSER_PROTOTYPE(config_parse_timezone); CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors); CONFIG_PARSER_PROTOTYPE(config_parse_ntp); diff --git a/src/nspawn/nspawn-settings.c b/src/nspawn/nspawn-settings.c index 1f58bf3ed48..3a5d72549a1 100644 --- a/src/nspawn/nspawn-settings.c +++ b/src/nspawn/nspawn-settings.c @@ -710,31 +710,6 @@ int config_parse_syscall_filter( } } -int config_parse_hostname( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - char **s = data; - - assert(rvalue); - assert(s); - - if (!hostname_is_valid(rvalue, 0)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid hostname, ignoring: %s", rvalue); - return 0; - } - - return free_and_strdup_warn(s, empty_to_null(rvalue)); -} - int config_parse_oom_score_adjust( const char *unit, const char *filename, diff --git a/src/nspawn/nspawn-settings.h b/src/nspawn/nspawn-settings.h index 59397ca54be..004b663e9e4 100644 --- a/src/nspawn/nspawn-settings.h +++ b/src/nspawn/nspawn-settings.h @@ -264,7 +264,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_boot); CONFIG_PARSER_PROTOTYPE(config_parse_pid2); CONFIG_PARSER_PROTOTYPE(config_parse_private_users); CONFIG_PARSER_PROTOTYPE(config_parse_syscall_filter); -CONFIG_PARSER_PROTOTYPE(config_parse_hostname); CONFIG_PARSER_PROTOTYPE(config_parse_oom_score_adjust); CONFIG_PARSER_PROTOTYPE(config_parse_cpu_affinity); CONFIG_PARSER_PROTOTYPE(config_parse_resolv_conf); diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index ceadfdb7233..0ae499814e2 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -11,12 +11,14 @@ #include "conf-files.h" #include "conf-parser.h" #include "def.h" +#include "dns-domain.h" #include "escape.h" #include "ether-addr-util.h" #include "extract-word.h" #include "fd-util.h" #include "fileio.h" #include "fs-util.h" +#include "hostname-util.h" #include "in-addr-util.h" #include "log.h" #include "macro.h" @@ -906,6 +908,78 @@ int config_parse_string( return free_and_strdup_warn(s, empty_to_null(rvalue)); } +int config_parse_dns_name( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char **hostname = ASSERT_PTR(data); + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *hostname = mfree(*hostname); + return 0; + } + + r = dns_name_is_valid(rvalue); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to check validity of DNS domain name '%s', ignoring assignment: %m", rvalue); + return 0; + } + if (r == 0) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Specified invalid DNS domain name, ignoring assignment: %s", rvalue); + return 0; + } + + return free_and_strdup_warn(hostname, rvalue); +} + +int config_parse_hostname( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char **hostname = ASSERT_PTR(data); + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *hostname = mfree(*hostname); + return 0; + } + + if (!hostname_is_valid(rvalue, 0)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Specified invalid hostname, ignoring assignment: %s", rvalue); + return 0; + } + + return config_parse_dns_name(unit, filename, line, section, section_line, + lvalue, ltype, rvalue, data, userdata); +} + int config_parse_path( const char *unit, const char *filename, diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index f3044b0ca6c..94778af4588 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -168,6 +168,8 @@ CONFIG_PARSER_PROTOTYPE(config_parse_bool); CONFIG_PARSER_PROTOTYPE(config_parse_id128); CONFIG_PARSER_PROTOTYPE(config_parse_tristate); CONFIG_PARSER_PROTOTYPE(config_parse_string); +CONFIG_PARSER_PROTOTYPE(config_parse_dns_name); +CONFIG_PARSER_PROTOTYPE(config_parse_hostname); CONFIG_PARSER_PROTOTYPE(config_parse_path); CONFIG_PARSER_PROTOTYPE(config_parse_strv); CONFIG_PARSER_PROTOTYPE(config_parse_sec);