cmdline: parse ip/ether addr, don't write in result if NULL
[libcmdline.git] / src / lib / cmdline_parse_ipaddr.c
index bcd12a4..ff02eff 100644 (file)
@@ -289,13 +289,15 @@ cmdline_parse_ipaddr(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
        struct cmdline_token_ipaddr *tk2 = (struct cmdline_token_ipaddr *)tk;
        unsigned int token_len = 0;
        char ip_str[INET6_ADDRSTRLEN+4]; /* '+4' is for prefixlen (if any) */
-       cmdline_ipaddr_t *ipaddr = res;
+       cmdline_ipaddr_t ipaddr;
        char *prefix, *prefix_end;
        long prefixlen;
 
        if (res && ressize < sizeof(cmdline_ipaddr_t))
                return -1;
 
+       memset(&ipaddr, 0, sizeof(ipaddr));
+
        /* if token is too big... */
        token_len = snprintf(ip_str, sizeof(ip_str), "%s", buf);
        if (token_len >= sizeof(ip_str))
@@ -312,21 +314,25 @@ cmdline_parse_ipaddr(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
                prefixlen = strtol(prefix, &prefix_end, 10);
                if (errno || (*prefix_end != '\0') )
                        return -1;
-               ipaddr->prefixlen = prefixlen;
+               ipaddr.prefixlen = prefixlen;
        }
        else {
-               ipaddr->prefixlen = 0;
+               ipaddr.prefixlen = 0;
        }
 
        /* convert the IP addr */
        if ((tk2->ipaddr_data.flags & CMDLINE_IPADDR_V4) &&
-           my_inet_pton(AF_INET, ip_str, &ipaddr->addr.ipv4) == 1) {
-               ipaddr->family = AF_INET;
+           my_inet_pton(AF_INET, ip_str, &ipaddr.addr.ipv4) == 1) {
+               ipaddr.family = AF_INET;
+               if (res != NULL)
+                       memcpy(res, &ipaddr, sizeof(ipaddr));
                return 0;
        }
        if ((tk2->ipaddr_data.flags & CMDLINE_IPADDR_V6) &&
-           my_inet_pton(AF_INET6, ip_str, &ipaddr->addr.ipv6) == 1) {
-               ipaddr->family = AF_INET6;
+           my_inet_pton(AF_INET6, ip_str, &ipaddr.addr.ipv6) == 1) {
+               ipaddr.family = AF_INET6;
+               if (res != NULL)
+                       memcpy(res, &ipaddr, sizeof(ipaddr));
                return 0;
        }
        return -1;