]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: re-implement socket_address_parse_netlink() by using extract_first_word()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 16 Feb 2019 18:27:57 +0000 (03:27 +0900)
committerLennart Poettering <lennart@poettering.net>
Thu, 21 Feb 2019 10:30:49 +0000 (11:30 +0100)
This drops support of trailing white space when a multicast group is
specified.

Fixes one of issues in #11738.

src/basic/socket-util.c
src/test/test-socket-util.c

index 91bf801cdf26c470e2df03a2e27ab9eebf052e0e..a8c9115dc20e5a4ab7d09f816f350b2ce569e087 100644 (file)
@@ -235,23 +235,32 @@ int socket_address_parse_and_warn(SocketAddress *a, const char *s) {
 }
 
 int socket_address_parse_netlink(SocketAddress *a, const char *s) {
-        int family;
+        _cleanup_free_ char *word = NULL;
         unsigned group = 0;
-        _cleanup_free_ char *sfamily = NULL;
+        int family, r;
+
         assert(a);
         assert(s);
 
         zero(*a);
         a->type = SOCK_RAW;
 
-        errno = 0;
-        if (sscanf(s, "%ms %u", &sfamily, &group) < 1)
-                return errno > 0 ? -errno : -EINVAL;
+        r = extract_first_word(&s, &word, NULL, 0);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return -EINVAL;
 
-        family = netlink_family_from_string(sfamily);
+        family = netlink_family_from_string(word);
         if (family < 0)
                 return -EINVAL;
 
+        if (!isempty(s)) {
+                r = safe_atou(s, &group);
+                if (r < 0)
+                        return r;
+        }
+
         a->sockaddr.nl.nl_family = AF_NETLINK;
         a->sockaddr.nl.nl_groups = group;
 
index 07ff4878340f057d8dfd10733e4f4613b67ffd42..cd4e78489442f43432d372814ecc891469b7aae0 100644 (file)
@@ -164,21 +164,36 @@ static void test_socket_address_parse_netlink(void) {
         assert_se(socket_address_parse_netlink(&a, "junk") < 0);
         assert_se(socket_address_parse_netlink(&a, "") < 0);
 
+        assert_se(socket_address_parse_netlink(&a, "route") >= 0);
+        assert_se(a.sockaddr.nl.nl_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_groups == 0);
+        assert_se(a.protocol == NETLINK_ROUTE);
         assert_se(socket_address_parse_netlink(&a, "route") >= 0);
         assert_se(socket_address_parse_netlink(&a, "route 10") >= 0);
-        assert_se(a.sockaddr.sa.sa_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_groups == 10);
         assert_se(a.protocol == NETLINK_ROUTE);
 
         /* With spaces and tabs */
         assert_se(socket_address_parse_netlink(&a, " kobject-uevent ") >= 0);
-        assert_se(socket_address_parse_netlink(&a, " \t kobject-uevent \t 10 \t") >= 0);
-        assert_se(a.sockaddr.sa.sa_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_groups == 0);
+        assert_se(a.protocol == NETLINK_KOBJECT_UEVENT);
+        assert_se(socket_address_parse_netlink(&a, " \t kobject-uevent \t 10") >= 0);
+        assert_se(a.sockaddr.nl.nl_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_groups == 10);
         assert_se(a.protocol == NETLINK_KOBJECT_UEVENT);
-
         assert_se(socket_address_parse_netlink(&a, "kobject-uevent\t10") >= 0);
-        assert_se(a.sockaddr.sa.sa_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_family == AF_NETLINK);
+        assert_se(a.sockaddr.nl.nl_groups == 10);
         assert_se(a.protocol == NETLINK_KOBJECT_UEVENT);
 
+        /* trailing space is not supported */
+        assert_se(socket_address_parse_netlink(&a, "kobject-uevent\t10 ") < 0);
+
+        /* Group must be unsigned */
+        assert_se(socket_address_parse_netlink(&a, "kobject-uevent -1") < 0);
+
         /* oss-fuzz #6884 */
         assert_se(socket_address_parse_netlink(&a, "\xff") < 0);
 }