\r
return EFI_SUCCESS;\r
}\r
+\r
+/**\r
+ Convert a VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE filename to an EFI_FILE_INFO\r
+ filename.\r
+\r
+ @param[in] FuseDirent The VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE object to\r
+ convert the filename byte array from. The caller is\r
+ responsible for ensuring that FuseDirent->Namelen\r
+ describe valid storage.\r
+\r
+ @param[in,out] FileInfo The EFI_FILE_INFO structure to modify. On input, the\r
+ caller is responsible for setting FileInfo->Size\r
+ according to the allocated size. On successful\r
+ return, FileInfo->Size is reduced to reflect the\r
+ filename converted into FileInfo->FileName.\r
+ FileInfo->FileName is set from the filename byte\r
+ array that directly follows the FuseDirent header\r
+ object. Fields other than FileInfo->Size and\r
+ FileInfo->FileName are not modified.\r
+\r
+ @retval EFI_SUCCESS Conversion successful.\r
+\r
+ @retval EFI_INVALID_PARAMETER VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE()\r
+ returns zero for FuseDirent->Namelen.\r
+\r
+ @retval EFI_BUFFER_TOO_SMALL On input, FileInfo->Size does not provide\r
+ enough room for converting the filename byte\r
+ array from FuseDirent.\r
+\r
+ @retval EFI_UNSUPPORTED The FuseDirent filename byte array contains a\r
+ byte that falls outside of the printable ASCII\r
+ range, or is a forward slash or a backslash.\r
+**/\r
+EFI_STATUS\r
+VirtioFsFuseDirentPlusToEfiFileInfo (\r
+ IN VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE *FuseDirent,\r
+ IN OUT EFI_FILE_INFO *FileInfo\r
+ )\r
+{\r
+ UINTN DirentSize;\r
+ UINTN FileInfoSize;\r
+ UINT8 *DirentName;\r
+ UINT32 Idx;\r
+\r
+ DirentSize = VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE (FuseDirent->Namelen);\r
+ if (DirentSize == 0) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // We're now safe from overflow in the calculation below.\r
+ //\r
+ FileInfoSize = (OFFSET_OF (EFI_FILE_INFO, FileName) +\r
+ ((UINTN)FuseDirent->Namelen + 1) * sizeof (CHAR16));\r
+ if (FileInfoSize > FileInfo->Size) {\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ //\r
+ // Convert the name.\r
+ //\r
+ DirentName = (UINT8 *)(FuseDirent + 1);\r
+ for (Idx = 0; Idx < FuseDirent->Namelen; Idx++) {\r
+ UINT8 NameByte;\r
+\r
+ NameByte = DirentName[Idx];\r
+ if (NameByte < 0x20 || NameByte > 0x7E ||\r
+ NameByte == '/' || NameByte == '\\') {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ FileInfo->FileName[Idx] = (CHAR16)NameByte;\r
+ }\r
+ FileInfo->FileName[Idx++] = L'\0';\r
+ //\r
+ // Set the (possibly reduced) size.\r
+ //\r
+ FileInfo->Size = FileInfoSize;\r
+\r
+ return EFI_SUCCESS;\r
+}\r