Fix NULL as mount(2) syscall data parameter

Passing NULL for the mount data should not result in EINVAL.  It
should be treated as if an empty string were passed and succeed.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ned Bass <bass6@llnl.gov>
Issue #3771
This commit is contained in:
Brian Behlendorf 2015-09-19 12:32:38 -07:00 committed by Ned Bass
parent 0d00e812d9
commit e49552a17b
1 changed files with 22 additions and 21 deletions

View File

@ -227,8 +227,7 @@ static const match_table_t zpl_tokens = {
};
static int
zpl_parse_option(char *option, int token, substring_t *args,
zfs_mntopts_t *zmo, boolean_t isremount)
zpl_parse_option(char *option, int token, substring_t *args, zfs_mntopts_t *zmo)
{
switch (token) {
case TOKEN_RO:
@ -318,32 +317,34 @@ zpl_parse_options(char *osname, char *mntopts, zfs_mntopts_t *zmo,
boolean_t isremount)
{
zfs_mntopts_t *tmp_zmo;
substring_t args[MAX_OPT_ARGS];
char *tmp_mntopts, *p;
int error, token;
if (mntopts == NULL)
return (-EINVAL);
int error;
tmp_zmo = zfs_mntopts_alloc();
tmp_zmo->z_osname = strdup(osname);
tmp_mntopts = strdup(mntopts);
while ((p = strsep(&tmp_mntopts, ",")) != NULL) {
if (!*p)
continue;
if (mntopts) {
substring_t args[MAX_OPT_ARGS];
char *tmp_mntopts, *p;
int token;
args[0].to = args[0].from = NULL;
token = match_token(p, zpl_tokens, args);
error = zpl_parse_option(p, token, args, tmp_zmo, isremount);
if (error) {
zfs_mntopts_free(tmp_zmo);
strfree(tmp_mntopts);
return (error);
tmp_mntopts = strdup(mntopts);
while ((p = strsep(&tmp_mntopts, ",")) != NULL) {
if (!*p)
continue;
args[0].to = args[0].from = NULL;
token = match_token(p, zpl_tokens, args);
error = zpl_parse_option(p, token, args, tmp_zmo);
if (error) {
zfs_mntopts_free(tmp_zmo);
strfree(tmp_mntopts);
return (error);
}
}
}
strfree(tmp_mntopts);
strfree(tmp_mntopts);
}
if (isremount == B_TRUE) {
if (zmo->z_osname)