97 lines
2.4 KiB
Diff
97 lines
2.4 KiB
Diff
From 1f4bc63d8cc81747bf2685256c384e17450ca9c8 Mon Sep 17 00:00:00 2001
|
|
From: Peter Jones <pjones@redhat.com>
|
|
Date: Fri, 1 Aug 2014 08:03:49 -0400
|
|
Subject: [PATCH 18/22] Fix some leaked memory that shows up in valgrind.
|
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
---
|
|
src/efibootmgr/efibootmgr.c | 29 ++++++++++++++++++++++-------
|
|
1 file changed, 22 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c
|
|
index d3448da..c8cb6fd 100644
|
|
--- a/src/efibootmgr/efibootmgr.c
|
|
+++ b/src/efibootmgr/efibootmgr.c
|
|
@@ -44,6 +44,7 @@
|
|
#include <unistd.h>
|
|
#include <getopt.h>
|
|
#include <efivar.h>
|
|
+#include <inttypes.h>
|
|
#include "list.h"
|
|
#include "efi.h"
|
|
#include "efichar.h"
|
|
@@ -283,7 +284,7 @@ static int
|
|
read_boot_order(efi_variable_t **boot_order)
|
|
{
|
|
int rc;
|
|
- efi_variable_t *new = NULL, *bo;
|
|
+ efi_variable_t *new = NULL, *bo = NULL;
|
|
|
|
if (*boot_order == NULL) {
|
|
new = calloc(1, sizeof (**boot_order));
|
|
@@ -299,12 +300,15 @@ read_boot_order(efi_variable_t **boot_order)
|
|
if (rc < 0 && new != NULL) {
|
|
free(new);
|
|
*boot_order = NULL;
|
|
+ bo = NULL;
|
|
}
|
|
|
|
- /* latest apple firmware sets high bit which appears invalid
|
|
- * to the linux kernel if we write it back so lets zero it out
|
|
- * if it is set since it would be invalid to set it anyway */
|
|
- bo->attributes = bo->attributes & ~(1 << 31);
|
|
+ if (bo) {
|
|
+ /* latest apple firmware sets high bit which appears invalid
|
|
+ * to the linux kernel if we write it back so lets zero it out
|
|
+ * if it is set since it would be invalid to set it anyway */
|
|
+ bo->attributes = bo->attributes & ~(1 << 31);
|
|
+ }
|
|
return rc;
|
|
}
|
|
|
|
@@ -401,11 +405,15 @@ read_boot_u16(const char *name)
|
|
if (rc < 0)
|
|
return rc;
|
|
if (data_size != 2) {
|
|
+ if (data != NULL)
|
|
+ free(data);
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
|
|
rc = data[0];
|
|
+ if (data != NULL)
|
|
+ free(data);
|
|
return rc;
|
|
}
|
|
|
|
@@ -746,6 +754,11 @@ show_boot_order()
|
|
|
|
rc = read_boot_order(&boot_order);
|
|
|
|
+ if (rc < 0 && errno == ENOENT) {
|
|
+ boot_order = calloc(1, sizeof (*boot_order));
|
|
+ rc = boot_order ? 0 : -1;
|
|
+ }
|
|
+
|
|
if (rc < 0) {
|
|
perror("show_boot_order()");
|
|
return;
|
|
@@ -755,9 +768,11 @@ show_boot_order()
|
|
boot order. First add our entry, then copy the old array.
|
|
*/
|
|
data = (uint16_t *)boot_order->data;
|
|
- if (boot_order->data_size)
|
|
+ if (boot_order->data_size) {
|
|
unparse_boot_order(data, boot_order->data_size / sizeof(uint16_t));
|
|
-
|
|
+ free(boot_order->data);
|
|
+ }
|
|
+ free(boot_order);
|
|
}
|
|
|
|
static int
|
|
--
|
|
1.9.3
|
|
|