Fix memory and resource handling in the Dragon recovery updater.
This fixes the following cppcheck reports:
[flash_file.c:61]: (error) Memory leak: dev
[vboot_interface.c:56]: (error) Resource leak: file
[vboot_interface.c:62]: (error) Resource leak: file
[vboot_interface.c:62]: (error) Memory leak: data
[vboot_interface.c:83]: (error) Resource leak: file
Change-Id: I09a8c863ea691ee1ffa8fc011d384f8aafa91e8c
diff --git a/recovery/updater/flash_file.c b/recovery/updater/flash_file.c
index ee923ff..3fe8cb3 100644
--- a/recovery/updater/flash_file.c
+++ b/recovery/updater/flash_file.c
@@ -58,7 +58,7 @@
return file_blob_open(dev, value);
if (value->type != VAL_STRING)
- return NULL;
+ goto out_free;
dev->fd = open(value->data, O_RDWR);
if (dev->fd == -1) {
diff --git a/recovery/updater/vboot_interface.c b/recovery/updater/vboot_interface.c
index a37a1c7..9e74b2b 100644
--- a/recovery/updater/vboot_interface.c
+++ b/recovery/updater/vboot_interface.c
@@ -52,18 +52,26 @@
fseek(file, 0, SEEK_END);
size = ftell(file);
data = malloc(size + 1);
- if (!data)
- return NULL;
+ if (!data) {
+ goto out_close;
+ }
data[size] = '\0';
rewind(file);
if (fread(data, 1, size, file) != size) {
ALOGD("Unable to read FDT property %s\n", prop);
- return NULL;
+ goto out_free;
}
fclose(file);
return data;
+
+out_free:
+ free(data);
+
+out_close:
+ fclose(file);
+ return NULL;
}
uint32_t fdt_read_u32(const char *prop)
@@ -80,6 +88,7 @@
}
if (fread(&data, 1, sizeof(data), file) != sizeof(data)) {
ALOGD("Unable to read FDT property %s\n", prop);
+ fclose(file);
return -1U;
}
fclose(file);