From ea76ef8477fb09ab68bff3c8bab4bf0bc23ba5b4 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Thu, 7 Jun 2018 19:33:23 +0200 Subject: [PATCH] [0.4.9] cherry-pick [FASTFAT] Properly check for buffer size on dir enumeration. This avoids improper returns when multiple entries are requested and, in rare circumstances, entries not being seen by umode. CORE-14699 (cherry picked from commit 01e28771613f466046cc1caf878f5e489387c6f4) --- drivers/filesystems/fastfat/dir.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/filesystems/fastfat/dir.c b/drivers/filesystems/fastfat/dir.c index 18c6dcc2ca7..b0b442a33a7 100644 --- a/drivers/filesystems/fastfat/dir.c +++ b/drivers/filesystems/fastfat/dir.c @@ -104,7 +104,7 @@ VfatGetFileNamesInformation( if (FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName) > BufferLength) return Status; - if (First || (BufferLength >= FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName) + DirContext->LongNameU.Length)) + if (First || (BufferLength > FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName) + DirContext->LongNameU.Length)) { pInfo->FileNameLength = DirContext->LongNameU.Length; @@ -149,7 +149,7 @@ VfatGetFileDirectoryInformation( if (FIELD_OFFSET(FILE_DIRECTORY_INFORMATION, FileName) > BufferLength) return Status; - if (First || (BufferLength >= FIELD_OFFSET(FILE_DIRECTORY_INFORMATION, FileName) + DirContext->LongNameU.Length)) + if (First || (BufferLength > FIELD_OFFSET(FILE_DIRECTORY_INFORMATION, FileName) + DirContext->LongNameU.Length)) { pInfo->FileNameLength = DirContext->LongNameU.Length; /* pInfo->FileIndex = ; */ @@ -266,7 +266,7 @@ VfatGetFileFullDirectoryInformation( if (FIELD_OFFSET(FILE_FULL_DIR_INFORMATION, FileName) > BufferLength) return Status; - if (First || (BufferLength >= FIELD_OFFSET(FILE_FULL_DIR_INFORMATION, FileName) + DirContext->LongNameU.Length)) + if (First || (BufferLength > FIELD_OFFSET(FILE_FULL_DIR_INFORMATION, FileName) + DirContext->LongNameU.Length)) { pInfo->FileNameLength = DirContext->LongNameU.Length; /* pInfo->FileIndex = ; */ @@ -362,7 +362,7 @@ VfatGetFileBothInformation( if (FIELD_OFFSET(FILE_BOTH_DIR_INFORMATION, FileName) > BufferLength) return Status; - if (First || (BufferLength >= FIELD_OFFSET(FILE_BOTH_DIR_INFORMATION, FileName) + DirContext->LongNameU.Length)) + if (First || (BufferLength > FIELD_OFFSET(FILE_BOTH_DIR_INFORMATION, FileName) + DirContext->LongNameU.Length)) { pInfo->FileNameLength = DirContext->LongNameU.Length; pInfo->EaSize = 0;