| From foo@baz Sun Jun 17 12:07:34 CEST 2018 |
| From: Chengguang Xu <cgxu519@gmx.com> |
| Date: Sat, 14 Apr 2018 20:06:19 +0800 |
| Subject: nvme: fix potential memory leak in option parsing |
| |
| From: Chengguang Xu <cgxu519@gmx.com> |
| |
| [ Upstream commit 59a2f3f00fd744dbad22593f47552037d3154ca6 ] |
| |
| When specifying same string type option several times, |
| current option parsing may cause memory leak. Hence, |
| call kfree for previous one in this case. |
| |
| Signed-off-by: Chengguang Xu <cgxu519@gmx.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Reviewed-by: Sagi Grimberg <sagi@grimberg.me> |
| Signed-off-by: Keith Busch <keith.busch@intel.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/nvme/host/fabrics.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/nvme/host/fabrics.c |
| +++ b/drivers/nvme/host/fabrics.c |
| @@ -668,6 +668,7 @@ static int nvmf_parse_options(struct nvm |
| ret = -ENOMEM; |
| goto out; |
| } |
| + kfree(opts->transport); |
| opts->transport = p; |
| break; |
| case NVMF_OPT_NQN: |
| @@ -676,6 +677,7 @@ static int nvmf_parse_options(struct nvm |
| ret = -ENOMEM; |
| goto out; |
| } |
| + kfree(opts->subsysnqn); |
| opts->subsysnqn = p; |
| nqnlen = strlen(opts->subsysnqn); |
| if (nqnlen >= NVMF_NQN_SIZE) { |
| @@ -698,6 +700,7 @@ static int nvmf_parse_options(struct nvm |
| ret = -ENOMEM; |
| goto out; |
| } |
| + kfree(opts->traddr); |
| opts->traddr = p; |
| break; |
| case NVMF_OPT_TRSVCID: |
| @@ -706,6 +709,7 @@ static int nvmf_parse_options(struct nvm |
| ret = -ENOMEM; |
| goto out; |
| } |
| + kfree(opts->trsvcid); |
| opts->trsvcid = p; |
| break; |
| case NVMF_OPT_QUEUE_SIZE: |
| @@ -792,6 +796,7 @@ static int nvmf_parse_options(struct nvm |
| ret = -EINVAL; |
| goto out; |
| } |
| + nvmf_host_put(opts->host); |
| opts->host = nvmf_host_add(p); |
| kfree(p); |
| if (!opts->host) { |
| @@ -817,6 +822,7 @@ static int nvmf_parse_options(struct nvm |
| ret = -ENOMEM; |
| goto out; |
| } |
| + kfree(opts->host_traddr); |
| opts->host_traddr = p; |
| break; |
| case NVMF_OPT_HOST_ID: |