From 44bc78790e1b307b87fcc3c54885ae84471254a2 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 16 Dec 2020 22:11:06 +0100 Subject: OvmfPkg/VirtioFsDxe: add helper for formatting UEFI basenames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The EFI_FILE_INFO structure, which is output by EFI_FILE_PROTOCOL.GetInfo(), ends with a flexible CHAR16 array called "FileName". Add the VirtioFsGetBasename() function, for determining the required array size, and for filling the array as well. Cc: Ard Biesheuvel Cc: Jordan Justen Cc: Philippe Mathieu-Daudé Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097 Signed-off-by: Laszlo Ersek Message-Id: <20201216211125.19496-30-lersek@redhat.com> Acked-by: Ard Biesheuvel --- OvmfPkg/VirtioFsDxe/Helpers.c | 61 +++++++++++++++++++++++++++++++++++++++ OvmfPkg/VirtioFsDxe/VirtioFsDxe.h | 7 +++++ 2 files changed, 68 insertions(+) (limited to 'OvmfPkg/VirtioFsDxe') diff --git a/OvmfPkg/VirtioFsDxe/Helpers.c b/OvmfPkg/VirtioFsDxe/Helpers.c index 0e4390b005..5c3e990add 100644 --- a/OvmfPkg/VirtioFsDxe/Helpers.c +++ b/OvmfPkg/VirtioFsDxe/Helpers.c @@ -1722,6 +1722,67 @@ ForgetNextDirNodeId: return Status; } +/** + Format the last component of a canonical pathname into a caller-provided + CHAR16 array. + + @param[in] Path The canonical pathname (as defined in the + description of VirtioFsAppendPath()) to format + the last component of. + + @param[out] Basename If BasenameSize is zero on input, Basename may + be NULL. Otherwise, Basename is allocated by the + caller. On successful return, Basename contains + the last component of Path, formatted as a + NUL-terminated CHAR16 string. When Path is "/" + on input, Basename is L"" on output. + + @param[in,out] BasenameSize On input, the number of bytes the caller + provides in Basename. On output, regardless of + return value, the number of bytes required for + formatting Basename, including the terminating + L'\0'. + + @retval EFI_SUCCESS Basename has been filled in. + + @retval EFI_BUFFER_TOO_SMALL BasenameSize was too small on input; Basename + has not been modified. +**/ +EFI_STATUS +VirtioFsGetBasename ( + IN CHAR8 *Path, + OUT CHAR16 *Basename OPTIONAL, + IN OUT UINTN *BasenameSize + ) +{ + UINTN AllocSize; + UINTN LastComponent; + UINTN Idx; + UINTN PathSize; + + AllocSize = *BasenameSize; + + LastComponent = MAX_UINTN; + for (Idx = 0; Path[Idx] != '\0'; Idx++) { + if (Path[Idx] == '/') { + LastComponent = Idx; + } + } + PathSize = Idx + 1; + ASSERT (LastComponent < MAX_UINTN); + LastComponent++; + *BasenameSize = (PathSize - LastComponent) * sizeof Basename[0]; + + if (*BasenameSize > AllocSize) { + return EFI_BUFFER_TOO_SMALL; + } + + for (Idx = LastComponent; Idx < PathSize; Idx++) { + Basename[Idx - LastComponent] = Path[Idx]; + } + return EFI_SUCCESS; +} + /** Convert select fields of a VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE object to corresponding fields in EFI_FILE_INFO. diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h index 029c568b39..d1b746c0d8 100644 --- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h +++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h @@ -234,6 +234,13 @@ VirtioFsLookupMostSpecificParentDir ( OUT CHAR8 **LastComponent ); +EFI_STATUS +VirtioFsGetBasename ( + IN CHAR8 *Path, + OUT CHAR16 *Basename OPTIONAL, + IN OUT UINTN *BasenameSize + ); + EFI_STATUS VirtioFsFuseAttrToEfiFileInfo ( IN VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE *FuseAttr, -- cgit v1.2.3