]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolvectl: Only strip ifname suffixes when being resolvconf
authorMike Crowe <mac@mcrowe.com>
Thu, 24 Jun 2021 14:25:58 +0000 (15:25 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 25 Jun 2021 10:52:39 +0000 (12:52 +0200)
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.

src/resolve/resolvconf-compat.c
src/resolve/resolvectl.c
src/resolve/resolvectl.h

index b3f1e12fa6189fb97f8b4299c8a607e35575b770..93ded6d56437b3d51f34f3b19c3af22abef65a3c 100644 (file)
@@ -211,7 +211,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;
 
index 23f4ff1077b83629639a7d4503bb0f1a4966b31e..7d13ed39050209d374811a7c8506cd82dead2d3e 100644 (file)
@@ -104,18 +104,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();
 
@@ -138,6 +131,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];
 
index 468a87957dd4447781b8917d5ab4b7223a2ac9a8..1d0f14734836966603f0c0a1f3660e7ba7f545cf 100644 (file)
@@ -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);