| From d5363219287e11386f82638a6bd4ad78a8ba7071 Mon Sep 17 00:00:00 2001 |
| From: Tobias Klauser <tklauser@distanz.ch> |
| Date: Mon, 24 Apr 2017 16:34:21 -0500 |
| Subject: [PATCH 097/103] fpga: region: release FPGA region reference in error |
| path |
| |
| If fpga_region_get_manager() fails in fpga_region_program_fpga(), a |
| reference to the fpga_manager instance previously acquired through |
| fpga_region_get() is retained. Make sure to properly release it in the |
| error case by using a separate jump label which will call |
| fpga_region_put() in before returning. |
| |
| Signed-off-by: Tobias Klauser <tklauser@distanz.ch> |
| Acked-by: Moritz Fischer <mdf@kernel.org> |
| Signed-off-by: Alan Tull <atull@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/fpga/fpga-region.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/fpga/fpga-region.c |
| +++ b/drivers/fpga/fpga-region.c |
| @@ -245,7 +245,8 @@ static int fpga_region_program_fpga(stru |
| mgr = fpga_region_get_manager(region); |
| if (IS_ERR(mgr)) { |
| pr_err("failed to get fpga region manager\n"); |
| - return PTR_ERR(mgr); |
| + ret = PTR_ERR(mgr); |
| + goto err_put_region; |
| } |
| |
| ret = fpga_region_get_bridges(region, overlay); |
| @@ -281,6 +282,7 @@ err_put_br: |
| fpga_bridges_put(®ion->bridge_list); |
| err_put_mgr: |
| fpga_mgr_put(mgr); |
| +err_put_region: |
| fpga_region_put(region); |
| |
| return ret; |