diff options
author | Laszlo Ersek <lersek@redhat.com> | 2020-12-16 22:11:06 +0100 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2020-12-21 17:16:23 +0000 |
commit | 44bc78790e1b307b87fcc3c54885ae84471254a2 (patch) | |
tree | 4e0c2bba496f2818e434485e40e31f37b8bd06e9 | |
parent | ba1184630ae54af0ad3bdbb97982d740cf50e9be (diff) | |
download | edk2-44bc78790e1b307b87fcc3c54885ae84471254a2.tar.gz edk2-44bc78790e1b307b87fcc3c54885ae84471254a2.tar.bz2 edk2-44bc78790e1b307b87fcc3c54885ae84471254a2.zip |
OvmfPkg/VirtioFsDxe: add helper for formatting UEFI basenames
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 <ard.biesheuvel@arm.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20201216211125.19496-30-lersek@redhat.com>
Acked-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
-rw-r--r-- | OvmfPkg/VirtioFsDxe/Helpers.c | 61 | ||||
-rw-r--r-- | OvmfPkg/VirtioFsDxe/VirtioFsDxe.h | 7 |
2 files changed, 68 insertions, 0 deletions
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 @@ -1723,6 +1723,67 @@ ForgetNextDirNodeId: }
/**
+ 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 @@ -235,6 +235,13 @@ VirtioFsLookupMostSpecificParentDir ( );
EFI_STATUS
+VirtioFsGetBasename (
+ IN CHAR8 *Path,
+ OUT CHAR16 *Basename OPTIONAL,
+ IN OUT UINTN *BasenameSize
+ );
+
+EFI_STATUS
VirtioFsFuseAttrToEfiFileInfo (
IN VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE *FuseAttr,
OUT EFI_FILE_INFO *FileInfo
|