/** @file\r
The Miscellaneous Routines for TlsAuthConfigDxe driver.\r
\r
-Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
return Status;\r
}\r
\r
-/**\r
- This function will open a file or directory referenced by DevicePath.\r
-\r
- This function opens a file with the open mode according to the file path. The\r
- Attributes is valid only for EFI_FILE_MODE_CREATE.\r
-\r
- @param[in, out] FilePath On input, the device path to the file.\r
- On output, the remaining device path.\r
- @param[out] FileHandle Pointer to the file handle.\r
- @param[in] OpenMode The mode to open the file with.\r
- @param[in] Attributes The file's file attributes.\r
-\r
- @retval EFI_SUCCESS The information was set.\r
- @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.\r
- @retval EFI_UNSUPPORTED Could not open the file path.\r
- @retval EFI_NOT_FOUND The specified file could not be found on the\r
- device or the file system could not be found on\r
- the device.\r
- @retval EFI_NO_MEDIA The device has no medium.\r
- @retval EFI_MEDIA_CHANGED The device has a different medium in it or the\r
- medium is no longer supported.\r
- @retval EFI_DEVICE_ERROR The device reported an error.\r
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
- @retval EFI_WRITE_PROTECTED The file or medium is write protected.\r
- @retval EFI_ACCESS_DENIED The file was opened read only.\r
- @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the\r
- file.\r
- @retval EFI_VOLUME_FULL The volume is full.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-OpenFileByDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath,\r
- OUT EFI_FILE_HANDLE *FileHandle,\r
- IN UINT64 OpenMode,\r
- IN UINT64 Attributes\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol;\r
- EFI_FILE_PROTOCOL *Handle1;\r
- EFI_FILE_PROTOCOL *Handle2;\r
- EFI_HANDLE DeviceHandle;\r
-\r
- if ((FilePath == NULL || FileHandle == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Status = gBS->LocateDevicePath (\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- FilePath,\r
- &DeviceHandle\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = gBS->OpenProtocol(\r
- DeviceHandle,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- (VOID**)&EfiSimpleFileSystemProtocol,\r
- gImageHandle,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = EfiSimpleFileSystemProtocol->OpenVolume(EfiSimpleFileSystemProtocol, &Handle1);\r
- if (EFI_ERROR (Status)) {\r
- FileHandle = NULL;\r
- return Status;\r
- }\r
-\r
- //\r
- // go down directories one node at a time.\r
- //\r
- while (!IsDevicePathEnd (*FilePath)) {\r
- //\r
- // For file system access each node should be a file path component\r
- //\r
- if (DevicePathType (*FilePath) != MEDIA_DEVICE_PATH ||\r
- DevicePathSubType (*FilePath) != MEDIA_FILEPATH_DP\r
- ) {\r
- FileHandle = NULL;\r
- return (EFI_INVALID_PARAMETER);\r
- }\r
- //\r
- // Open this file path node\r
- //\r
- Handle2 = Handle1;\r
- Handle1 = NULL;\r
-\r
- //\r
- // Try to test opening an existing file\r
- //\r
- Status = Handle2->Open (\r
- Handle2,\r
- &Handle1,\r
- ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName,\r
- OpenMode &~EFI_FILE_MODE_CREATE,\r
- 0\r
- );\r
-\r
- //\r
- // see if the error was that it needs to be created\r
- //\r
- if ((EFI_ERROR (Status)) && (OpenMode != (OpenMode &~EFI_FILE_MODE_CREATE))) {\r
- Status = Handle2->Open (\r
- Handle2,\r
- &Handle1,\r
- ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName,\r
- OpenMode,\r
- Attributes\r
- );\r
- }\r
- //\r
- // Close the last node\r
- //\r
- Handle2->Close (Handle2);\r
-\r
- if (EFI_ERROR(Status)) {\r
- return (Status);\r
- }\r
-\r
- //\r
- // Get the next node\r
- //\r
- *FilePath = NextDevicePathNode (*FilePath);\r
- }\r
-\r
- //\r
- // This is a weak spot since if the undefined SHELL_FILE_HANDLE format changes this must change also!\r
- //\r
- *FileHandle = (VOID*)Handle1;\r
- return EFI_SUCCESS;\r
-}\r
-\r
/**\r
This function converts an input device structure to a Unicode string.\r
\r
EFI_SIGNATURE_LIST *CACert;\r
EFI_SIGNATURE_DATA *CACertData;\r
VOID *Data;\r
+ VOID *CurrentData;\r
UINTN DataSize;\r
UINTN SigDataSize;\r
UINT32 Attr;\r
CACert = NULL;\r
CACertData = NULL;\r
Data = NULL;\r
+ CurrentData = NULL;\r
Attr = 0;\r
\r
Status = ReadFileContent (\r
Status = gRT->GetVariable(\r
VariableName,\r
&gEfiTlsCaCertificateGuid,\r
- &Attr,\r
+ NULL,\r
&DataSize,\r
NULL\r
);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ //\r
+ // Per spec, we have to fetch the variable's contents, even though we're\r
+ // only interested in the variable's attributes.\r
+ //\r
+ CurrentData = AllocatePool (DataSize);\r
+ if (CurrentData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+ Status = gRT->GetVariable(\r
+ VariableName,\r
+ &gEfiTlsCaCertificateGuid,\r
+ &Attr,\r
+ &DataSize,\r
+ CurrentData\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
Attr |= EFI_VARIABLE_APPEND_WRITE;\r
} else if (Status == EFI_NOT_FOUND) {\r
Attr = TLS_AUTH_CONFIG_VAR_BASE_ATTR;\r
FreePool (Data);\r
}\r
\r
+ if (CurrentData != NULL) {\r
+ FreePool (CurrentData);\r
+ }\r
+\r
if (X509Data != NULL) {\r
FreePool (X509Data);\r
}\r
\r
mTlsAuthPrivateData->FileContext->FileName = FileName;\r
\r
- OpenFileByDevicePath (\r
+ EfiOpenFileByDevicePath (\r
&FilePath,\r
&mTlsAuthPrivateData->FileContext->FHandle,\r
EFI_FILE_MODE_READ,\r
HiiGetBrowserData (&gTlsAuthConfigGuid, mTlsAuthConfigStorageName, BufferSize, (UINT8 *) IfrNvData);\r
\r
if ((Action != EFI_BROWSER_ACTION_CHANGED) &&\r
- (Action != EFI_BROWSER_ACTION_CHANGING) && \r
+ (Action != EFI_BROWSER_ACTION_CHANGING) &&\r
(Action != EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
Status = EFI_UNSUPPORTED;\r
goto EXIT;\r
break;\r
case KEY_TLS_AUTH_CONFIG_ENROLL_CERT_FROM_FILE:\r
//\r
- // If the file is already opened, clean the file related resource first. \r
+ // If the file is already opened, clean the file related resource first.\r
//\r
CleanFileContext (Private);\r
- \r
+\r
ChooseFile( NULL, NULL, UpdateCAFromFile, &File);\r
break;\r
\r