From mboxrd@z Thu Jan 1 00:00:00 1970 From: Serhey Popovych Subject: [PATCH iproute2 2/6] utils: Always specify family and ->bytelen in get_prefix_1() Date: Thu, 18 Jan 2018 20:13:43 +0200 Message-ID: <1516299227-26724-3-git-send-email-serhe.popovych@gmail.com> References: <1516299227-26724-1-git-send-email-serhe.popovych@gmail.com> To: netdev@vger.kernel.org Return-path: Received: from mail-lf0-f65.google.com ([209.85.215.65]:34507 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752368AbeARSOS (ORCPT ); Thu, 18 Jan 2018 13:14:18 -0500 Received: by mail-lf0-f65.google.com with SMTP id k19so7592499lfj.1 for ; Thu, 18 Jan 2018 10:14:17 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id l187sm1319975lfg.12.2018.01.18.10.14.15 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 10:14:15 -0800 (PST) In-Reply-To: <1516299227-26724-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: Handle default/all/any special case in get_addr_1() to setup ->family and ->bytelen correctly. Make get_addr_1() return ->bitlen == -2 instead of -1 to distinguish default/all/any special case from the rest: it is safe because all callers check ->bitlen < 0, not explicit value -1. Reduce intendation by one level and get rid of goto/label to make code more readable. Signed-off-by: Serhey Popovych --- lib/utils.c | 64 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/lib/utils.c b/lib/utils.c index a023e74..48c4bcb 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -545,7 +545,7 @@ int get_addr_1(inet_prefix *addr, const char *name, int family) return -1; addr->family = (family != AF_UNSPEC) ? family : AF_INET; addr->bytelen = af_byte_len(addr->family); - addr->bitlen = -1; + addr->bitlen = -2; return 0; } @@ -644,46 +644,46 @@ int af_byte_len(int af) int get_prefix_1(inet_prefix *dst, char *arg, int family) { - int err; - unsigned int plen; char *slash; - - memset(dst, 0, sizeof(*dst)); - - if (strcmp(arg, "default") == 0 || - strcmp(arg, "any") == 0 || - strcmp(arg, "all") == 0) { - if ((family == AF_DECnet) || (family == AF_MPLS)) - return -1; - dst->family = family; - dst->bytelen = 0; - dst->bitlen = 0; - dst->flags |= PREFIXLEN_SPECIFIED; - return 0; - } + int err, bitlen, flags; slash = strchr(arg, '/'); if (slash) *slash = 0; err = get_addr_1(dst, arg, family); - if (err == 0) { - dst->bitlen = af_bit_len(dst->family); - - if (slash) { - if (get_netmask(&plen, slash+1, 0) - || plen > dst->bitlen) { - err = -1; - goto done; - } - dst->flags |= PREFIXLEN_SPECIFIED; - dst->bitlen = plen; - } - } -done: + if (slash) *slash = '/'; - return err; + + if (err) + return err; + + bitlen = af_bit_len(dst->family); + + flags = PREFIXLEN_SPECIFIED; + if (slash) { + unsigned int plen; + + if (dst->bitlen == -2) + return -1; + if (get_netmask(&plen, slash + 1, 0)) + return -1; + if (plen > bitlen) + return -1; + + bitlen = plen; + } else { + if (dst->bitlen == -2) + bitlen = 0; + else + flags = 0; + } + + dst->flags |= flags; + dst->bitlen = bitlen; + + return 0; } static const char *family_name_verbose(int family) -- 1.7.10.4