Pavel Naberezhnev 12a378c678
OpenNtfsDxe: Fixed several issues in the NTFS driver (#588)
* Incorrect EFI_FILE_PROTOCOL version

The driver implements EFI_FILE_PROTOCOL_REVISION version,
not EFI_FILE_PROTOCOL_REVISION2 version.

* Fix directory reading logic by implementing EFI_FILE_INFO cache

Problem:
 According to the UEFI specification, reading from a directory must
 return zero Size for the EFI_FILE_INFO structure when directory
 entries are exhausted. The original FileReadDir() implementation
 always returned a fixed EFI_FILE_INFO size before reporting
 end-of-directory. This caused fuzzing tests to enter an infinite
 directory iteration loop due to unexpected behavior.

Solution:
 Introduced an EFI_FILE_INFO cache with the following logic:
 1. FileReadDir() caches EFI_FILE_INFO on first read. The cache key
    combines directory path hash (with FNV-1a 64-bit hashing) and
    DirIndex value
 2. When the key matches and buffer size is sufficient:
    - Data is returned from cache
    - Cache is cleared
 3. When the key matches with insufficent buffer size:
    - Cache is preserved for subsequent retries
 4. Key mismatch triggers cache reset

Additional benefits:
 - Eliminates fixed MINIMUM_INFO_LENGTH requirement
 - FileReadDir() now requests only required buffer size

Note:
 A more elegant solution is being considered for future NTFS
 driver improvements, requiring further analysis and testing.

Links:
 FNV Hash: http://www.isthe.com/chongo/tech/comp/fnv/index.html

* Fix memory leak in FileReadDir() function

Function NtfsOppen() allocates additional memory for
file structure. After use it, need to free by call FreeFile()
function.

* Fixed invalid pointer access in ReadAttr() function

Solution:
 - Added a null check for the Current field in ReadAttr() function
 - Added validation for MFT record flags in the InitFile() function

Signed-off-by: Pavel Naberezhnev <pavelnaberezhnev@gmail.com>
2025-11-02 17:45:38 +03:00
..