]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: fix crash in parsing of SocketBind{Allow,Deny}=
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 5 May 2021 13:38:33 +0000 (15:38 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 5 May 2021 15:14:58 +0000 (17:14 +0200)
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33876.

src/core/load-fragment.c
test/fuzz/fuzz-unit-file/oss-fuzz-33876 [new file with mode: 0644]

index 4f506e51e8737e8c8ab6dcee7332eebe07982d87..cbc85d9695f2fd6b903aff4da5634bceee323a9b 100644 (file)
@@ -5670,11 +5670,11 @@ int config_parse_cgroup_socket_bind(
                 void *data,
                 void *userdata) {
         _cleanup_free_ CGroupSocketBindItem *item = NULL;
-        const char *address_family = NULL, *user_port;
+        const char *user_port;
         uint16_t nr_ports = 0, port_min = 0;
         CGroupSocketBindItem **head = data;
         _cleanup_free_ char *word = NULL;
-        int af = AF_UNSPEC, r;
+        int af, r;
 
         if (isempty(rvalue)) {
                 cgroup_context_remove_socket_bind(head);
@@ -5684,29 +5684,40 @@ int config_parse_cgroup_socket_bind(
         r = extract_first_word(&rvalue, &word, ":", 0);
         if (r == -ENOMEM)
                 return log_oom();
+        if (r <= 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Unable to parse %s= assignment, ignoring: %s", lvalue, rvalue);
+                return 0;
+        }
 
-        if (rvalue)
-                address_family = word;
-
-        if (address_family) {
-                if (streq(address_family, "IPv4"))
+        if (rvalue) {
+                if (streq(word, "IPv4"))
                         af = AF_INET;
-                else if (streq(address_family, "IPv6"))
+                else if (streq(word, "IPv6"))
                         af = AF_INET6;
-                else
-                        return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
-                                        "Only IPv4 or IPv6 protocols are supported, ignoring");
+                else {
+                        log_syntax(unit, LOG_WARNING, filename, line, 0,
+                                   "Only IPv4 and IPv6 protocols are supported, ignoring.");
+                        return 0;
+                }
+
+                user_port = rvalue;
+        } else {
+                af = AF_UNSPEC;
+                user_port = word;
         }
 
-        user_port = rvalue ?: word;
         if (!streq(user_port, "any")) {
                 uint16_t port_max;
 
                 r = parse_ip_port_range(user_port, &port_min, &port_max);
                 if (r == -ENOMEM)
                         return log_oom();
-                if (r < 0)
-                        return log_warning_errno(r, "Invalid port or port range, ignoring: %m");
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid port or port range, ignoring: %m");
+                        return 0;
+                }
 
                 nr_ports = 1 + port_max - port_min;
         }
diff --git a/test/fuzz/fuzz-unit-file/oss-fuzz-33876 b/test/fuzz/fuzz-unit-file/oss-fuzz-33876
new file mode 100644 (file)
index 0000000..00b3858
Binary files /dev/null and b/test/fuzz/fuzz-unit-file/oss-fuzz-33876 differ