]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: also use _cleanup_freepool_ in util.c 8440/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 13 Mar 2018 10:15:10 +0000 (11:15 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 13 Mar 2018 10:42:02 +0000 (11:42 +0100)
efivar_get() was leaking memory on success, afaict.

src/boot/efi/util.c

index cd75c13f2b48b3ff7f878aae33ca3e93d2621f3a..00bbb502035c9951bc7d82c4a78e8a500837b6f1 100644 (file)
@@ -115,7 +115,7 @@ EFI_STATUS efivar_set_int(CHAR16 *name, UINTN i, BOOLEAN persistent) {
 }
 
 EFI_STATUS efivar_get(CHAR16 *name, CHAR16 **value) {
-        CHAR8 *buf;
+        _cleanup_freepool_ CHAR8 *buf = NULL;
         CHAR16 *val;
         UINTN size;
         EFI_STATUS err;
@@ -125,29 +125,26 @@ EFI_STATUS efivar_get(CHAR16 *name, CHAR16 **value) {
                 return err;
 
         val = StrDuplicate((CHAR16 *)buf);
-        if (!val) {
-                FreePool(buf);
+        if (!val)
                 return EFI_OUT_OF_RESOURCES;
-        }
 
         *value = val;
         return EFI_SUCCESS;
 }
 
 EFI_STATUS efivar_get_int(CHAR16 *name, UINTN *i) {
-        CHAR16 *val;
+        _cleanup_freepool_ CHAR16 *val = NULL;
         EFI_STATUS err;
 
         err = efivar_get(name, &val);
-        if (!EFI_ERROR(err)) {
+        if (!EFI_ERROR(err))
                 *i = Atoi(val);
-                FreePool(val);
-        }
+
         return err;
 }
 
 EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 **buffer, UINTN *size) {
-        CHAR8 *buf;
+        _cleanup_freepool_ CHAR8 *buf = NULL;
         UINTN l;
         EFI_STATUS err;
 
@@ -159,12 +156,12 @@ EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 **buffer,
         err = uefi_call_wrapper(RT->GetVariable, 5, name, (EFI_GUID *)vendor, NULL, &l, buf);
         if (!EFI_ERROR(err)) {
                 *buffer = buf;
+                buf = NULL;
                 if (size)
                         *size = l;
-        } else
-                FreePool(buf);
-        return err;
+        }
 
+        return err;
 }
 
 VOID efivar_set_time_usec(CHAR16 *name, UINT64 usec) {
@@ -306,7 +303,7 @@ CHAR8 *strchra(CHAR8 *s, CHAR8 c) {
 
 EFI_STATUS file_read(EFI_FILE_HANDLE dir, CHAR16 *name, UINTN off, UINTN size, CHAR8 **content, UINTN *content_size) {
         EFI_FILE_HANDLE handle;
-        CHAR8 *buf;
+        _cleanup_freepool_ CHAR8 *buf = NULL;
         EFI_STATUS err;
 
         err = uefi_call_wrapper(dir->Open, 5, dir, &handle, name, EFI_FILE_MODE_READ, 0ULL);
@@ -314,11 +311,10 @@ EFI_STATUS file_read(EFI_FILE_HANDLE dir, CHAR16 *name, UINTN off, UINTN size, C
                 return err;
 
         if (size == 0) {
-                EFI_FILE_INFO *info;
+                _cleanup_freepool_ EFI_FILE_INFO *info;
 
                 info = LibFileInfo(handle);
                 size = info->FileSize+1;
-                FreePool(info);
         }
 
         if (off > 0) {
@@ -332,11 +328,11 @@ EFI_STATUS file_read(EFI_FILE_HANDLE dir, CHAR16 *name, UINTN off, UINTN size, C
         if (!EFI_ERROR(err)) {
                 buf[size] = '\0';
                 *content = buf;
+                buf = NULL;
                 if (content_size)
                         *content_size = size;
-        } else
-                FreePool(buf);
-
+        }
         uefi_call_wrapper(handle->Close, 1, handle);
+
         return err;
 }