UDF/ECMA-167 file system driver.\r
\r
Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>\r
+ Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials are licensed and made available\r
under the terms and conditions of the BSD License which accompanies this\r
{ 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \\r
}\r
\r
-#define UDF_DEFAULT_LV_NUM 0\r
-\r
-#define IS_PVD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 1))\r
-#define IS_PD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 5))\r
-#define IS_LVD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 6))\r
-#define IS_TD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 8))\r
-#define IS_FSD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 256))\r
-#define IS_FE(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 261))\r
-#define IS_EFE(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 266))\r
-#define IS_FID(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 257))\r
-#define IS_AED(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 258))\r
-#define IS_LVID(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 9))\r
-\r
-#define _GET_FILETYPE(_Pointer) \\r
- (IS_FE (_Pointer) ? \\r
- (((UDF_FILE_ENTRY *)(_Pointer))->IcbTag.FileType) \\r
- : \\r
- (((UDF_EXTENDED_FILE_ENTRY *)(_Pointer))->IcbTag.FileType))\r
-\r
-#define IS_FE_DIRECTORY(_Pointer) \\r
- ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 4))\r
-#define IS_FE_STANDARD_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 5))\r
-#define IS_FE_SYMLINK(_Pointer) \\r
- ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 12))\r
+#define FE_ICB_FILE_TYPE(_Ptr) \\r
+ (UDF_FILE_ENTRY_TYPE)( \\r
+ ((UDF_DESCRIPTOR_TAG *)(_Ptr))->TagIdentifier == UdfFileEntry ? \\r
+ ((UDF_FILE_ENTRY *)(_Ptr))->IcbTag.FileType : \\r
+ ((UDF_EXTENDED_FILE_ENTRY *)(_Ptr))->IcbTag.FileType)\r
+\r
+typedef enum {\r
+ UdfFileEntryDirectory = 4,\r
+ UdfFileEntryStandardFile = 5,\r
+ UdfFileEntrySymlink = 12,\r
+} UDF_FILE_ENTRY_TYPE;\r
\r
#define HIDDEN_FILE (1 << 0)\r
#define DIRECTORY_FILE (1 << 1)\r
#define DELETED_FILE (1 << 2)\r
#define PARENT_FILE (1 << 3)\r
\r
-#define _GET_FILE_CHARS(_Pointer) \\r
- (((UDF_FILE_IDENTIFIER_DESCRIPTOR *)(_Pointer))->FileCharacteristics)\r
-\r
-#define IS_FID_HIDDEN_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & HIDDEN_FILE))\r
-#define IS_FID_DIRECTORY_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & DIRECTORY_FILE))\r
-#define IS_FID_DELETED_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & DELETED_FILE))\r
-#define IS_FID_PARENT_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & PARENT_FILE))\r
-#define IS_FID_NORMAL_FILE(_Pointer) \\r
- ((BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Pointer) && \\r
- !IS_FID_PARENT_FILE (_Pointer)))\r
+#define IS_FID_HIDDEN_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & HIDDEN_FILE)\r
+#define IS_FID_DIRECTORY_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & DIRECTORY_FILE)\r
+#define IS_FID_DELETED_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & DELETED_FILE)\r
+#define IS_FID_PARENT_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & PARENT_FILE)\r
+#define IS_FID_NORMAL_FILE(_Fid) \\r
+ (BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Fid) && \\r
+ !IS_FID_PARENT_FILE (_Fid))\r
\r
typedef enum {\r
- SHORT_ADS_SEQUENCE,\r
- LONG_ADS_SEQUENCE,\r
- EXTENDED_ADS_SEQUENCE,\r
- INLINE_DATA\r
+ ShortAdsSequence,\r
+ LongAdsSequence,\r
+ ExtendedAdsSequence,\r
+ InlineData\r
} UDF_FE_RECORDING_FLAGS;\r
\r
#define GET_FE_RECORDING_FLAGS(_Fe) \\r
sizeof (UDF_DESCRIPTOR_TAG)))->Flags & 0x07)\r
\r
typedef enum {\r
- EXTENT_RECORDED_AND_ALLOCATED,\r
- EXTENT_NOT_RECORDED_BUT_ALLOCATED,\r
- EXTENT_NOT_RECORDED_NOT_ALLOCATED,\r
- EXTENT_IS_NEXT_EXTENT,\r
+ ExtentRecordedAndAllocated,\r
+ ExtentNotRecordedButAllocated,\r
+ ExtentNotRecordedNotAllocated,\r
+ ExtentIsNextExtent,\r
} UDF_EXTENT_FLAGS;\r
\r
#define AD_LENGTH(_RecFlags) \\r
- ((_RecFlags) == SHORT_ADS_SEQUENCE ? \\r
+ ((_RecFlags) == ShortAdsSequence ? \\r
((UINT64)(sizeof (UDF_SHORT_ALLOCATION_DESCRIPTOR))) : \\r
((UINT64)(sizeof (UDF_LONG_ALLOCATION_DESCRIPTOR))))\r
\r
#define GET_EXTENT_FLAGS(_RecFlags, _Ad) \\r
- ((_RecFlags) == SHORT_ADS_SEQUENCE ? \\r
+ ((_RecFlags) == ShortAdsSequence ? \\r
((UDF_EXTENT_FLAGS)((((UDF_SHORT_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength >> \\r
30) & 0x3)) : \\r
((UDF_EXTENT_FLAGS)((((UDF_LONG_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength >> \\r
30) & 0x3)))\r
\r
#define GET_EXTENT_LENGTH(_RecFlags, _Ad) \\r
- ((_RecFlags) == SHORT_ADS_SEQUENCE ? \\r
+ ((_RecFlags) == ShortAdsSequence ? \\r
((UINT32)((((UDF_SHORT_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength & \\r
~0xC0000000UL))) : \\r
((UINT32)((((UDF_LONG_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength & \\r
#define IS_VALID_COMPRESSION_ID(_CompId) \\r
((BOOLEAN)((_CompId) == 8 || (_CompId) == 16))\r
\r
-#define LV_BLOCK_SIZE(_Vol, _LvNum) \\r
- (_Vol)->LogicalVolDescs[(_LvNum)]->LogicalBlockSize\r
-\r
#define UDF_STANDARD_IDENTIFIER_LENGTH 5\r
\r
-#define LV_UDF_REVISION(_Lv) \\r
- *(UINT16 *)(UINTN)(_Lv)->DomainIdentifier.IdentifierSuffix\r
-\r
#pragma pack(1)\r
\r
typedef struct {\r
#pragma pack()\r
\r
typedef enum {\r
- READ_FILE_GET_FILESIZE,\r
- READ_FILE_ALLOCATE_AND_READ,\r
- READ_FILE_SEEK_AND_READ,\r
+ ReadFileGetFileSize,\r
+ ReadFileAllocateAndRead,\r
+ ReadFileSeekAndRead,\r
} UDF_READ_FILE_FLAGS;\r
\r
typedef struct {\r
\r
#pragma pack(1)\r
\r
-typedef struct {\r
- UINT8 CharacterSetType;\r
- UINT8 CharacterSetInfo[63];\r
-} UDF_CHAR_SPEC;\r
-\r
-typedef struct {\r
- UINT8 Flags;\r
- UINT8 Identifier[23];\r
- UINT8 IdentifierSuffix[8];\r
-} UDF_ENTITY_ID;\r
-\r
typedef struct {\r
UINT16 TypeAndTimezone;\r
INT16 Year;\r
UINT8 Microseconds;\r
} UDF_TIMESTAMP;\r
\r
-typedef struct {\r
- UINT32 LogicalBlockNumber;\r
- UINT16 PartitionReferenceNumber;\r
-} UDF_LB_ADDR;\r
-\r
-typedef struct {\r
- UINT32 ExtentLength;\r
- UDF_LB_ADDR ExtentLocation;\r
- UINT8 ImplementationUse[6];\r
-} UDF_LONG_ALLOCATION_DESCRIPTOR;\r
-\r
typedef struct {\r
UDF_DESCRIPTOR_TAG DescriptorTag;\r
UINT32 PrevAllocationExtentDescriptor;\r
UINT8 StructureData[2040];\r
} UDF_VOLUME_DESCRIPTOR;\r
\r
+typedef struct {\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UDF_TIMESTAMP RecordingDateTime;\r
+ UINT32 IntegrityType;\r
+ UDF_EXTENT_AD NextIntegrityExtent;\r
+ UINT8 LogicalVolumeContentsUse[32];\r
+ UINT32 NumberOfPartitions;\r
+ UINT32 LengthOfImplementationUse;\r
+ UINT8 Data[0];\r
+} UDF_LOGICAL_VOLUME_INTEGRITY;\r
+\r
typedef struct {\r
UDF_DESCRIPTOR_TAG DescriptorTag;\r
UINT32 VolumeDescriptorSequenceNumber;\r
UINT8 Reserved[156];\r
} UDF_PARTITION_DESCRIPTOR;\r
\r
-typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UINT32 VolumeDescriptorSequenceNumber;\r
- UDF_CHAR_SPEC DescriptorCharacterSet;\r
- UINT8 LogicalVolumeIdentifier[128];\r
- UINT32 LogicalBlockSize;\r
- UDF_ENTITY_ID DomainIdentifier;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR LogicalVolumeContentsUse;\r
- UINT32 MapTableLength;\r
- UINT32 NumberOfPartitionMaps;\r
- UDF_ENTITY_ID ImplementationIdentifier;\r
- UINT8 ImplementationUse[128];\r
- UDF_EXTENT_AD IntegritySequenceExtent;\r
- UINT8 PartitionMaps[6];\r
-} UDF_LOGICAL_VOLUME_DESCRIPTOR;\r
-\r
-typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UDF_TIMESTAMP RecordingDateTime;\r
- UINT32 IntegrityType;\r
- UDF_EXTENT_AD NextIntegrityExtent;\r
- UINT8 LogicalVolumeContentsUse[32];\r
- UINT32 NumberOfPartitions;\r
- UINT32 LengthOfImplementationUse;\r
- UINT8 Data[0];\r
-} UDF_LOGICAL_VOLUME_INTEGRITY;\r
-\r
typedef struct {\r
UDF_DESCRIPTOR_TAG DescriptorTag;\r
UDF_TIMESTAMP RecordingDateAndTime;\r
// UDF filesystem driver's private data\r
//\r
typedef struct {\r
- UDF_LOGICAL_VOLUME_DESCRIPTOR **LogicalVolDescs;\r
- UINTN LogicalVolDescsNo;\r
- UDF_PARTITION_DESCRIPTOR **PartitionDescs;\r
- UINTN PartitionDescsNo;\r
- UDF_FILE_SET_DESCRIPTOR **FileSetDescs;\r
- UINTN FileSetDescsNo;\r
+ UINT64 MainVdsStartLocation;\r
+ UDF_LOGICAL_VOLUME_DESCRIPTOR LogicalVolDesc;\r
+ UDF_PARTITION_DESCRIPTOR PartitionDesc;\r
+ UDF_FILE_SET_DESCRIPTOR FileSetDesc;\r
UINTN FileEntrySize;\r
} UDF_VOLUME_INFO;\r
\r
/**\r
Get information about a file.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The File Set Descriptor is external input, so this routine will do basic\r
+ validation for File Set Descriptor and report status.\r
+\r
@param This Protocol instance pointer.\r
@param InformationType Type of information to return in Buffer.\r
- @param BufferSize On input size of buffer, on output amount of data in buffer.\r
+ @param BufferSize On input size of buffer, on output amount of data in\r
+ buffer.\r
@param Buffer The buffer to return data.\r
\r
@retval EFI_SUCCESS Data was returned.\r
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
@retval EFI_WRITE_PROTECTED The device is write protected.\r
@retval EFI_ACCESS_DENIED The file was open for read only.\r
- @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.\r
+ @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in\r
+ BufferSize.\r
\r
**/\r
EFI_STATUS\r
Get a filename (encoded in OSTA-compressed format) from a File Identifier\r
Descriptor on an UDF volume.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The File Identifier Descriptor is external input, so this routine will do\r
+ basic validation for File Identifier Descriptor and report status.\r
+\r
@param[in] FileIdentifierDesc File Identifier Descriptor pointer.\r
+ @param[in] CharMax The maximum number of FileName Unicode char,\r
+ including terminating null char.\r
@param[out] FileName Decoded filename.\r
\r
@retval EFI_SUCCESS Filename decoded and read.\r
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_BUFFER_TOO_SMALL The string buffer FileName cannot hold the\r
+ decoded filename.\r
**/\r
EFI_STATUS\r
GetFileNameFromFid (\r
IN UDF_FILE_IDENTIFIER_DESCRIPTOR *FileIdentifierDesc,\r
+ IN UINTN CharMax,\r
OUT CHAR16 *FileName\r
);\r
\r
/**\r
Resolve a symlink file on an UDF volume.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The Path Component is external input, so this routine will do basic\r
+ validation for Path Component and report status.\r
+\r
@param[in] BlockIo BlockIo interface.\r
@param[in] DiskIo DiskIo interface.\r
@param[in] Volume UDF volume information structure.\r
OUT UDF_FILE_INFO *File\r
);\r
\r
-/**\r
- Clean up in-memory UDF volume information.\r
-\r
- @param[in] Volume Volume information pointer.\r
-\r
-**/\r
-VOID\r
-CleanupVolumeInformation (\r
- IN UDF_VOLUME_INFO *Volume\r
- );\r
-\r
/**\r
Clean up in-memory UDF file information.\r
\r
/**\r
Get volume and free space size information of an UDF volume.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The Logical Volume Descriptor and the Logical Volume Integrity Descriptor are\r
+ external inputs, so this routine will do basic validation for both descriptors\r
+ and report status.\r
+\r
@param[in] BlockIo BlockIo interface.\r
@param[in] DiskIo DiskIo interface.\r
@param[in] Volume UDF volume information structure.\r