libceph, ceph: avoid memory leak when specifying same option several times
When parsing string option, in order to avoid memory leak we need to carefully free it first in case of specifying same option several times. Signed-off-by: Chengguang Xu <cgxu519@icloud.com> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
6ef0bc6dde
commit
937441f3a3
2 changed files with 9 additions and 0 deletions
|
@ -225,6 +225,7 @@ static int parse_fsopt_token(char *c, void *private)
|
|||
return -ENOMEM;
|
||||
break;
|
||||
case Opt_mds_namespace:
|
||||
kfree(fsopt->mds_namespace);
|
||||
fsopt->mds_namespace = kstrndup(argstr[0].from,
|
||||
argstr[0].to-argstr[0].from,
|
||||
GFP_KERNEL);
|
||||
|
@ -232,6 +233,7 @@ static int parse_fsopt_token(char *c, void *private)
|
|||
return -ENOMEM;
|
||||
break;
|
||||
case Opt_fscache_uniq:
|
||||
kfree(fsopt->fscache_uniq);
|
||||
fsopt->fscache_uniq = kstrndup(argstr[0].from,
|
||||
argstr[0].to-argstr[0].from,
|
||||
GFP_KERNEL);
|
||||
|
|
|
@ -418,6 +418,7 @@ ceph_parse_options(char *options, const char *dev_name,
|
|||
opt->flags |= CEPH_OPT_FSID;
|
||||
break;
|
||||
case Opt_name:
|
||||
kfree(opt->name);
|
||||
opt->name = kstrndup(argstr[0].from,
|
||||
argstr[0].to-argstr[0].from,
|
||||
GFP_KERNEL);
|
||||
|
@ -427,6 +428,9 @@ ceph_parse_options(char *options, const char *dev_name,
|
|||
}
|
||||
break;
|
||||
case Opt_secret:
|
||||
ceph_crypto_key_destroy(opt->key);
|
||||
kfree(opt->key);
|
||||
|
||||
opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL);
|
||||
if (!opt->key) {
|
||||
err = -ENOMEM;
|
||||
|
@ -437,6 +441,9 @@ ceph_parse_options(char *options, const char *dev_name,
|
|||
goto out;
|
||||
break;
|
||||
case Opt_key:
|
||||
ceph_crypto_key_destroy(opt->key);
|
||||
kfree(opt->key);
|
||||
|
||||
opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL);
|
||||
if (!opt->key) {
|
||||
err = -ENOMEM;
|
||||
|
|
Loading…
Reference in a new issue