Ext4Pkg: Add comparison between Position and FileSize in Ext4SetPosition

Missing such comparison leads to infinite loop states, for example code
which trying to read entire file can easily get out of bound of
file size by passing position value which exceeds file size without this
check. So we need to add there missing comparison between the desired
position to be set and file size

Signed-off-by: Savva Mitrofanov <savvamtr@gmail.com>
This commit is contained in:
Savva Mitrofanov 2022-10-27 20:13:34 +06:00
parent bc05eacaa3
commit f21c808375
No known key found for this signature in database
GPG Key ID: 774924031750BF64
2 changed files with 23 additions and 17 deletions

View File

@ -715,16 +715,15 @@ Ext4GetPosition (
/** /**
Sets a file's current position. Sets a file's current position.
@param[in] This A pointer to the EFI_FILE_PROTOCOL instance that @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the
is the file handle to set the requested position on. file handle to set the requested position on.
@param[in] Position The byte position from the start of the file to @param[in] Position The byte position from the start of the file to set.
set.
@retval EFI_SUCCESS The position was set. @retval EFI_SUCCESS The position was set.
@retval EFI_UNSUPPORTED The seek request for nonzero is not valid on open @retval EFI_INVALID_PARAMETER The seek request for non-zero position is not valid on open
directories. directories.
@retval EFI_DEVICE_ERROR An attempt was made to set the position of a deleted @retval EFI_UNSUPPORTED The seek request for position is exceeds FileSize.
file. @retval EFI_DEVICE_ERROR An attempt was made to set the position of a deleted file.
**/ **/
EFI_STATUS EFI_STATUS

View File

@ -590,8 +590,9 @@ Ext4GetPosition (
@param[in] Position The byte position from the start of the file to set. @param[in] Position The byte position from the start of the file to set.
@retval EFI_SUCCESS The position was set. @retval EFI_SUCCESS The position was set.
@retval EFI_UNSUPPORTED The seek request for nonzero is not valid on open @retval EFI_INVALID_PARAMETER The seek request for non-zero position is not valid on open
directories. directories.
@retval EFI_UNSUPPORTED The seek request for position is exceeds FileSize.
@retval EFI_DEVICE_ERROR An attempt was made to set the position of a deleted file. @retval EFI_DEVICE_ERROR An attempt was made to set the position of a deleted file.
**/ **/
@ -603,17 +604,23 @@ Ext4SetPosition (
) )
{ {
EXT4_FILE *File; EXT4_FILE *File;
UINT64 FileSize;
File = EXT4_FILE_FROM_THIS (This); File = EXT4_FILE_FROM_THIS (This);
// Only seeks to 0 (so it resets the ReadDir operation) are allowed // Only seeks to 0 (so it resets the ReadDir operation) are allowed
if (Ext4FileIsDir (File) && (Position != 0)) { if (Ext4FileIsDir (File) && (Position != 0)) {
return EFI_UNSUPPORTED; return EFI_INVALID_PARAMETER;
} }
FileSize = EXT4_INODE_SIZE (File->Inode);
// -1 (0xffffff.......) seeks to the end of the file // -1 (0xffffff.......) seeks to the end of the file
if (Position == (UINT64)-1) { if (Position == (UINT64)-1) {
Position = EXT4_INODE_SIZE (File->Inode); Position = FileSize;
} else if (Position > FileSize) {
DEBUG ((DEBUG_FS, "[ext4] Ext4SetPosition Cannot seek to #%Lx of %Lx\n", Position, FileSize));
return EFI_UNSUPPORTED;
} }
File->Position = Position; File->Position = Position;