resolvectl: Only strip ifname suffixes when being resolvconf
authorMike Crowe <mac@mcrowe.com>
Thu, 24 Jun 2021 14:25:58 +0000 (15:25 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 12 Jul 2021 11:30:53 +0000 (13:30 +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.

(cherry picked from commit 7875170f01991a1d28cfe284cc7075630cd69055)

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 52bbae3293b8283f5e25468e6e7f3dccc4029b45..753e9cc4cf3a668b74f596650ef3e0bcb4acf7f7 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);