lib/flash: fix resource leak in flash_setup_buffer() error paths
authorAndrew Donnellan <andrew.donnellan@au1.ibm.com>
Wed, 4 May 2016 01:22:57 +0000 (11:22 +1000)
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>
Fri, 6 May 2016 03:57:30 +0000 (13:57 +1000)
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@au1.ibm.com>
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
lib/flash/flash.c

index b6188a07a3340d05def3b73300d2c39d201deb0a..1384118a59ec0e87befbf3e6f558032f6591b669 100644 (file)
@@ -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;
 }