mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/UdfDxe: Add more check when getting PD from LongAd
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: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Paulo Alcantara <palcantara@suse.de> Acked-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
32698a8f01
commit
85acb5e8ff
|
@ -242,11 +242,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;
|
||||
|
|
Loading…
Reference in New Issue