iscsi-target: use generic inet_pton_with_scope
authorSagi Grimberg <sagi@grimberg.me>
Mon, 6 Feb 2017 10:51:03 +0000 (12:51 +0200)
committerJens Axboe <axboe@fb.com>
Tue, 4 Apr 2017 15:48:23 +0000 (09:48 -0600)
Instead of parsing address strings, use a generic
helper.

Acked-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/target/iscsi/iscsi_target_configfs.c

index bf40f03755ddc50697652ccde864d40df840fa0b..f30c27b83c5ec217868238327ee58a924a95f07b 100644 (file)
@@ -167,10 +167,7 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
        struct iscsi_portal_group *tpg;
        struct iscsi_tpg_np *tpg_np;
        char *str, *str2, *ip_str, *port_str;
-       struct sockaddr_storage sockaddr;
-       struct sockaddr_in *sock_in;
-       struct sockaddr_in6 *sock_in6;
-       unsigned long port;
+       struct sockaddr_storage sockaddr = { };
        int ret;
        char buf[MAX_PORTAL_LEN + 1];
 
@@ -182,21 +179,19 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
        memset(buf, 0, MAX_PORTAL_LEN + 1);
        snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
 
-       memset(&sockaddr, 0, sizeof(struct sockaddr_storage));
-
        str = strstr(buf, "[");
        if (str) {
-               const char *end;
-
                str2 = strstr(str, "]");
                if (!str2) {
                        pr_err("Unable to locate trailing \"]\""
                                " in IPv6 iSCSI network portal address\n");
                        return ERR_PTR(-EINVAL);
                }
-               str++; /* Skip over leading "[" */
+
+               ip_str = str + 1; /* Skip over leading "[" */
                *str2 = '\0'; /* Terminate the unbracketed IPv6 address */
                str2++; /* Skip over the \0 */
+
                port_str = strstr(str2, ":");
                if (!port_str) {
                        pr_err("Unable to locate \":port\""
@@ -205,23 +200,8 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
                }
                *port_str = '\0'; /* Terminate string for IP */
                port_str++; /* Skip over ":" */
-
-               ret = kstrtoul(port_str, 0, &port);
-               if (ret < 0) {
-                       pr_err("kstrtoul() failed for port_str: %d\n", ret);
-                       return ERR_PTR(ret);
-               }
-               sock_in6 = (struct sockaddr_in6 *)&sockaddr;
-               sock_in6->sin6_family = AF_INET6;
-               sock_in6->sin6_port = htons((unsigned short)port);
-               ret = in6_pton(str, -1,
-                               (void *)&sock_in6->sin6_addr.in6_u, -1, &end);
-               if (ret <= 0) {
-                       pr_err("in6_pton returned: %d\n", ret);
-                       return ERR_PTR(-EINVAL);
-               }
        } else {
-               str = ip_str = &buf[0];
+               ip_str = &buf[0];
                port_str = strstr(ip_str, ":");
                if (!port_str) {
                        pr_err("Unable to locate \":port\""
@@ -230,17 +210,15 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
                }
                *port_str = '\0'; /* Terminate string for IP */
                port_str++; /* Skip over ":" */
+       }
 
-               ret = kstrtoul(port_str, 0, &port);
-               if (ret < 0) {
-                       pr_err("kstrtoul() failed for port_str: %d\n", ret);
-                       return ERR_PTR(ret);
-               }
-               sock_in = (struct sockaddr_in *)&sockaddr;
-               sock_in->sin_family = AF_INET;
-               sock_in->sin_port = htons((unsigned short)port);
-               sock_in->sin_addr.s_addr = in_aton(ip_str);
+       ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str,
+                       port_str, &sockaddr);
+       if (ret) {
+               pr_err("malformed ip/port passed: %s\n", name);
+               return ERR_PTR(ret);
        }
+
        tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
        ret = iscsit_get_tpg(tpg);
        if (ret < 0)