diff options
author | Mike Crowe <mac@mcrowe.com> | 2021-06-24 15:25:58 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-07-20 17:59:39 +0200 |
commit | 0d18f706a3816464053003b706bb6b2c27de12d1 (patch) | |
tree | 39eb2a9e3de9de2e2961fe789c0d5dd8c93f2f69 | |
parent | 7ebb0f11eaae93cbf54af40d66a6cab36ba29d72 (diff) | |
download | systemd-0d18f706a3816464053003b706bb6b2c27de12d1.tar.gz |
resolvectl: Only strip ifname suffixes when being resolvconf
Only treat interface names containing dots specially when resolvectl is
pretending to be resolvconf to fix
https://github.com/systemd/systemd/issues/20014 .
Move the special suffix-stripping behaviour of ifname_mangle out to the
new ifname_resolvconf_mangle to be called from resolvconf only.
(cherry picked from commit 7875170f01991a1d28cfe284cc7075630cd69055)
(cherry picked from commit 6ec5680beaa8df4b4b87e9aa614d29561c0e98fe)
-rw-r--r-- | src/resolve/resolvconf-compat.c | 2 | ||||
-rw-r--r-- | src/resolve/resolvectl.c | 27 | ||||
-rw-r--r-- | src/resolve/resolvectl.h | 1 |
3 files changed, 21 insertions, 9 deletions
diff --git a/src/resolve/resolvconf-compat.c b/src/resolve/resolvconf-compat.c index 5bc936faa7..8dc559801d 100644 --- a/src/resolve/resolvconf-compat.c +++ b/src/resolve/resolvconf-compat.c @@ -212,7 +212,7 @@ int resolvconf_parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected interface name as argument."); - r = ifname_mangle(argv[optind]); + r = ifname_resolvconf_mangle(argv[optind]); if (r <= 0) return r; diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index b479335769..3a805245de 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -100,18 +100,11 @@ static int interface_info_compare(const InterfaceInfo *a, const InterfaceInfo *b int ifname_mangle(const char *s) { _cleanup_free_ char *iface = NULL; - const char *dot; int ifi; assert(s); - dot = strchr(s, '.'); - if (dot) { - log_debug("Ignoring protocol specifier '%s'.", dot + 1); - iface = strndup(s, dot - s); - - } else - iface = strdup(s); + iface = strdup(s); if (!iface) return log_oom(); @@ -134,6 +127,24 @@ int ifname_mangle(const char *s) { return 1; } +int ifname_resolvconf_mangle(const char *s) { + const char *dot; + + assert(s); + + dot = strchr(s, '.'); + if (dot) { + _cleanup_free_ char *iface = NULL; + + log_debug("Ignoring protocol specifier '%s'.", dot + 1); + iface = strndup(s, dot - s); + if (!iface) + return log_oom(); + return ifname_mangle(iface); + } else + return ifname_mangle(s); +} + static void print_source(uint64_t flags, usec_t rtt) { char rtt_str[FORMAT_TIMESTAMP_MAX]; diff --git a/src/resolve/resolvectl.h b/src/resolve/resolvectl.h index 830c81d692..3d55bf78da 100644 --- a/src/resolve/resolvectl.h +++ b/src/resolve/resolvectl.h @@ -27,3 +27,4 @@ extern char **arg_set_domain; extern bool arg_ifindex_permissive; int ifname_mangle(const char *s); +int ifname_resolvconf_mangle(const char *s); |