Sync with Edk I Fat driver
authorqhuang8 <qhuang8@65ba2f78-6c18-0410-a7b4-885970cf29fa>
Thu, 31 May 2007 10:14:29 +0000 (10:14 +0000)
committerqhuang8 <qhuang8@65ba2f78-6c18-0410-a7b4-885970cf29fa>
Thu, 31 May 2007 10:14:29 +0000 (10:14 +0000)
git-svn-id: https://fat-driver2.tianocore.org/svn/fat-driver2/trunk@21 65ba2f78-6c18-0410-a7b4-885970cf29fa

EnhancedFat/Dxe/DirectoryManage.c
EnhancedFat/Dxe/DiskCache.c
EnhancedFat/Dxe/Fat.c
EnhancedFat/Dxe/Fat.h
EnhancedFat/Dxe/FileName.c
EnhancedFat/Dxe/Hash.c
EnhancedFat/Dxe/Info.c
EnhancedFat/Dxe/Init.c
EnhancedFat/Dxe/Open.c

index 01c8491..34a02a2 100644 (file)
@@ -1430,7 +1430,7 @@ Returns:
 {\r
   EFI_STATUS  Status;\r
   FAT_VOLUME  *Volume;\r
-  CHAR16      ComponentName[EFI_FILE_STRING_LENGTH + 1];\r
+  CHAR16      ComponentName[EFI_PATH_STRING_LENGTH];\r
   UINTN       FileNameLen;\r
   BOOLEAN     DirIntended;\r
   CHAR16      *Next;\r
@@ -1458,7 +1458,13 @@ Returns:
     FileName++;\r
     FileNameLen--;\r
   }\r
