cifs: fix IPv6 link local, with scope id, address parsing
authorDaniel N Pettersson <danielnp@axis.com>
Thu, 27 Apr 2017 09:32:36 +0000 (11:32 +0200)
committerSteve French <smfrench@gmail.com>
Tue, 2 May 2017 19:57:34 +0000 (14:57 -0500)
When the IP address is gotten from the UNC, use only the address part
of the UNC. Else all after the percent sign in an IPv6 link local
address is interpreted as a scope id. This includes the slash and
share name. A scope id is expected to be an integer and any trailing
characters makes the conversion to integer fail.
Example of mount command that fails:
mount -i -t cifs //fe80::6a05:caff:fe3e:8ffc%2/test /mnt/t -o sec=none

Signed-off-by: Daniel N Pettersson <danielnp@axis.com>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/connect.c

index 0f2781677cccd2063fb9abf5fb2121c8c9bce3c4..fef6156eb6c88d3081641aff7a98394b53e9aaf7 100644 (file)
@@ -1945,9 +1945,14 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
        }
 
        if (!got_ip) {
+               int len;
+               const char *slash;
+
                /* No ip= option specified? Try to get it from UNC */
-               if (!cifs_convert_address(dstaddr, &vol->UNC[2],
-                                               strlen(&vol->UNC[2]))) {
+               /* Use the address part of the UNC. */
+               slash = strchr(&vol->UNC[2], '\\');
+               len = slash - &vol->UNC[2];
+               if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
                        pr_err("Unable to determine destination address.\n");
                        goto cifs_parse_mount_err;
                }