提交 937441f3 编写于 作者: C Chengguang Xu 提交者: 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: NChengguang Xu <cgxu519@icloud.com>
Reviewed-by: NIlya Dryomov <idryomov@gmail.com>
Signed-off-by: NIlya Dryomov <idryomov@gmail.com>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册