X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FDisk%2FUdfDxe%2FFile.c;h=4ad7bb93da4a3458512a455f38b9221be54a3157;hp=2249f4ea0e8e566f3fc67d8a81d8985bb3d4fc4b;hb=9d510e61fceee7b92955ef9a3c20343752d8ce3f;hpb=5fb22f5920039393f74030c74c216517a131dbe0 diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c b/MdeModulePkg/Universal/Disk/UdfDxe/File.c index 2249f4ea0e..4ad7bb93da 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c @@ -2,14 +2,9 @@ Handle operations in files and directories from UDF/ECMA-167 file systems. Copyright (C) 2014-2017 Paulo Alcantara + Copyright (c) 2018, Intel Corporation. All rights reserved.
- This program and the accompanying materials are licensed and made available - under the terms and conditions of the BSD License which accompanies this - distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT - WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "Udf.h" @@ -248,7 +243,7 @@ UdfOpen ( FileName = TempFileName + 1; } - StrCpyS (NewPrivFileData->FileName, UDF_PATH_LENGTH, FileName); + StrCpyS (NewPrivFileData->FileName, UDF_FILENAME_LENGTH, FileName); Status = GetFileSize ( PrivFsData->BlockIo, @@ -257,8 +252,12 @@ UdfOpen ( &NewPrivFileData->File, &NewPrivFileData->FileSize ); - ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: GetFileSize() fails with status - %r.\n", + __FUNCTION__, Status + )); goto Error_Get_File_Size; } @@ -453,7 +452,7 @@ UdfRead ( FreePool ((VOID *)NewFileEntryData); NewFileEntryData = FoundFile.FileEntry; - Status = GetFileNameFromFid (NewFileIdentifierDesc, FileName); + Status = GetFileNameFromFid (NewFileIdentifierDesc, ARRAY_SIZE (FileName), FileName); if (EFI_ERROR (Status)) { FreePool ((VOID *)FoundFile.FileIdentifierDesc); goto Error_Get_FileName; @@ -465,7 +464,7 @@ UdfRead ( FoundFile.FileIdentifierDesc = NewFileIdentifierDesc; FoundFile.FileEntry = NewFileEntryData; - Status = GetFileNameFromFid (FoundFile.FileIdentifierDesc, FileName); + Status = GetFileNameFromFid (FoundFile.FileIdentifierDesc, ARRAY_SIZE (FileName), FileName); if (EFI_ERROR (Status)) { goto Error_Get_FileName; } @@ -496,6 +495,10 @@ UdfRead ( PrivFileData->FilePosition++; Status = EFI_SUCCESS; } else if (IS_FID_DELETED_FILE (Parent->FileIdentifierDesc)) { + // + // Code should never reach here. + // + ASSERT (FALSE); Status = EFI_DEVICE_ERROR; } @@ -713,7 +716,7 @@ UdfSetPosition ( // set to the EOF. // if (Position == 0xFFFFFFFFFFFFFFFF) { - PrivFileData->FilePosition = PrivFileData->FileSize - 1; + PrivFileData->FilePosition = PrivFileData->FileSize; } else { PrivFileData->FilePosition = Position; } @@ -753,19 +756,16 @@ UdfGetInfo ( OUT VOID *Buffer ) { - EFI_STATUS Status; - PRIVATE_UDF_FILE_DATA *PrivFileData; - PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData; - EFI_FILE_SYSTEM_INFO *FileSystemInfo; - UINTN FileSystemInfoLength; - CHAR16 *String; - UDF_FILE_SET_DESCRIPTOR *FileSetDesc; - UINTN Index; - UINT8 *OstaCompressed; - UINT8 CompressionId; - UINT64 VolumeSize; - UINT64 FreeSpaceSize; - CHAR16 VolumeLabel[64]; + EFI_STATUS Status; + PRIVATE_UDF_FILE_DATA *PrivFileData; + PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData; + EFI_FILE_SYSTEM_INFO *FileSystemInfo; + UINTN FileSystemInfoLength; + UINT64 VolumeSize; + UINT64 FreeSpaceSize; + EFI_FILE_SYSTEM_VOLUME_LABEL *FileSystemVolumeLabel; + UINTN FileSystemVolumeLabelLength; + CHAR16 VolumeLabel[64]; if (This == NULL || InformationType == NULL || BufferSize == NULL || (*BufferSize != 0 && Buffer == NULL)) { @@ -787,43 +787,11 @@ UdfGetInfo ( Buffer ); } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - String = VolumeLabel; - - FileSetDesc = &PrivFsData->Volume.FileSetDesc; - - OstaCompressed = &FileSetDesc->LogicalVolumeIdentifier[0]; - - CompressionId = OstaCompressed[0]; - if (!IS_VALID_COMPRESSION_ID (CompressionId)) { - return EFI_VOLUME_CORRUPTED; - } - - for (Index = 1; Index < 128; Index++) { - if (CompressionId == 16) { - *String = *(UINT8 *)(OstaCompressed + Index) << 8; - Index++; - } else { - *String = 0; - } - - if (Index < 128) { - *String |= (CHAR16)(*(UINT8 *)(OstaCompressed + Index)); - } - - // - // Unlike FID Identifiers, Logical Volume Identifier is stored in a - // NULL-terminated OSTA compressed format, so we must check for the NULL - // character. - // - if (*String == L'\0') { - break; - } - - String++; + Status = GetVolumeLabel (&PrivFsData->Volume, ARRAY_SIZE (VolumeLabel), VolumeLabel); + if (EFI_ERROR (Status)) { + return Status; } - *String = L'\0'; - FileSystemInfoLength = StrSize (VolumeLabel) + sizeof (EFI_FILE_SYSTEM_INFO); if (*BufferSize < FileSystemInfoLength) { @@ -832,8 +800,11 @@ UdfGetInfo ( } FileSystemInfo = (EFI_FILE_SYSTEM_INFO *)Buffer; - StrCpyS (FileSystemInfo->VolumeLabel, ARRAY_SIZE (VolumeLabel), - VolumeLabel); + StrCpyS ( + FileSystemInfo->VolumeLabel, + (*BufferSize - SIZE_OF_EFI_FILE_SYSTEM_INFO) / sizeof (CHAR16), + VolumeLabel + ); Status = GetVolumeSize ( PrivFsData->BlockIo, PrivFsData->DiskIo, @@ -854,6 +825,26 @@ UdfGetInfo ( *BufferSize = FileSystemInfoLength; Status = EFI_SUCCESS; + } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { + Status = GetVolumeLabel (&PrivFsData->Volume, ARRAY_SIZE (VolumeLabel), VolumeLabel); + if (EFI_ERROR (Status)) { + return Status; + } + + FileSystemVolumeLabelLength = StrSize (VolumeLabel) + + sizeof (EFI_FILE_SYSTEM_VOLUME_LABEL); + if (*BufferSize < FileSystemVolumeLabelLength) { + *BufferSize = FileSystemVolumeLabelLength; + return EFI_BUFFER_TOO_SMALL; + } + + FileSystemVolumeLabel = (EFI_FILE_SYSTEM_VOLUME_LABEL *)Buffer; + StrCpyS ( + FileSystemVolumeLabel->VolumeLabel, + (*BufferSize - SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL) / sizeof (CHAR16), + VolumeLabel + ); + Status = EFI_SUCCESS; } return Status;