s390/qeth: clean up string ops in qeth_l3_parse_ipatoe()
authorJulian Wiedmann <jwi@linux.ibm.com>
Wed, 23 Sep 2020 08:36:54 +0000 (10:36 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Sep 2020 19:07:54 +0000 (12:07 -0700)
Indicate the max number of to-be-parsed characters, and avoid copying
the address sub-string.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_l3_sys.c

index ca9c95b..05fa986 100644 (file)
@@ -409,21 +409,22 @@ static ssize_t qeth_l3_dev_ipato_add4_show(struct device *dev,
 static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto,
                  u8 *addr, int *mask_bits)
 {
-       const char *start, *end;
-       char *tmp;
-       char buffer[40] = {0, };
+       const char *start;
+       char *sep, *tmp;
+       int rc;
 
-       start = buf;
-       /* get address string */
-       end = strchr(start, '/');
-       if (!end || (end - start >= 40)) {
+       /* Expected input pattern: %addr/%mask */
+       sep = strnchr(buf, 40, '/');
+       if (!sep)
                return -EINVAL;
-       }
-       strncpy(buffer, start, end - start);
-       if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) {
-               return -EINVAL;
-       }
-       start = end + 1;
+
+       /* Terminate the %addr sub-string, and parse it: */
+       *sep = '\0';
+       rc = qeth_l3_string_to_ipaddr(buf, proto, addr);
+       if (rc)
+               return rc;
+
+       start = sep + 1;
        *mask_bits = simple_strtoul(start, &tmp, 10);
        if (!strlen(start) ||
            (tmp == start) ||