REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1254
This commit will add an additional check within function GetPdFromLongAd() when getting a Partition Descriptor from given a Long Allocation Descriptor. According to UDF 2.60 Spec, Section 2.2.13: > The partition reference numbers used are determined by the order of the > Partition Maps in the LVD. (Also the picture comes before the above contents) And a more detailed explanation of the partition reference numbers is at https://sites.google.com/site/udfintro/ (seems not a formal documentation though), Section 5.3.6. Based on the above findings, the 'PartitionReferenceNumber' field in a Long Allocation Descriptor is used as an index to access the Partition Maps data within a Logical Volume Descriptor. Hence, the new check focuses on the validity of this 'PartitionReferenceNumber' field in a Long Allocation Descriptor. Since the current implementation of UdfDxe driver supports only one partition on a Logical Volume, so the value of 'PartitionReferenceNumber' should be 0. Cc: Paulo Alcantara <pa...@paulo.ac> Cc: Ruiyu Ni <ruiyu...@intel.com> Cc: Star Zeng <star.z...@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu <hao.a...@intel.com> --- MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c index 562a7d983c..7526de79b2 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c +++ b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c @@ -241,11 +241,16 @@ GetPdFromLongAd ( // // NOTE: Only one Type 1 (Physical) Partition is supported. It has been // checked already in Partition driver for existence of a single Type 1 - // Partition map, so we don't have to double check here. + // Partition map. Hence, the 'PartitionReferenceNumber' field (the index + // used to access Partition Maps data within the Logical Volume Descriptor) + // in the Long Allocation Descriptor should be 0 to indicate there is only + // one partition. // - // Partition reference number can also be retrieved from - // LongAd->ExtentLocation.PartitionReferenceNumber, however the spec says - // it may be 0, so let's not rely on it. + if (LongAd->ExtentLocation.PartitionReferenceNumber != 0) { + return NULL; + } + // + // Since only one partition, get the first one directly. // PartitionNum = *(UINT16 *)((UINTN)&LogicalVolDesc->PartitionMaps[4]); break; -- 2.12.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel