Commit 937441f3 authored by Chengguang Xu's avatar Chengguang Xu Committed by Ilya Dryomov

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: default avatarChengguang Xu <cgxu519@icloud.com>
Reviewed-by: default avatarIlya Dryomov <idryomov@gmail.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 6ef0bc6d
...@@ -225,6 +225,7 @@ static int parse_fsopt_token(char *c, void *private) ...@@ -225,6 +225,7 @@ static int parse_fsopt_token(char *c, void *private)
return -ENOMEM; return -ENOMEM;
break; break;
case Opt_mds_namespace: case Opt_mds_namespace:
kfree(fsopt->mds_namespace);
fsopt->mds_namespace = kstrndup(argstr[0].from, fsopt->mds_namespace = kstrndup(argstr[0].from,
argstr[0].to-argstr[0].from, argstr[0].to-argstr[0].from,
GFP_KERNEL); GFP_KERNEL);
...@@ -232,6 +233,7 @@ static int parse_fsopt_token(char *c, void *private) ...@@ -232,6 +233,7 @@ static int parse_fsopt_token(char *c, void *private)
return -ENOMEM; return -ENOMEM;
break; break;
case Opt_fscache_uniq: case Opt_fscache_uniq:
kfree(fsopt->fscache_uniq);
fsopt->fscache_uniq = kstrndup(argstr[0].from, fsopt->fscache_uniq = kstrndup(argstr[0].from,
argstr[0].to-argstr[0].from, argstr[0].to-argstr[0].from,
GFP_KERNEL); GFP_KERNEL);
......
...@@ -418,6 +418,7 @@ ceph_parse_options(char *options, const char *dev_name, ...@@ -418,6 +418,7 @@ ceph_parse_options(char *options, const char *dev_name,
opt->flags |= CEPH_OPT_FSID; opt->flags |= CEPH_OPT_FSID;
break; break;
case Opt_name: case Opt_name:
kfree(opt->name);
opt->name = kstrndup(argstr[0].from, opt->name = kstrndup(argstr[0].from,
argstr[0].to-argstr[0].from, argstr[0].to-argstr[0].from,
GFP_KERNEL); GFP_KERNEL);
...@@ -427,6 +428,9 @@ ceph_parse_options(char *options, const char *dev_name, ...@@ -427,6 +428,9 @@ ceph_parse_options(char *options, const char *dev_name,
} }
break; break;
case Opt_secret: case Opt_secret:
ceph_crypto_key_destroy(opt->key);
kfree(opt->key);
opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL); opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL);
if (!opt->key) { if (!opt->key) {
err = -ENOMEM; err = -ENOMEM;
...@@ -437,6 +441,9 @@ ceph_parse_options(char *options, const char *dev_name, ...@@ -437,6 +441,9 @@ ceph_parse_options(char *options, const char *dev_name,
goto out; goto out;
break; break;
case Opt_key: case Opt_key:
ceph_crypto_key_destroy(opt->key);
kfree(opt->key);
opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL); opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL);
if (!opt->key) { if (!opt->key) {
err = -ENOMEM; err = -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment