efi_loader: unaligned access in efi_file_from_path()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 14 Jul 2019 18:14:46 +0000 (20:14 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 16 Jul 2019 22:17:23 +0000 (22:17 +0000)
The device path structure is packed. So no assumption on the alignment is
possible. Copy the file name in efi_file_from_path() to assure there is no
unaligned access.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_file.c

index 36ca719a82fde2b33b181203bd1a8146ec720e37..f4ca5694eee3a688ca2a4331096f42ab7f30a122 100644 (file)
@@ -755,6 +755,7 @@ struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp)
                struct efi_device_path_file_path *fdp =
                        container_of(fp, struct efi_device_path_file_path, dp);
                struct efi_file_handle *f2;
+               u16 *filename;
 
                if (!EFI_DP_TYPE(fp, MEDIA_DEVICE, FILE_PATH)) {
                        printf("bad file path!\n");
@@ -762,8 +763,12 @@ struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp)
                        return NULL;
                }
 
-               EFI_CALL(ret = f->open(f, &f2, fdp->str,
+               filename = u16_strdup(fdp->str);
+               if (!filename)
+                       return NULL;
+               EFI_CALL(ret = f->open(f, &f2, filename,
                                       EFI_FILE_MODE_READ, 0));
+               free(filename);
                if (ret != EFI_SUCCESS)
                        return NULL;