[PATCH v2] lib/flash: fix resource leak in flash_setup_buffer() error paths

Samuel Mendoza-Jonas sam at mendozajonas.com
Fri May 6 14:08:31 AEST 2016


On Wed, May 04, 2016 at 11:22:57AM +1000, Andrew Donnellan wrote:
> Some error paths in flash_setup_buffer() fail to free the flash_info struct
> or close the open ffs before they return. Change them to goto the cleanup
> code at the end. Separate the cleanup code into separate labels depending
> on whether we need to call ffs_close(), arch_flash_close() and
> talloc_free().
> 
> Signed-off-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>

Thanks! Merged as 87fa488.

> 
> ---
> 
> Found by Coverity Scan. Build-tested only. sammj, please bikeshed :)
> 
> V1->V2:
> 	- Added missing ffs_close() call, suggested by Cyril Bur
> ---
>  lib/flash/flash.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/flash/flash.c b/lib/flash/flash.c
> index b6188a0..1384118 100644
> --- a/lib/flash/flash.c
> +++ b/lib/flash/flash.c
> @@ -82,26 +82,26 @@ static struct flash_info *flash_setup_buffer(void *ctx, const char *partition)
>  	rc = arch_flash_init(&info->bl, NULL, true);
>  	if (rc) {
>  		pb_log("Failed to init mtd device\n");
> -		return NULL;
> +		goto out;
>  	}
>  
>  	rc = blocklevel_get_info(info->bl, &info->path, &info->size,
>  				 &info->erase_granule);
>  	if (rc) {
>  		pb_log("Failed to retrieve blocklevel info\n");
> -		return NULL;
> +	        goto out_flash;
>  	}
>  
>  	rc = ffs_init(0, info->size, info->bl, &info->ffs, 1);
>  	if (rc) {
>  		pb_log("%s: Failed to init ffs\n", __func__);
> -		goto out;
> +		goto out_flash;
>  	}
>  
>  	rc = partition_info(info, partition);
>  	if (rc) {
>  		pb_log("Failed to retrieve partition info\n");
> -		goto out;
> +		goto out_ffs;
>  	}
>  
>  	/* Check if there is a second flash side. If there is not, or
> @@ -139,8 +139,11 @@ static struct flash_info *flash_setup_buffer(void *ctx, const char *partition)
>  	}
>  
>  	return info;
> -out:
> +out_ffs:
> +	ffs_close(info->ffs);
> +out_flash:
>  	arch_flash_close(info->bl, NULL);
> +out:
>  	talloc_free(info);
>  	return NULL;
>  }
> -- 
> Andrew Donnellan              OzLabs, ADL Canberra
> andrew.donnellan at au1.ibm.com  IBM Australia Limited
> 
> _______________________________________________
> Petitboot mailing list
> Petitboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/petitboot



More information about the Petitboot mailing list