]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/blobdiff - fs/cifs/connect.c
cifs: fix up handling of prefixpath= option
[can-eth-gw-linux.git] / fs / cifs / connect.c
index 9c5c8b8c19fe88042fe40d6d1b6273682c10efad..94c4484c9ea36a62b4ff7419205117b0c61606b6 100644 (file)
@@ -1612,31 +1612,14 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
                        }
                        break;
                case Opt_prefixpath:
-                       string = match_strdup(args);
-                       if (string == NULL)
-                               goto out_nomem;
-
-                       temp_len = strnlen(string, 1024);
-                       if (string[0] != '/')
-                               temp_len++; /* missing leading slash */
-                       if (temp_len > 1024) {
-                               printk(KERN_WARNING "CIFS: prefix too long\n");
-                               goto cifs_parse_mount_err;
-                       }
-
-                       vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
-                       if (vol->prepath == NULL) {
-                               printk(KERN_WARNING "CIFS: no memory "
-                                                   "for path prefix\n");
-                               goto cifs_parse_mount_err;
-                       }
-
-                       if (string[0] != '/') {
-                               vol->prepath[0] = '/';
-                               strcpy(vol->prepath+1, string);
-                       } else
-                               strcpy(vol->prepath, string);
+                       /* skip over any leading delimiter */
+                       if (*args[0].from == '/' || *args[0].from == '\\')
+                               args[0].from++;
 
+                       kfree(vol->prepath);
+                       vol->prepath = match_strdup(args);
+                       if (vol->prepath == NULL)
+                               goto out_nomem;
                        break;
                case Opt_iocharset:
                        string = match_strdup(args);
@@ -3236,7 +3219,7 @@ build_unc_path_to_root(const struct smb_vol *vol,
                const struct cifs_sb_info *cifs_sb)
 {
        char *full_path, *pos;
-       unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
+       unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
        unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
 
        full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
@@ -3247,6 +3230,7 @@ build_unc_path_to_root(const struct smb_vol *vol,
        pos = full_path + unc_len;
 
        if (pplen) {
+               *pos++ = CIFS_DIR_SEP(cifs_sb);
                strncpy(pos, vol->prepath, pplen);
                pos += pplen;
        }