cifs: clean up handling of unc= option
Make sure we free any existing memory allocated for vol->UNC, just in case someone passes in multiple unc= options. Get rid of the check for too long a UNC. The check for >300 bytes seems arbitrary. We later copy this into the tcon->treeName, for instance and it's a lot shorter than 300 bytes. Eliminate an extra kmalloc and copy as well. Just set the vol->UNC directly with the contents of match_strdup. Establish that the UNC should be stored with '\\' delimiters. Use convert_delimiter to change it in place in the vol->UNC. Finally, move the check for a malformed UNC into cifs_parse_mount_options so we can catch that situation earlier. Pavel Shilovsky <piastry@etersoft.ru> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
Родитель
193cdd8a29
Коммит
62a1a439e0
|
@ -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?
|
||||
|
|
Загрузка…
Ссылка в новой задаче