]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: do not assign return value if the parse_fwmark_fwmask() fails
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 8 Sep 2020 19:26:49 +0000 (04:26 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 10 Sep 2020 09:19:03 +0000 (18:19 +0900)
This also removes redundant logs, and makes input string not copied if
it does not contain '/'.

src/network/networkd-routing-policy-rule.c

index 5fa295fa1a8bcc4c968adf1c6a495c7676c62421..94bae87a88eb30f35e83ad62f97e6ca12fc8bbfb 100644 (file)
@@ -655,31 +655,36 @@ int routing_policy_rule_section_verify(RoutingPolicyRule *rule) {
         return 0;
 }
 
-static int parse_fwmark_fwmask(const char *s, uint32_t *fwmark, uint32_t *fwmask) {
-        _cleanup_free_ char *f = NULL;
-        char *p;
+static int parse_fwmark_fwmask(const char *s, uint32_t *ret_fwmark, uint32_t *ret_fwmask) {
+        _cleanup_free_ char *fwmark_str = NULL;
+        uint32_t fwmark, fwmask = 0;
+        const char *slash;
         int r;
 
         assert(s);
+        assert(ret_fwmark);
+        assert(ret_fwmask);
 
-        f = strdup(s);
-        if (!f)
-                return -ENOMEM;
-
-        p = strchr(f, '/');
-        if (p)
-                *p++ = '\0';
+        slash = strchr(s, '/');
+        if (slash) {
+                fwmark_str = strndup(s, slash - s);
+                if (!fwmark_str)
+                        return -ENOMEM;
+        }
 
-        r = safe_atou32(ffwmark);
+        r = safe_atou32(fwmark_str ?: s, &fwmark);
         if (r < 0)
-                return log_error_errno(r, "Failed to parse RPDB rule firewall mark, ignoring: %s", f);
+                return r;
 
-        if (p) {
-                r = safe_atou32(p, fwmask);
+        if (slash) {
+                r = safe_atou32(slash + 1, &fwmask);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to parse RPDB rule mask, ignoring: %s", f);
+                        return r;
         }
 
+        *ret_fwmark = fwmark;
+        *ret_fwmask = fwmask;
+
         return 0;
 }