]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
efi: NUL terminate strings read with efivar_get() 10804/head
authorLennart Poettering <lennart@poettering.net>
Tue, 23 Oct 2018 11:44:23 +0000 (13:44 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 16 Nov 2018 14:47:18 +0000 (15:47 +0100)
let's be more careful and NUL terminate everything we read from EFI
variables, in case it isn't already.

src/boot/efi/util.c

index 77d7b81fea5a1dd7fb0b24a540a72433c70aab07..320b12ef850d893c8c57026c2f5cb2926ee5054a 100644 (file)
@@ -105,18 +105,33 @@ EFI_STATUS efivar_set_int(CHAR16 *name, UINTN i, BOOLEAN persistent) {
 
 EFI_STATUS efivar_get(const CHAR16 *name, CHAR16 **value) {
         _cleanup_freepool_ CHAR8 *buf = NULL;
+        EFI_STATUS err;
         CHAR16 *val;
         UINTN size;
-        EFI_STATUS err;
 
         err = efivar_get_raw(&loader_guid, name, &buf, &size);
         if (EFI_ERROR(err))
                 return err;
 
-        val = StrDuplicate((CHAR16 *)buf);
+        /* Make sure there are no incomplete characters in the buffer */
+        if ((size % 2) != 0)
+                return EFI_INVALID_PARAMETER;
+
+        /* Return buffer directly if it happens to be NUL terminated already */
+        if (size >= 2 && buf[size-2] == 0 && buf[size-1] == 0) {
+                *value = (CHAR16*) buf;
+                buf = NULL;
+                return EFI_SUCCESS;
+        }
+
+        /* Make sure a terminating NUL is available at the end */
+        val = AllocatePool(size + 2);
         if (!val)
                 return EFI_OUT_OF_RESOURCES;
 
+        CopyMem(val, buf, size);
+        val[size/2] = 0; /* NUL terminate */
+
         *value = val;
         return EFI_SUCCESS;
 }