-  if (OFile->FullPathLen + FileNameLen > EFI_FILE_STRING_LENGTH) {\r
+  //\r
+  // Per FAT Spec the file name should meet the following criteria:\r
+  //   C1. Length (FileLongName) <= 255\r
+  //   C2. Length (X:FileFullPath<NUL>) <= 260\r
+  // Here we check C2 first.\r
+  //\r
+  if (2 + OFile->FullPathLen + 1 + FileNameLen + 1 > EFI_PATH_STRING_LENGTH) {\r
     //\r
     // Full path length can not surpass 256 \r
     //\r
index e796cbc..6256266 100644 (file)
@@ -70,7 +70,7 @@ Returns:
   BaseAddress   = DiskCache->CacheBase;\r
   GroupMask     = DiskCache->GroupMask;\r
   PageAlignment = DiskCache->PageAlignment;\r
-  PageSize      = 1 << PageAlignment;\r
+  PageSize      = (UINTN)1 << PageAlignment;\r
 \r
   for (PageNo = StartPageNo; PageNo < EndPageNo; PageNo++) {\r
     GroupNo   = PageNo & GroupMask;\r
@@ -146,7 +146,7 @@ Returns:
   EntryPos      = DiskCache->BaseAddress + LShiftU64 (PageNo, PageAlignment);\r
   RealSize      = CacheTag->RealSize;\r
   if (IoMode == READ_DISK) {\r
-    RealSize  = 1 << PageAlignment;\r
+    RealSize  = (UINTN)1 << PageAlignment;\r
     MaxSize   = DiskCache->LimitAddress - EntryPos;\r
     if (MaxSize < RealSize) {\r
       DEBUG ((EFI_D_INFO, "FatDiskIo: Cache Page OutBound occurred! \n"));\r
@@ -356,7 +356,7 @@ Returns:
   DiskCache     = &Volume->DiskCache[CacheDataType];\r
   EntryPos      = Offset - DiskCache->BaseAddress;\r
   PageAlignment = DiskCache->PageAlignment;\r
-  PageSize      = 1 << PageAlignment;\r
+  PageSize      = (UINTN)1 << PageAlignment;\r
   PageNo        = (UINTN) RShiftU64 (EntryPos, PageAlignment);\r
   UnderRun      = ((UINTN) EntryPos) & (PageSize - 1);\r
 \r
index dfbb0d6..4d13c57 100644 (file)
@@ -375,6 +375,11 @@ Returns:
   //\r
   Status = FatAllocateVolume (ControllerHandle, DiskIo, BlockIo);\r
 \r
+  //\r
+  // When the media changes on a device it will Reinstall the BlockIo interaface. \r
+  // This will cause a call to our Stop(), and a subsequent reentrant call to our\r
+  // Start() successfully. We should leave the device open when this happen.\r
+  //\r
   if (EFI_ERROR (Status)) {\r
     Status = gBS->OpenProtocol (\r
                     ControllerHandle,\r
index d17ca21..38d8d7a 100644 (file)
@@ -109,7 +109,8 @@ Revision History
 #define PATH_NAME_SEPARATOR     L'\\'\r
 \r
 \r
-#define EFI_FILE_STRING_LENGTH  256\r
+#define EFI_PATH_STRING_LENGTH  260\r
+#define EFI_FILE_STRING_LENGTH  255\r
 #define FAT_MAX_ALLOCATE_SIZE   0xA00000\r
 #define LC_ISO_639_2_ENTRY_SIZE 3\r
 #define MAX_LANG_CODE_SIZE      100\r
index 7e58dcd..b84f86c 100644 (file)
@@ -545,6 +545,16 @@ Returns:
   }\r
 \r
   *TempNamePointer = 0;\r
+\r
+  //\r
+  // Per FAT Spec the file name should meet the following criteria:\r
+  //   C1. Length (FileLongName) <= 255\r
+  //   C2. Length (X:FileFullPath<NUL>) <= 260\r
+  // Here we check C1.\r
+  //\r
+  if (TempNamePointer - OutputFileName > EFI_FILE_STRING_LENGTH) {\r
+    return FALSE;\r
+  }\r
   //\r
   // See if there is any illegal characters within the name\r
   //\r
index 81cd873..7b0aa3a 100644 (file)
@@ -42,7 +42,7 @@ Returns:
 --*/\r
 {\r
   UINT32  HashValue;\r
-  CHAR16  UpCasedLongFileName[EFI_FILE_STRING_LENGTH + 1];\r
+  CHAR16  UpCasedLongFileName[EFI_PATH_STRING_LENGTH];\r
   EfiStrCpy (UpCasedLongFileName, LongNameString);\r
   FatStrUpr (UpCasedLongFileName);\r
   gBS->CalculateCrc32 (UpCasedLongFileName, EfiStrSize (UpCasedLongFileName), &HashValue);\r
index 30148fc..34d4e45 100644 (file)
@@ -302,7 +302,7 @@ Returns:
   EFI_FILE_INFO *NewInfo;\r
   FAT_OFILE     *DotOFile;\r
   FAT_OFILE     *Parent;\r
-  CHAR16        NewFileName[EFI_FILE_STRING_LENGTH + 1];\r
+  CHAR16        NewFileName[EFI_PATH_STRING_LENGTH];\r
   EFI_TIME      ZeroTime;\r
   FAT_DIRENT    *DirEnt;\r
   FAT_DIRENT    *TempDirEnt;\r
index c38ed85..9e33b46 100644 (file)
@@ -462,7 +462,7 @@ Returns:
   Volume->FirstClusterPos   = LShiftU64 (FirstClusterLba, BlockAlignment);\r
   Volume->MaxCluster        = (Sectors - FirstClusterLba) >> SectorsPerClusterAlignment;\r
   Volume->ClusterAlignment  = BlockAlignment + SectorsPerClusterAlignment;\r
-  Volume->ClusterSize       = 1 << (Volume->ClusterAlignment);\r
+  Volume->ClusterSize       = (UINTN)1 << (Volume->ClusterAlignment);\r
 \r
   //\r
   // If this is not a fat32, determine if it's a fat16 or fat12\r
index 3c8eacf..9785205 100644 (file)
@@ -105,7 +105,7 @@ Returns:
 {\r
   FAT_VOLUME  *Volume;\r
   EFI_STATUS  Status;\r
-  CHAR16      NewFileName[EFI_FILE_STRING_LENGTH + 1];\r
+  CHAR16      NewFileName[EFI_PATH_STRING_LENGTH];\r
   FAT_DIRENT  *DirEnt;\r
   UINT8       FileAttributes;\r
   BOOLEAN     WriteMode;\r