]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/blobdiff - fs/cifs/connect.c
cifs: clean up handling of unc= option
[can-eth-gw-linux.git] / fs / cifs / connect.c
index f3276239e0755b2e51c96ec0ae20d25797a4dfb0..9c5c8b8c19fe88042fe40d6d1b6273682c10efad 100644 (file)
@@ -1566,29 +1566,15 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
                        got_ip = true;
                        break;
                case Opt_unc:
-                       string = match_strdup(args);
-                       if (string == NULL)
+                       kfree(vol->UNC);
+                       vol->UNC = match_strdup(args);
+                       if (vol->UNC == NULL)
                                goto out_nomem;
 
-                       temp_len = strnlen(string, 300);
-                       if (temp_len  == 300) {
-                               printk(KERN_WARNING "CIFS: UNC name too long\n");
-                               goto cifs_parse_mount_err;
-                       }
-
-                       vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
-                       if (vol->UNC == NULL) {
-                               printk(KERN_WARNING "CIFS: no memory for UNC\n");
-                               goto cifs_parse_mount_err;
-                       }
-                       strcpy(vol->UNC, string);
-
-                       if (strncmp(string, "//", 2) == 0) {
-                               vol->UNC[0] = '\\';
-                               vol->UNC[1] = '\\';
-                       } else if (strncmp(string, "\\\\", 2) != 0) {
+                       convert_delimiter(vol->UNC, '\\');
+                       if (vol->UNC[0] != '\\' || vol->UNC[1] != '\\') {
                                printk(KERN_WARNING "CIFS: UNC Path does not "
-                                                   "begin with // or \\\\\n");
+                                               "begin with // or \\\\\n");
                                goto cifs_parse_mount_err;
                        }
 
@@ -1813,6 +1799,12 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
                goto cifs_parse_mount_err;
        }
 
+       /* make sure UNC has a share name */
+       if (!strchr(vol->UNC + 3, '\\')) {
+               cERROR(1, "Malformed UNC. Unable to find share name.");
+               goto cifs_parse_mount_err;
+       }
+
        if (!got_ip) {
                /* No ip= option specified? Try to get it from UNC */
                if (!cifs_convert_address(dstaddr, &vol->UNC[2],
@@ -2575,13 +2567,6 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
                }
        }
 
-       if (strchr(volume_info->UNC + 3, '\\') == NULL
-           && strchr(volume_info->UNC + 3, '/') == NULL) {
-               cERROR(1, "Missing share name");
-               rc = -ENODEV;
-               goto out_fail;
-       }
-
        /*
         * BB Do we need to wrap session_mutex around this TCon call and Unix
         * SetFS as we do on SessSetup and reconnect?