summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
diff options
context:
space:
mode:
Diffstat (limited to 'OvmfPkg/VirtioFsDxe/SimpleFsOpen.c')
-rw-r--r--OvmfPkg/VirtioFsDxe/SimpleFsOpen.c227
1 files changed, 138 insertions, 89 deletions
diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c b/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
index 9e46e8ab83..d479f76f5b 100644
--- a/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
+++ b/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
@@ -38,13 +38,13 @@
STATIC
EFI_STATUS
OpenRootDirectory (
- IN OUT VIRTIO_FS *VirtioFs,
- OUT EFI_FILE_PROTOCOL **NewHandle,
- IN BOOLEAN OpenForWriting
+ IN OUT VIRTIO_FS *VirtioFs,
+ OUT EFI_FILE_PROTOCOL **NewHandle,
+ IN BOOLEAN OpenForWriting
)
{
- EFI_STATUS Status;
- VIRTIO_FS_FILE *NewVirtioFsFile;
+ EFI_STATUS Status;
+ VIRTIO_FS_FILE *NewVirtioFsFile;
//
// VirtioFsOpenVolume() opens the root directory for read-only access. If the
@@ -54,18 +54,23 @@ OpenRootDirectory (
// permission first.
//
if (OpenForWriting) {
- VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
- EFI_FILE_INFO FileInfo;
-
- Status = VirtioFsFuseGetAttr (VirtioFs, VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID,
- &FuseAttr);
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
+ EFI_FILE_INFO FileInfo;
+
+ Status = VirtioFsFuseGetAttr (
+ VirtioFs,
+ VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID,
+ &FuseAttr
+ );
if (EFI_ERROR (Status)) {
return Status;
}
+
Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, &FileInfo);
if (EFI_ERROR (Status)) {
return Status;
}
+
if ((FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0) {
return EFI_ACCESS_DENIED;
}
@@ -76,7 +81,7 @@ OpenRootDirectory (
return Status;
}
- NewVirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (*NewHandle);
+ NewVirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (*NewHandle);
NewVirtioFsFile->IsOpenForWriting = OpenForWriting;
return EFI_SUCCESS;
}
@@ -132,33 +137,39 @@ OpenRootDirectory (
STATIC
EFI_STATUS
OpenExistentFileOrDirectory (
- IN OUT VIRTIO_FS *VirtioFs,
- IN UINT64 DirNodeId,
- IN CHAR8 *Name,
- IN BOOLEAN OpenForWriting,
- OUT UINT64 *NodeId,
- OUT UINT64 *FuseHandle,
- OUT BOOLEAN *NodeIsDirectory
+ IN OUT VIRTIO_FS *VirtioFs,
+ IN UINT64 DirNodeId,
+ IN CHAR8 *Name,
+ IN BOOLEAN OpenForWriting,
+ OUT UINT64 *NodeId,
+ OUT UINT64 *FuseHandle,
+ OUT BOOLEAN *NodeIsDirectory
)
{
- EFI_STATUS Status;
- UINT64 ResolvedNodeId;
- VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
- EFI_FILE_INFO FileInfo;
- BOOLEAN IsDirectory;
- UINT64 NewFuseHandle;
-
- Status = VirtioFsFuseLookup (VirtioFs, DirNodeId, Name, &ResolvedNodeId,
- &FuseAttr);
+ EFI_STATUS Status;
+ UINT64 ResolvedNodeId;
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
+ EFI_FILE_INFO FileInfo;
+ BOOLEAN IsDirectory;
+ UINT64 NewFuseHandle;
+
+ Status = VirtioFsFuseLookup (
+ VirtioFs,
+ DirNodeId,
+ Name,
+ &ResolvedNodeId,
+ &FuseAttr
+ );
if (EFI_ERROR (Status)) {
return Status;
}
+
Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, &FileInfo);
if (EFI_ERROR (Status)) {
goto ForgetResolvedNodeId;
}
- if (OpenForWriting && (FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0) {
+ if (OpenForWriting && ((FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0)) {
Status = EFI_ACCESS_DENIED;
goto ForgetResolvedNodeId;
}
@@ -173,9 +184,14 @@ OpenExistentFileOrDirectory (
//
Status = VirtioFsFuseOpenDir (VirtioFs, ResolvedNodeId, &NewFuseHandle);
} else {
- Status = VirtioFsFuseOpen (VirtioFs, ResolvedNodeId, OpenForWriting,
- &NewFuseHandle);
+ Status = VirtioFsFuseOpen (
+ VirtioFs,
+ ResolvedNodeId,
+ OpenForWriting,
+ &NewFuseHandle
+ );
}
+
if (EFI_ERROR (Status)) {
goto ForgetResolvedNodeId;
}
@@ -216,16 +232,16 @@ ForgetResolvedNodeId:
STATIC
EFI_STATUS
CreateDirectory (
- IN OUT VIRTIO_FS *VirtioFs,
- IN UINT64 DirNodeId,
- IN CHAR8 *Name,
- OUT UINT64 *NodeId,
- OUT UINT64 *FuseHandle
+ IN OUT VIRTIO_FS *VirtioFs,
+ IN UINT64 DirNodeId,
+ IN CHAR8 *Name,
+ OUT UINT64 *NodeId,
+ OUT UINT64 *FuseHandle
)
{
- EFI_STATUS Status;
- UINT64 NewChildDirNodeId;
- UINT64 NewFuseHandle;
+ EFI_STATUS Status;
+ UINT64 NewChildDirNodeId;
+ UINT64 NewFuseHandle;
Status = VirtioFsFuseMkDir (VirtioFs, DirNodeId, Name, &NewChildDirNodeId);
if (EFI_ERROR (Status)) {
@@ -273,41 +289,46 @@ RemoveNewChildDir:
STATIC
EFI_STATUS
CreateRegularFile (
- IN OUT VIRTIO_FS *VirtioFs,
- IN UINT64 DirNodeId,
- IN CHAR8 *Name,
- OUT UINT64 *NodeId,
- OUT UINT64 *FuseHandle
+ IN OUT VIRTIO_FS *VirtioFs,
+ IN UINT64 DirNodeId,
+ IN CHAR8 *Name,
+ OUT UINT64 *NodeId,
+ OUT UINT64 *FuseHandle
)
{
- return VirtioFsFuseOpenOrCreate (VirtioFs, DirNodeId, Name, NodeId,
- FuseHandle);
+ return VirtioFsFuseOpenOrCreate (
+ VirtioFs,
+ DirNodeId,
+ Name,
+ NodeId,
+ FuseHandle
+ );
}
EFI_STATUS
EFIAPI
VirtioFsSimpleFileOpen (
- IN EFI_FILE_PROTOCOL *This,
- OUT EFI_FILE_PROTOCOL **NewHandle,
- IN CHAR16 *FileName,
- IN UINT64 OpenMode,
- IN UINT64 Attributes
+ IN EFI_FILE_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **NewHandle,
+ IN CHAR16 *FileName,
+ IN UINT64 OpenMode,
+ IN UINT64 Attributes
)
{
- VIRTIO_FS_FILE *VirtioFsFile;
- VIRTIO_FS *VirtioFs;
- BOOLEAN OpenForWriting;
- BOOLEAN PermitCreation;
- BOOLEAN CreateDirectoryIfCreating;
- VIRTIO_FS_FILE *NewVirtioFsFile;
- EFI_STATUS Status;
- CHAR8 *NewCanonicalPath;
- BOOLEAN RootEscape;
- UINT64 DirNodeId;
- CHAR8 *LastComponent;
- UINT64 NewNodeId;
- UINT64 NewFuseHandle;
- BOOLEAN NewNodeIsDirectory;
+ VIRTIO_FS_FILE *VirtioFsFile;
+ VIRTIO_FS *VirtioFs;
+ BOOLEAN OpenForWriting;
+ BOOLEAN PermitCreation;
+ BOOLEAN CreateDirectoryIfCreating;
+ VIRTIO_FS_FILE *NewVirtioFsFile;
+ EFI_STATUS Status;
+ CHAR8 *NewCanonicalPath;
+ BOOLEAN RootEscape;
+ UINT64 DirNodeId;
+ CHAR8 *LastComponent;
+ UINT64 NewNodeId;
+ UINT64 NewFuseHandle;
+ BOOLEAN NewNodeIsDirectory;
VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);
VirtioFs = VirtioFsFile->OwnerFs;
@@ -316,20 +337,20 @@ VirtioFsSimpleFileOpen (
// Validate OpenMode.
//
switch (OpenMode) {
- case EFI_FILE_MODE_READ:
- OpenForWriting = FALSE;
- PermitCreation = FALSE;
- break;
- case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
- OpenForWriting = TRUE;
- PermitCreation = FALSE;
- break;
- case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE:
- OpenForWriting = TRUE;
- PermitCreation = TRUE;
- break;
- default:
- return EFI_INVALID_PARAMETER;
+ case EFI_FILE_MODE_READ:
+ OpenForWriting = FALSE;
+ PermitCreation = FALSE;
+ break;
+ case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
+ OpenForWriting = TRUE;
+ PermitCreation = FALSE;
+ break;
+ case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE:
+ OpenForWriting = TRUE;
+ PermitCreation = TRUE;
+ break;
+ default:
+ return EFI_INVALID_PARAMETER;
}
//
@@ -366,6 +387,7 @@ VirtioFsSimpleFileOpen (
));
return EFI_INVALID_PARAMETER;
}
+
CreateDirectoryIfCreating = (BOOLEAN)((Attributes &
EFI_FILE_DIRECTORY) != 0);
}
@@ -401,11 +423,16 @@ VirtioFsSimpleFileOpen (
// Create the canonical pathname at which the desired file is expected to
// exist.
//
- Status = VirtioFsAppendPath (VirtioFsFile->CanonicalPathname, FileName,
- &NewCanonicalPath, &RootEscape);
+ Status = VirtioFsAppendPath (
+ VirtioFsFile->CanonicalPathname,
+ FileName,
+ &NewCanonicalPath,
+ &RootEscape
+ );
if (EFI_ERROR (Status)) {
goto FreeNewVirtioFsFile;
}
+
if (RootEscape) {
Status = EFI_ACCESS_DENIED;
goto FreeNewCanonicalPath;
@@ -426,8 +453,12 @@ VirtioFsSimpleFileOpen (
// (given by DirNodeId) and last pathname component (i.e., immediate child
// within that parent directory).
//
- Status = VirtioFsLookupMostSpecificParentDir (VirtioFs, NewCanonicalPath,
- &DirNodeId, &LastComponent);
+ Status = VirtioFsLookupMostSpecificParentDir (
+ VirtioFs,
+ NewCanonicalPath,
+ &DirNodeId,
+ &LastComponent
+ );
if (EFI_ERROR (Status)) {
goto FreeNewCanonicalPath;
}
@@ -441,22 +472,40 @@ VirtioFsSimpleFileOpen (
// Try to open LastComponent directly under DirNodeId, as an existent regular
// file or directory.
//
- Status = OpenExistentFileOrDirectory (VirtioFs, DirNodeId, LastComponent,
- OpenForWriting, &NewNodeId, &NewFuseHandle, &NewNodeIsDirectory);
+ Status = OpenExistentFileOrDirectory (
+ VirtioFs,
+ DirNodeId,
+ LastComponent,
+ OpenForWriting,
+ &NewNodeId,
+ &NewFuseHandle,
+ &NewNodeIsDirectory
+ );
//
// If LastComponent could not be found under DirNodeId, but the request
// allows us to create a new entry, attempt creating the requested regular
// file or directory.
//
- if (Status == EFI_NOT_FOUND && PermitCreation) {
+ if ((Status == EFI_NOT_FOUND) && PermitCreation) {
ASSERT (OpenForWriting);
if (CreateDirectoryIfCreating) {
- Status = CreateDirectory (VirtioFs, DirNodeId, LastComponent, &NewNodeId,
- &NewFuseHandle);
+ Status = CreateDirectory (
+ VirtioFs,
+ DirNodeId,
+ LastComponent,
+ &NewNodeId,
+ &NewFuseHandle
+ );
} else {
- Status = CreateRegularFile (VirtioFs, DirNodeId, LastComponent,
- &NewNodeId, &NewFuseHandle);
+ Status = CreateRegularFile (
+ VirtioFs,
+ DirNodeId,
+ LastComponent,
+ &NewNodeId,
+ &NewFuseHandle
+ );
}
+
NewNodeIsDirectory = CreateDirectoryIfCreating;
}