| From 6c48995ec7ff6c2a4a98a9a8e0d7881f6ed6aa8a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 21 May 2021 20:22:15 +0200 |
| Subject: firmware: stratix10-svc: Fix a resource leak in an error handling |
| path |
| |
| From: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| |
| [ Upstream commit d99247f9b542533ddbf87a3481a05473b8e48194 ] |
| |
| If an error occurs after a successful 'kfifo_alloc()' call, it must be |
| undone by a corresponding 'kfifo_free()' call, as already done in the |
| remove function. |
| |
| While at it, move the 'platform_device_put()' call to this new error |
| handling path and explicitly return 0 in the success path. |
| |
| Fixes: b5dc75c915cd ("firmware: stratix10-svc: extend svc to support new RSU features") |
| Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| Link: https://lore.kernel.org/r/0ca3f3ab139c53e846804455a1e7599ee8ae896a.1621621271.git.christophe.jaillet@wanadoo.fr |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/firmware/stratix10-svc.c | 22 +++++++++++++++------- |
| 1 file changed, 15 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c |
| index 3aa489dba30a..2a7687911c09 100644 |
| --- a/drivers/firmware/stratix10-svc.c |
| +++ b/drivers/firmware/stratix10-svc.c |
| @@ -1034,24 +1034,32 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) |
| |
| /* add svc client device(s) */ |
| svc = devm_kzalloc(dev, sizeof(*svc), GFP_KERNEL); |
| - if (!svc) |
| - return -ENOMEM; |
| + if (!svc) { |
| + ret = -ENOMEM; |
| + goto err_free_kfifo; |
| + } |
| |
| svc->stratix10_svc_rsu = platform_device_alloc(STRATIX10_RSU, 0); |
| if (!svc->stratix10_svc_rsu) { |
| dev_err(dev, "failed to allocate %s device\n", STRATIX10_RSU); |
| - return -ENOMEM; |
| + ret = -ENOMEM; |
| + goto err_free_kfifo; |
| } |
| |
| ret = platform_device_add(svc->stratix10_svc_rsu); |
| - if (ret) { |
| - platform_device_put(svc->stratix10_svc_rsu); |
| - return ret; |
| - } |
| + if (ret) |
| + goto err_put_device; |
| + |
| dev_set_drvdata(dev, svc); |
| |
| pr_info("Intel Service Layer Driver Initialized\n"); |
| |
| + return 0; |
| + |
| +err_put_device: |
| + platform_device_put(svc->stratix10_svc_rsu); |
| +err_free_kfifo: |
| + kfifo_free(&controller->svc_fifo); |
| return ret; |
| } |
| |
| -- |
| 2.30.2 |
| |