ArmVirtPkg/ArmVirtQemu.dsc | 3 +- ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 3 +- ArmVirtPkg/ArmVirtQemuKernel.dsc | 3 +- ArmVirtPkg/ArmVirtXen.dsc | 3 +- ArmVirtPkg/ArmVirtXen.fdf | 1 + .../Universal/Disk/PartitionDxe/Partition.c | 9 +- .../Universal/Disk/PartitionDxe/Partition.h | 32 +- .../Universal/Disk/PartitionDxe/PartitionDxe.inf | 3 +- MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c | 318 +++ MdeModulePkg/Universal/Disk/UdfDxe/ComponentName.c | 185 ++ MdeModulePkg/Universal/Disk/UdfDxe/File.c | 903 ++++++++ MdeModulePkg/Universal/Disk/UdfDxe/FileName.c | 195 ++ .../Universal/Disk/UdfDxe/FileSystemOperations.c | 2447 ++++++++++++++++++++ MdeModulePkg/Universal/Disk/UdfDxe/Udf.c | 344 +++ MdeModulePkg/Universal/Disk/UdfDxe/Udf.h | 1244 ++++++++++ MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf | 66 + MdePkg/Include/IndustryStandard/Udf.h | 60 + Nt32Pkg/Nt32Pkg.dsc | 1 + Nt32Pkg/Nt32Pkg.fdf | 1 + OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32.fdf | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.fdf | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/OvmfPkgX64.fdf | 1 + 25 files changed, 5816 insertions(+), 11 deletions(-) create mode 100644 MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/ComponentName.c create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/File.c create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/FileName.c create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/Udf.c create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/Udf.h create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf create mode 100644 MdePkg/Include/IndustryStandard/Udf.h
Hi,
This series introduces read-only UDF file system support in EDK2. As
Laszlo (or Red Hat) seemed to be interested in such support, I'm posting
it again after ~3 years.
The idea is not replacing the default FAT file system, nor breaking any
existing file system support, but extending EDK2 with a new file system
that might be useful for some people who are looking for specific file
system features that current FAT doesn't support.
Originally the driver was written to support UDF file systems as
specified by OSTA Universal Disk Format Specification 2.60. However,
some Windows 10 Enterprise ISO (UDF bridge) images that I tested
supported a revision of 1.02 thus I had to rework the driver a little
bit to support such revision as well.
v2:
- Rework to _partially_ support UDF revisions <2.60.
- Use existing CDROM_VOLUME_DESCRIPTOR structure defined in Eltorito.h
instead of creating another one (UDF_VOLUME_DESCRIPTOR).
- Fixed UdfDxe to correctly follow UEFI driver model.
- Use HARDDRIVE_DEVICE_PATH instead of a vendor-defined one.
- Detect UDF file systems only in PartitionDxe, and let UdfDxe driver
check for specific UDF device path to decide whether or not install
SimpleFs protocol.
- Place MdePkg changes in a separate patch.
v3:
- Install UDF partition child handles with a Vendor-Defined Media
Device Path.
- Changed UdfDxe to check for Vendor-Defined Media Device Paths with a
specific UDF file system GUID when determining to whether or not
start the driver.
- Removed leading TAB chars in some source files identified by
PatchCheck.py tool.
v4:
- Added missing R-b's.
v5:
- Fixed OVMF IA32 build.
- Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
broke retrieval of private fs data from SimpleFs protocol --
identified by 'reconnect -r' command in UEFI shell.
Repo: https://github.com/pcacjr/edk2.git
Branch: udf-fs-v5
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Andrew Fish <afish@apple.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Mark Doran <mark.doran@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: hao.a.wu@intel.com
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>
---
Paulo Alcantara (6):
MdePkg: Add UDF volume structure definitions
MdeModulePkg/PartitionDxe: Add UDF file system support
MdeModulePkg: Initial UDF/ECMA-167 file system support
OvmfPkg: Enable UDF file system support
ArmVirtPkg: Enable UDF file system support
Nt32Pkg: Enable UDF file system support
ArmVirtPkg/ArmVirtQemu.dsc | 3 +-
ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 3 +-
ArmVirtPkg/ArmVirtQemuKernel.dsc | 3 +-
ArmVirtPkg/ArmVirtXen.dsc | 3 +-
ArmVirtPkg/ArmVirtXen.fdf | 1 +
.../Universal/Disk/PartitionDxe/Partition.c | 9 +-
.../Universal/Disk/PartitionDxe/Partition.h | 32 +-
.../Universal/Disk/PartitionDxe/PartitionDxe.inf | 3 +-
MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c | 318 +++
MdeModulePkg/Universal/Disk/UdfDxe/ComponentName.c | 185 ++
MdeModulePkg/Universal/Disk/UdfDxe/File.c | 903 ++++++++
MdeModulePkg/Universal/Disk/UdfDxe/FileName.c | 195 ++
.../Universal/Disk/UdfDxe/FileSystemOperations.c | 2447 ++++++++++++++++++++
MdeModulePkg/Universal/Disk/UdfDxe/Udf.c | 344 +++
MdeModulePkg/Universal/Disk/UdfDxe/Udf.h | 1244 ++++++++++
MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf | 66 +
MdePkg/Include/IndustryStandard/Udf.h | 60 +
Nt32Pkg/Nt32Pkg.dsc | 1 +
Nt32Pkg/Nt32Pkg.fdf | 1 +
OvmfPkg/OvmfPkgIa32.dsc | 1 +
OvmfPkg/OvmfPkgIa32.fdf | 1 +
OvmfPkg/OvmfPkgIa32X64.dsc | 1 +
OvmfPkg/OvmfPkgIa32X64.fdf | 1 +
OvmfPkg/OvmfPkgX64.dsc | 1 +
OvmfPkg/OvmfPkgX64.fdf | 1 +
25 files changed, 5816 insertions(+), 11 deletions(-)
create mode 100644 MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/ComponentName.c
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/File.c
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/FileName.c
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/Udf.h
create mode 100644 MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf
create mode 100644 MdePkg/Include/IndustryStandard/Udf.h
--
2.11.0
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ray,
On 07/09/2017 20:13, Paulo Alcantara wrote:
> v5:
> - Fixed OVMF IA32 build.
> - Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
> broke retrieval of private fs data from SimpleFs protocol --
> identified by 'reconnect -r' command in UEFI shell.
Follow the diff between v4 and v5 for Mde*Pkg changes (forgot to include
it when resending):
diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
index 8ad14fe594..2dbcff0be4 100644
--- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
+++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
@@ -372,7 +372,7 @@ UdfRead (
PrivFileData->FileSize,
&PrivFileData->FilePosition,
Buffer,
- BufferSize
+ (UINT64 *)(UINTN)BufferSize^M
);
} else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) {
diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
index 9f10c78ca9..49dc7077b7 100644
--- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
+++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
@@ -264,7 +264,7 @@ UdfDriverBindingStop (
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (!EFI_ERROR (Status)) {
- PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (This);
+ PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (SimpleFs);^M
//
// Uninstall child handle
Thanks,
Paulo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Paulo,
Did you mix the usage of "\r\n" and "\n"? because I saw a ^M in your diff.
However, the diff content looks good to me.
Thanks/Ray
> -----Original Message-----
> From: Paulo Alcantara [mailto:pcacjr@zytor.com]
> Sent: Friday, September 8, 2017 8:56 AM
> To: edk2-devel@lists.01.org
> Cc: Laszlo Ersek <lersek@redhat.com>; Justen, Jordan L
> <jordan.l.justen@intel.com>; Andrew Fish <afish@apple.com>; Kinney,
> Michael D <michael.d.kinney@intel.com>; Gao, Liming
> <liming.gao@intel.com>; Zeng, Star <star.zeng@intel.com>; Dong, Eric
> <eric.dong@intel.com>; Doran, Mark <mark.doran@intel.com>; Ni, Ruiyu
> <ruiyu.ni@intel.com>; Wu, Hao A <hao.a.wu@intel.com>
> Subject: Re: [PATCH v5 0/6] read-only UDF file system support
>
> Ray,
>
> On 07/09/2017 20:13, Paulo Alcantara wrote:
> > v5:
> > - Fixed OVMF IA32 build.
> > - Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
> > broke retrieval of private fs data from SimpleFs protocol --
> > identified by 'reconnect -r' command in UEFI shell.
>
> Follow the diff between v4 and v5 for Mde*Pkg changes (forgot to include it
> when resending):
>
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> index 8ad14fe594..2dbcff0be4 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> @@ -372,7 +372,7 @@ UdfRead (
> PrivFileData->FileSize,
> &PrivFileData->FilePosition,
> Buffer,
> - BufferSize
> + (UINT64 *)(UINTN)BufferSize^M
> );
> } else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
> if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) { diff --
> git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> index 9f10c78ca9..49dc7077b7 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> @@ -264,7 +264,7 @@ UdfDriverBindingStop (
> EFI_OPEN_PROTOCOL_GET_PROTOCOL
> );
> if (!EFI_ERROR (Status)) {
> - PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (This);
> + PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS
> (SimpleFs);^M
>
> //
> // Uninstall child handle
>
>
> Thanks,
> Paulo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Hi,
On 07/09/2017 23:41, Ni, Ruiyu wrote:
> Paulo,
> Did you mix the usage of "\r\n" and "\n"? because I saw a ^M in your diff.
> However, the diff content looks good to me.
No, I didn't. My local repo just lacked the 'git config core.whitespace
cr-at-eol' setting so 'git diff' showed the CRLFs as whitespace errors.
Just ignore them :-)
Thanks!
Paulo
>
> Thanks/Ray
>
>> -----Original Message-----
>> From: Paulo Alcantara [mailto:pcacjr@zytor.com]
>> Sent: Friday, September 8, 2017 8:56 AM
>> To: edk2-devel@lists.01.org
>> Cc: Laszlo Ersek <lersek@redhat.com>; Justen, Jordan L
>> <jordan.l.justen@intel.com>; Andrew Fish <afish@apple.com>; Kinney,
>> Michael D <michael.d.kinney@intel.com>; Gao, Liming
>> <liming.gao@intel.com>; Zeng, Star <star.zeng@intel.com>; Dong, Eric
>> <eric.dong@intel.com>; Doran, Mark <mark.doran@intel.com>; Ni, Ruiyu
>> <ruiyu.ni@intel.com>; Wu, Hao A <hao.a.wu@intel.com>
>> Subject: Re: [PATCH v5 0/6] read-only UDF file system support
>>
>> Ray,
>>
>> On 07/09/2017 20:13, Paulo Alcantara wrote:
>>> v5:
>>> - Fixed OVMF IA32 build.
>>> - Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
>>> broke retrieval of private fs data from SimpleFs protocol --
>>> identified by 'reconnect -r' command in UEFI shell.
>>
>> Follow the diff between v4 and v5 for Mde*Pkg changes (forgot to include it
>> when resending):
>>
>> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> index 8ad14fe594..2dbcff0be4 100644
>> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> @@ -372,7 +372,7 @@ UdfRead (
>> PrivFileData->FileSize,
>> &PrivFileData->FilePosition,
>> Buffer,
>> - BufferSize
>> + (UINT64 *)(UINTN)BufferSize^M
>> );
>> } else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
>> if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) { diff --
>> git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
>> b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
>> index 9f10c78ca9..49dc7077b7 100644
>> --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
>> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
>> @@ -264,7 +264,7 @@ UdfDriverBindingStop (
>> EFI_OPEN_PROTOCOL_GET_PROTOCOL
>> );
>> if (!EFI_ERROR (Status)) {
>> - PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (This);
>> + PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS
>> (SimpleFs);^M
>>
>> //
>> // Uninstall child handle
>>
>>
>> Thanks,
>> Paulo
>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Thanks/Ray
> -----Original Message-----
> From: Paulo Alcantara [mailto:pcacjr@zytor.com]
> Sent: Friday, September 8, 2017 8:56 AM
> To: edk2-devel@lists.01.org
> Cc: Laszlo Ersek <lersek@redhat.com>; Justen, Jordan L
> <jordan.l.justen@intel.com>; Andrew Fish <afish@apple.com>; Kinney,
> Michael D <michael.d.kinney@intel.com>; Gao, Liming
> <liming.gao@intel.com>; Zeng, Star <star.zeng@intel.com>; Dong, Eric
> <eric.dong@intel.com>; Doran, Mark <mark.doran@intel.com>; Ni, Ruiyu
> <ruiyu.ni@intel.com>; Wu, Hao A <hao.a.wu@intel.com>
> Subject: Re: [PATCH v5 0/6] read-only UDF file system support
>
> Ray,
>
> On 07/09/2017 20:13, Paulo Alcantara wrote:
> > v5:
> > - Fixed OVMF IA32 build.
> > - Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
> > broke retrieval of private fs data from SimpleFs protocol --
> > identified by 'reconnect -r' command in UEFI shell.
>
> Follow the diff between v4 and v5 for Mde*Pkg changes (forgot to include it
> when resending):
>
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> index 8ad14fe594..2dbcff0be4 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> @@ -372,7 +372,7 @@ UdfRead (
> PrivFileData->FileSize,
> &PrivFileData->FilePosition,
> Buffer,
> - BufferSize
> + (UINT64 *)(UINTN)BufferSize^M
> );
> } else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
> if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) { diff --
> git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> index 9f10c78ca9..49dc7077b7 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> @@ -264,7 +264,7 @@ UdfDriverBindingStop (
> EFI_OPEN_PROTOCOL_GET_PROTOCOL
> );
> if (!EFI_ERROR (Status)) {
> - PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (This);
> + PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS
> (SimpleFs);^M
>
> //
> // Uninstall child handle
>
>
> Thanks,
> Paulo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Paulo,
On 09/08/17 02:56, Paulo Alcantara wrote:
> Ray,
>
> On 07/09/2017 20:13, Paulo Alcantara wrote:
>> v5:
>> - Fixed OVMF IA32 build.
>> - Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
>> broke retrieval of private fs data from SimpleFs protocol --
>> identified by 'reconnect -r' command in UEFI shell.
>
> Follow the diff between v4 and v5 for Mde*Pkg changes (forgot to include
> it when resending):
>
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> index 8ad14fe594..2dbcff0be4 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> @@ -372,7 +372,7 @@ UdfRead (
> PrivFileData->FileSize,
> &PrivFileData->FilePosition,
> Buffer,
> - BufferSize
> + (UINT64 *)(UINTN)BufferSize^M
> );
This change is not correct.
(1) The UdfRead() function takes the following parameter:
IN OUT UINTN *BufferSize,
This means that, in an IA32 or ARM build,
sizeof *BufferSize == 4
and in an AARCH64 or X64 build,
sizeof *BufferSize == 8
(2) The above type-casting is part of a call to the ReadFileData()
function. The ReadFileData() function takes the following parameter:
IN OUT UINT64 *BufferSize
This means that, regardless of architecture,
sizeof *BufferSize == 8
The consequence is that, in an IA32 or ARM build, the ReadFileData()
function will both read and write beyond the end of the outermost
caller's "BufferSize" variable. The write is a problem without a doubt,
but the read is a problem too if the outermost caller's "BufferSize" (a
UINT32 object) is followed by four bytes that are not all zero. Then
ReadFileData() will attempt to read more than 4GB of data.
The right way to fix this is the following:
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> index 2dbcff0be4a3..07c7ec207fcd 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
> @@ -326,6 +326,7 @@ UdfRead (
> VOID *NewFileEntryData;
> CHAR16 FileName[UDF_FILENAME_LENGTH] = { 0 };
> UINT64 FileSize;
> + UINT64 BufferSizeUint64;
>
> OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
>
> @@ -364,6 +365,7 @@ UdfRead (
> goto Done;
> }
>
> + BufferSizeUint64 = *BufferSize;
> Status = ReadFileData (
> BlockIo,
> DiskIo,
> @@ -372,8 +374,10 @@ UdfRead (
> PrivFileData->FileSize,
> &PrivFileData->FilePosition,
> Buffer,
> - (UINT64 *)(UINTN)BufferSize
> + &BufferSizeUint64
> );
> + ASSERT (BufferSizeUint64 <= MAX_UINTN);
> + *BufferSize = (UINTN)BufferSizeUint64;
> } else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
> if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) {
> Status = EFI_DEVICE_ERROR;
Thanks,
Laszlo
> } else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
> if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) {
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> index 9f10c78ca9..49dc7077b7 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> @@ -264,7 +264,7 @@ UdfDriverBindingStop (
> EFI_OPEN_PROTOCOL_GET_PROTOCOL
> );
> if (!EFI_ERROR (Status)) {
> - PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (This);
> + PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (SimpleFs);^M
>
> //
> // Uninstall child handle
>
>
> Thanks,
> Paulo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
On 08/09/2017 05:35, Laszlo Ersek wrote:
> Paulo,
>
> On 09/08/17 02:56, Paulo Alcantara wrote:
>> Ray,
>>
>> On 07/09/2017 20:13, Paulo Alcantara wrote:
>>> v5:
>>> - Fixed OVMF IA32 build.
>>> - Fixed a typo in UdfDriveBindingStop() ("This" -> "SimpleFs") which
>>> broke retrieval of private fs data from SimpleFs protocol --
>>> identified by 'reconnect -r' command in UEFI shell.
>>
>> Follow the diff between v4 and v5 for Mde*Pkg changes (forgot to include
>> it when resending):
>>
>> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> index 8ad14fe594..2dbcff0be4 100644
>> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> @@ -372,7 +372,7 @@ UdfRead (
>> PrivFileData->FileSize,
>> &PrivFileData->FilePosition,
>> Buffer,
>> - BufferSize
>> + (UINT64 *)(UINTN)BufferSize^M
>> );
>
> This change is not correct.
>
> (1) The UdfRead() function takes the following parameter:
>
> IN OUT UINTN *BufferSize,
>
> This means that, in an IA32 or ARM build,
>
> sizeof *BufferSize == 4
>
> and in an AARCH64 or X64 build,
>
> sizeof *BufferSize == 8
>
> (2) The above type-casting is part of a call to the ReadFileData()
> function. The ReadFileData() function takes the following parameter:
>
> IN OUT UINT64 *BufferSize
>
> This means that, regardless of architecture,
>
> sizeof *BufferSize == 8
>
> The consequence is that, in an IA32 or ARM build, the ReadFileData()
> function will both read and write beyond the end of the outermost
> caller's "BufferSize" variable. The write is a problem without a doubt,
> but the read is a problem too if the outermost caller's "BufferSize" (a
> UINT32 object) is followed by four bytes that are not all zero. Then
> ReadFileData() will attempt to read more than 4GB of data.
You're right. Thanks for the explanation.
>
> The right way to fix this is the following:
>
>> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> index 2dbcff0be4a3..07c7ec207fcd 100644
>> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c
>> @@ -326,6 +326,7 @@ UdfRead (
>> VOID *NewFileEntryData;
>> CHAR16 FileName[UDF_FILENAME_LENGTH] = { 0 };
>> UINT64 FileSize;
>> + UINT64 BufferSizeUint64;
>>
>> OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
>>
>> @@ -364,6 +365,7 @@ UdfRead (
>> goto Done;
>> }
>>
>> + BufferSizeUint64 = *BufferSize;
>> Status = ReadFileData (
>> BlockIo,
>> DiskIo,
>> @@ -372,8 +374,10 @@ UdfRead (
>> PrivFileData->FileSize,
>> &PrivFileData->FilePosition,
>> Buffer,
>> - (UINT64 *)(UINTN)BufferSize
>> + &BufferSizeUint64
>> );
>> + ASSERT (BufferSizeUint64 <= MAX_UINTN);
>> + *BufferSize = (UINTN)BufferSizeUint64;
>> } else if (IS_FID_DIRECTORY_FILE (Parent->FileIdentifierDesc)) {
>> if (ReadDirInfo->FidOffset == 0 && PrivFileData->FilePosition > 0) {
>> Status = EFI_DEVICE_ERROR;
I'll include this in v6.
Paulo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2026 Red Hat, Inc.