fs/9p: Fix invalid mount options/args
Subsystems (2)
PATCH 1/1 fs/9p: Fix invalid mount options/args
fs/9p: Fix invalid mount options/args
Without this fix, if any invalid mount options/args are passed while mouting the 9p fs, no error (-EINVAL) is returned and default arg value is assigned.
This fix returns -EINVAL when an invalid arguement is found while parsing mount options.
--- fs/9p/v9fs.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-)
fs/9p/v9fs.c +34 -9
@@ -78,6 +78,25 @@ static const match_table_t tokens = { {Opt_err, NULL} }; +/* Interpret mount options for cache mode */ +static int get_cache_mode (char *s) +{ +int version = -EINVAL ; + +if (!strcmp (s,"loose" )) { + version =CACHE_LOOSE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: loose\n" ); + }else if (!strcmp (s,"fscache" )) { + version =CACHE_FSCACHE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: fscache\n" ); + }else if (!strcmp (s,"none" )) { + version =CACHE_NONE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: none\n" ); + }else +printk (KERN_INFO "9p: Unknown Cache mode %s.\n" , s); +return version; +} +/** * v9fs_parse_options - parse mount options into session structure * @v9ses: existing v9fs session information
@@ -97,7 +116,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)/* setup defaults */ v9ses->afid = ~0 ; v9ses->debug =0 ; - v9ses->cache =0 ; + v9ses->cache =CACHE_NONE ;#ifdef CONFIG_9P_FSCACHE v9ses->cachetag =NULL ;#endif
@@ -171,13 +190,13 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) "problem allocating copy of cache arg\n"); goto free_and_return; } + ret =get_cache_mode (s); +if (ret == -EINVAL ) { +kfree (s); + goto free_and_return; + } -if (strcmp (s,"loose" ) ==0 ) - v9ses->cache =CACHE_LOOSE ; -else if (strcmp (s,"fscache" ) ==0 ) - v9ses->cache =CACHE_FSCACHE ; -else - v9ses->cache =CACHE_NONE ; + v9ses->cache = ret;kfree (s);break ;
@@ -200,9 +219,15 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) }else { v9ses->flags |=V9FS_ACCESS_SINGLE ; v9ses->uid =simple_strtoul (s, &e,10 ); -if (*e !='\0' ) - v9ses->uid = ~0 ; +if (*e !='\0' ) { + ret = -EINVAL ; +printk (KERN_INFO "9p: Unknown access " +"argument %s.\n" , s); +kfree (s); + goto free_and_return; + } } +kfree (s);break ;
Signature · 7 lines
1.7.4 -- Cheers, Prem Linux Technology Center, IBM Systems & Technology Labs
Quoted 6 lines · Prem Karat
fs/9p: Fix invalid mount options/args
Without this fix, if any invalid mount options/args are passed while mouting the 9p fs, no error (
-EINVAL) is returned and default arg value is assigned.This fix returns
-EINVALwhen an invalid arguement is found while parsing mount options.
Prem, Thanks for the patch.
Quick question..any reason why you have a new function for cache, and in-line here?
Thanks,
JV
Quoted 84 lines
Signed-off-by Prem Karat<[email protected]>--- fs/9p/v9fs.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-)fs/9p/v9fs.c +34
-9@@ -78,6 +78,25 @@ static const match_table_t tokens = { {Opt_err, NULL} }; +/* Interpret mount options for cache mode */ +static int get_cache_mode (char *s) +{ +int version = -EINVAL ; + +if (!strcmp (s,"loose" )) { + version =CACHE_LOOSE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: loose\n" ); + }else if (!strcmp (s,"fscache" )) { + version =CACHE_FSCACHE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: fscache\n" ); + }else if (!strcmp (s,"none" )) { + version =CACHE_NONE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: none\n" ); + }else +printk (KERN_INFO "9p: Unknown Cache mode %s.\n" , s); +return version; +} +/** * v9fs_parse_options - parse mount options into session structure * @v9ses: existing v9fs session information @@ -97,7 +116,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)/* setup defaults */ v9ses->afid = ~0 ; v9ses->debug =0 ; - v9ses->cache =0 ; + v9ses->cache =CACHE_NONE ;#ifdef CONFIG_9P_FSCACHE v9ses->cachetag =NULL ;#endif @@ -171,13 +190,13 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) "problem allocating copy of cache arg\n"); goto free_and_return; } + ret =get_cache_mode (s); +if (ret == -EINVAL ) { +kfree (s); + goto free_and_return; + } -if (strcmp (s,"loose" ) ==0 ) - v9ses->cache =CACHE_LOOSE ; -else if (strcmp (s,"fscache" ) ==0 ) - v9ses->cache =CACHE_FSCACHE ; -else - v9ses->cache =CACHE_NONE ; + v9ses->cache = ret;kfree (s);break ;@@ -200,9 +219,15 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) }else { v9ses->flags |=V9FS_ACCESS_SINGLE ; v9ses->uid =simple_strtoul (s,&e,10 ); -if (*e !='\0' ) - v9ses->uid = ~0 ; +if (*e !='\0' ) { + ret = -EINVAL ; +printk (KERN_INFO "9p: Unknown access " +"argument %s.\n" , s); +kfree (s); + goto free_and_return; + } } +kfree (s);break;
Hi JV,
Apologies for the delay in response & Thanks for reviewing it.
Quoted 10 lines · Venkateswararao Jujjuri
Quoted 6 lines · Prem Karat
fs/9p: Fix invalid mount options/args
Without this fix, if any invalid mount options/args are passed while mouting the 9p fs, no error (
-EINVAL) is returned and default arg value is assigned.This fix returns
-EINVALwhen an invalid arguement is found while parsing mount options.Prem, Thanks for the patch.
Quick question..any reason why you have a new function for cache, and in-line here?
No specific reason. Just wanted the code to be in consistent with net/9p/client.c (get_protocol_version()).
Quoted 88 lines
Thanks,
JVQuoted 84 lines
Signed-off-by Prem Karat<[email protected]>--- fs/9p/v9fs.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-)fs/9p/v9fs.c +34
-9@@ -78,6 +78,25 @@ static const match_table_t tokens = { {Opt_err, NULL} }; +/* Interpret mount options for cache mode */ +static int get_cache_mode (char *s) +{ +int version = -EINVAL ; + +if (!strcmp (s,"loose" )) { + version =CACHE_LOOSE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: loose\n" ); + }else if (!strcmp (s,"fscache" )) { + version =CACHE_FSCACHE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: fscache\n" ); + }else if (!strcmp (s,"none" )) { + version =CACHE_NONE ; +P9_DPRINTK (P9_DEBUG_9P ,"Cache mode: none\n" ); + }else +printk (KERN_INFO "9p: Unknown Cache mode %s.\n" , s); +return version; +} +/** * v9fs_parse_options - parse mount options into session structure * @v9ses: existing v9fs session information @@ -97,7 +116,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)/* setup defaults */ v9ses->afid = ~0 ; v9ses->debug =0 ; - v9ses->cache =0 ; + v9ses->cache =CACHE_NONE ;#ifdef CONFIG_9P_FSCACHE v9ses->cachetag =NULL ;#endif @@ -171,13 +190,13 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) "problem allocating copy of cache arg\n"); goto free_and_return; } + ret =get_cache_mode (s); +if (ret == -EINVAL ) { +kfree (s); + goto free_and_return; + } -if (strcmp (s,"loose" ) ==0 ) - v9ses->cache =CACHE_LOOSE ; -else if (strcmp (s,"fscache" ) ==0 ) - v9ses->cache =CACHE_FSCACHE ; -else - v9ses->cache =CACHE_NONE ; + v9ses->cache = ret;kfree (s);break ;@@ -200,9 +219,15 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) }else { v9ses->flags |=V9FS_ACCESS_SINGLE ; v9ses->uid =simple_strtoul (s,&e,10 ); -if (*e !='\0' ) - v9ses->uid = ~0 ; +if (*e !='\0' ) { + ret = -EINVAL ; +printk (KERN_INFO "9p: Unknown access " +"argument %s.\n" , s); +kfree (s); + goto free_and_return; + } } +kfree (s);break;
Signature · 5 lines
Cheers, Prem Linux Technology Center, IBM Systems & Technology Labs DID: 41776362