[edk2-devel] [edk2 PATCH 29/48] OvmfPkg/VirtioFsDxe: add helper for formatting UEFI basenames

Laszlo Ersek lersek at redhat.com
Wed Dec 16 21:11:06 UTC 2020


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 at arm.com>
Cc: Jordan Justen <jordan.l.justen at intel.com>
Cc: Philippe Mathieu-Daudé <philmd at redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
 OvmfPkg/VirtioFsDxe/VirtioFsDxe.h |  7 +++
 OvmfPkg/VirtioFsDxe/Helpers.c     | 61 ++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
index 029c568b39c7..d1b746c0d8cf 100644
--- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
+++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
@@ -229,16 +229,23 @@ VirtioFsAppendPath (
 EFI_STATUS
 VirtioFsLookupMostSpecificParentDir (
   IN OUT VIRTIO_FS *VirtioFs,
   IN OUT CHAR8     *Path,
      OUT UINT64    *DirNodeId,
      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,
      OUT EFI_FILE_INFO                      *FileInfo
   );
 
 //
 // Wrapper functions for FUSE commands (primitives).
diff --git a/OvmfPkg/VirtioFsDxe/Helpers.c b/OvmfPkg/VirtioFsDxe/Helpers.c
index 6adc0341dee6..77f718e91233 100644
--- a/OvmfPkg/VirtioFsDxe/Helpers.c
+++ b/OvmfPkg/VirtioFsDxe/Helpers.c
@@ -1717,16 +1717,77 @@ VirtioFsLookupMostSpecificParentDir (
   *LastComponent = Slash + 1;
   return EFI_SUCCESS;
 
 ForgetNextDirNodeId:
   VirtioFsFuseForget (VirtioFs, NextDirNodeId);
   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.
 
   @param[in] FuseAttr   The VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE object to
                         convert the relevant fields from.
 
   @param[out] FileInfo  The EFI_FILE_INFO structure to modify. Importantly, the
-- 
2.19.1.3.g30247aa5d201




-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#69043): https://edk2.groups.io/g/devel/message/69043
Mute This Topic: https://groups.io/mt/79023796/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list