Module Name: src Committed By: jmcneill Date: Sat Oct 23 15:20:26 UTC 2021
Modified Files: src/sys/external/bsd/gnu-efi/dist/lib: sread.c Log Message: The device path passed to EFI_BOOT_SERVICES.LocateDevicePath() may be modified and the resulting device path may not be aligned in such a way that the PathName string is not 16-bit aligned. Fix OpenSimpleFileRead to make a copy of the device path to ensure alignment before attempting to open a file. Idea from Tianocore's EFI shell Library/FileIO.c LibOpenFile(). To generate a diff of this commit: cvs rdiff -u -r1.1.1.1 -r1.2 src/sys/external/bsd/gnu-efi/dist/lib/sread.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/gnu-efi/dist/lib/sread.c diff -u src/sys/external/bsd/gnu-efi/dist/lib/sread.c:1.1.1.1 src/sys/external/bsd/gnu-efi/dist/lib/sread.c:1.2 --- src/sys/external/bsd/gnu-efi/dist/lib/sread.c:1.1.1.1 Tue Apr 1 16:16:07 2014 +++ src/sys/external/bsd/gnu-efi/dist/lib/sread.c Sat Oct 23 15:20:26 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: sread.c,v 1.1.1.1 2014/04/01 16:16:07 jakllsch Exp $ */ +/* $NetBSD: sread.c,v 1.2 2021/10/23 15:20:26 jmcneill Exp $ */ /*++ @@ -61,11 +61,13 @@ Returns: EFI_DEVICE_PATH *TempFilePath; EFI_DEVICE_PATH *TempFilePathPtr; FILEPATH_DEVICE_PATH *FilePathNode; + EFI_DEVICE_PATH_PROTOCOL *AlignedFilePath; EFI_FILE_HANDLE FileHandle, LastHandle; EFI_STATUS Status; EFI_LOAD_FILE_INTERFACE *LoadFile; FHand = NULL; + AlignedFilePath = NULL; UserFilePath = *FilePath; // @@ -106,12 +108,24 @@ Returns: Status = FileHandle ? EFI_SUCCESS : EFI_UNSUPPORTED; // + // Duplicate FilePath to make sure it is aligned so that + // FilePathNode->PathName below is 16-bit aligned. + // + AlignedFilePath = DuplicateDevicePath(*FilePath); + if (AlignedFilePath == NULL) { + if (FileHandle != NULL) { + uefi_call_wrapper(FileHandle->Close, 1, FileHandle); + } + return EFI_OUT_OF_RESOURCES; + } + + // // To access as a filesystem, the filepath should only // contain filepath components. Follow the filepath nodes // and find the target file // - FilePathNode = (FILEPATH_DEVICE_PATH *) *FilePath; + FilePathNode = (FILEPATH_DEVICE_PATH *)AlignedFilePath; while (!IsDevicePathEnd(&FilePathNode->Header)) { // @@ -262,6 +276,10 @@ Returns: Done: + if (AlignedFilePath) { + FreePool (AlignedFilePath); + } + // // If the file was not accessed, clean up //