From: Yu Watanabe Date: Tue, 8 Sep 2020 19:26:49 +0000 (+0900) Subject: network: do not assign return value if the parse_fwmark_fwmask() fails X-Git-Tag: v247-rc1~263^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c2d6fcb1478129cbd2971298cc4b095c462242ac;p=thirdparty%2Fsystemd.git network: do not assign return value if the parse_fwmark_fwmask() fails This also removes redundant logs, and makes input string not copied if it does not contain '/'. --- diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 5fa295fa1a8..94bae87a88e 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -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(f, fwmark); + 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; }