EmbeddedPkg/MmcDxe: Improved parameters checking
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 15 Aug 2011 16:06:53 +0000 (16:06 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 15 Aug 2011 16:06:53 +0000 (16:06 +0000)
Ensure the passed parameters are correct.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12129 6f19259b-4bc3-4df7-8a09-765794883524

EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c

index cd04369..887cb96 100644 (file)
@@ -424,7 +424,7 @@ MmcIoBlocks (
   UINT32                  Response[4];\r
   EFI_STATUS              Status;\r
   UINTN                   CardSize, NumBlocks, BlockSize, CmdArg;\r
-  UINTN                   Timeout;\r
+  INTN                    Timeout;\r
   UINTN                   Cmd;\r
   MMC_HOST_INSTANCE       *MmcHostInstance;\r
   EFI_MMC_HOST_PROTOCOL   *MmcHost;\r
@@ -436,7 +436,7 @@ MmcIoBlocks (
   MmcHost = MmcHostInstance->MmcHost;\r
   ASSERT(MmcHost);\r
 \r
-  if (MmcHost == 0) {\r
+  if ((MmcHost == 0)|| (Buffer == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -445,7 +445,7 @@ MmcIoBlocks (
     return EFI_NO_MEDIA;\r
   }\r
 \r
-  // If the driver has not been initialized yet then go into Iddentification Mode\r
+  // If the driver has not been initialized yet then go into Identification Mode\r
   if (MmcHostInstance->State == MmcHwInitializationState) {\r
     MmcIdentificationMode (MmcHostInstance);\r
 \r
@@ -508,14 +508,24 @@ MmcIoBlocks (
     }\r
   }\r
 \r
-  if (Lba > This->Media->LastBlock) {\r
-      ASSERT(0);\r
-      return EFI_INVALID_PARAMETER;\r
+  // All blocks must be within the device\r
+  if ((Lba + (BufferSize / This->Media->BlockSize)) > (This->Media->LastBlock + 1)){\r
+    ASSERT(0);\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if ((BufferSize % This->Media->BlockSize) != 0) {\r
-      ASSERT(0);\r
-      return EFI_BAD_BUFFER_SIZE;\r
+  // The buffer size must not be zero and it must be an exact multiple of the block size\r
+  if ((BufferSize == 0) || ((BufferSize % This->Media->BlockSize) != 0)) {\r
+    ASSERT(0);\r
+    return EFI_BAD_BUFFER_SIZE;\r
+  }\r
+\r
+  if (This->Media->MediaId != MediaId) {\r
+    return EFI_MEDIA_CHANGED;\r
+  }\r
+\r
+  if((Transfer == MMC_IOBLOCKS_WRITE) && (This->Media->ReadOnly == TRUE)) {\r
+    return EFI_WRITE_PROTECTED;\r
   }\r
 \r
   BytesRemainingToBeTransfered = BufferSize;\r