mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/UdfDxe: Memory free/use after free in ResolveSymlink()
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1279 For function ResolveSymlink(), the below codes: if (CompareMem ((VOID *)&PreviousFile, (VOID *)Parent, sizeof (UDF_FILE_INFO)) != 0) { CleanupFileInformation (&PreviousFile); } CopyMem ((VOID *)&PreviousFile, (VOID *)File, sizeof (UDF_FILE_INFO)); If the contents in 'PreviousFile' and 'File' are the same, call to "CleanupFileInformation (&PreviousFile);" will free the buffers in 'File' as well. This will lead to potential memory double free/use after free issues. This commit will add additional check to address the above issue. 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> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
parent
bfb8c64cbf
commit
27b9cb33e7
|
@ -2144,6 +2144,8 @@ ResolveSymlink (
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINT8 CompressionId;
|
UINT8 CompressionId;
|
||||||
UDF_FILE_INFO PreviousFile;
|
UDF_FILE_INFO PreviousFile;
|
||||||
|
BOOLEAN NotParent;
|
||||||
|
BOOLEAN NotFile;
|
||||||
|
|
||||||
ZeroMem ((VOID *)File, sizeof (UDF_FILE_INFO));
|
ZeroMem ((VOID *)File, sizeof (UDF_FILE_INFO));
|
||||||
|
|
||||||
|
@ -2298,13 +2300,19 @@ ResolveSymlink (
|
||||||
goto Error_Find_File;
|
goto Error_Find_File;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CompareMem ((VOID *)&PreviousFile, (VOID *)Parent,
|
NotParent = (CompareMem ((VOID *)&PreviousFile, (VOID *)Parent,
|
||||||
sizeof (UDF_FILE_INFO)) != 0) {
|
sizeof (UDF_FILE_INFO)) != 0);
|
||||||
|
NotFile = (CompareMem ((VOID *)&PreviousFile, (VOID *)File,
|
||||||
|
sizeof (UDF_FILE_INFO)) != 0);
|
||||||
|
|
||||||
|
if (NotParent && NotFile) {
|
||||||
CleanupFileInformation (&PreviousFile);
|
CleanupFileInformation (&PreviousFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NotFile) {
|
||||||
CopyMem ((VOID *)&PreviousFile, (VOID *)File, sizeof (UDF_FILE_INFO));
|
CopyMem ((VOID *)&PreviousFile, (VOID *)File, sizeof (UDF_FILE_INFO));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Unmap the symlink file.
|
// Unmap the symlink file.
|
||||||
|
|
Loading…
Reference in New Issue