]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/Common/Decompress.c
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / C / Common / Decompress.c
index 4b83e88210e14b89ff4ec704f5b6385dcad7c54b..d85098f1314050945140d4f7c785e208dd30ecaf 100644 (file)
@@ -1,15 +1,9 @@
 /** @file\r
-Decompressor. Algorithm Ported from OPSD code (Decomp.asm) for Efi and Tiano \r
+Decompressor. Algorithm Ported from OPSD code (Decomp.asm) for Efi and Tiano\r
 compress algorithm.\r
 \r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 --*/\r
 \r
@@ -89,11 +83,11 @@ Returns: (VOID)
 \r
 --*/\r
 {\r
-  Sd->mBitBuf = (UINT32) (Sd->mBitBuf << NumOfBits);\r
+  Sd->mBitBuf = (UINT32) (((UINT64)Sd->mBitBuf) << NumOfBits);\r
 \r
   while (NumOfBits > Sd->mBitCount) {\r
 \r
-    Sd->mBitBuf |= (UINT32) (Sd->mSubBitBuf << (NumOfBits = (UINT16) (NumOfBits - Sd->mBitCount)));\r
+    Sd->mBitBuf |= (UINT32) (((UINT64)Sd->mSubBitBuf) << (NumOfBits = (UINT16) (NumOfBits - Sd->mBitCount)));\r
 \r
     if (Sd->mCompSize > 0) {\r
       //\r
@@ -194,12 +188,16 @@ Returns:
   UINT16  Avail;\r
   UINT16  NextCode;\r
   UINT16  Mask;\r
+  UINT16  MaxTableLength;\r
 \r
   for (Index = 1; Index <= 16; Index++) {\r
     Count[Index] = 0;\r
   }\r
 \r
   for (Index = 0; Index < NumOfChar; Index++) {\r
+    if (BitLen[Index] > 16) {\r
+      return (UINT16) BAD_TABLE;\r
+    }\r
     Count[BitLen[Index]]++;\r
   }\r
 \r
@@ -237,6 +235,7 @@ Returns:
 \r
   Avail = NumOfChar;\r
   Mask  = (UINT16) (1U << (15 - TableBits));\r
+  MaxTableLength = (UINT16) (1U << TableBits);\r
 \r
   for (Char = 0; Char < NumOfChar; Char++) {\r
 \r
@@ -249,6 +248,10 @@ Returns:
 \r
     if (Len <= TableBits) {\r
 \r
+      if (Start[Len] >= NextCode || NextCode > MaxTableLength){\r
+        return (UINT16) BAD_TABLE;\r
+      }\r
+\r
       for (Index = Start[Len]; Index < NextCode; Index++) {\r
         Table[Index] = Char;\r
       }\r
@@ -394,7 +397,7 @@ Returns:
 \r
   Index = 0;\r
 \r
-  while (Index < Number) {\r
+  while (Index < Number && Index < NPT) {\r
 \r
     CharC = (UINT16) (Sd->mBitBuf >> (BITBUFSIZ - 3));\r
 \r
@@ -413,14 +416,14 @@ Returns:
     if (Index == Special) {\r
       CharC = (UINT16) GetBits (Sd, 2);\r
       CharC--;\r
-      while ((INT16) (CharC) >= 0) {\r
+      while ((INT16) (CharC) >= 0 && Index < NPT) {\r
         Sd->mPTLen[Index++] = 0;\r
         CharC--;\r
       }\r
     }\r
   }\r
 \r
-  while (Index < nn) {\r
+  while (Index < nn && Index < NPT) {\r
     Sd->mPTLen[Index++] = 0;\r
   }\r
 \r
@@ -643,13 +646,23 @@ Returns: (VOID)
 \r
       BytesRemain--;\r
       while ((INT16) (BytesRemain) >= 0) {\r
-        Sd->mDstBase[Sd->mOutBuf++] = Sd->mDstBase[DataIdx++];\r
         if (Sd->mOutBuf >= Sd->mOrigSize) {\r
           return ;\r
         }\r
+        if (DataIdx >= Sd->mOrigSize) {\r
+          Sd->mBadTableFlag = (UINT16) BAD_TABLE;\r
+          return ;\r
+        }\r
+        Sd->mDstBase[Sd->mOutBuf++] = Sd->mDstBase[DataIdx++];\r
 \r
         BytesRemain--;\r
       }\r
+      //\r
+      // Once mOutBuf is fully filled, directly return\r
+      //\r
+      if (Sd->mOutBuf >= Sd->mOrigSize) {\r
+        return ;\r
+      }\r
     }\r
   }\r
 \r
@@ -684,6 +697,7 @@ Returns:
 --*/\r
 {\r
   UINT8 *Src;\r
+  UINT32 CompSize;\r
 \r
   *ScratchSize  = sizeof (SCRATCH_DATA);\r
 \r
@@ -692,7 +706,13 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  CompSize = Src[0] + (Src[1] << 8) + (Src[2] << 16) + (Src[3] << 24);\r
   *DstSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24);\r
+\r
+  if (SrcSize < CompSize + 8 || (CompSize + 8) < 8) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -722,7 +742,7 @@ Arguments:
 \r
 Returns:\r
 \r
-  EFI_SUCCESS           - Decompression is successfull\r
+  EFI_SUCCESS           - Decompression is successful\r
   EFI_INVALID_PARAMETER - The source data is corrupted\r
 \r
 --*/\r
@@ -752,7 +772,7 @@ Returns:
   CompSize  = Src[0] + (Src[1] << 8) + (Src[2] << 16) + (Src[3] << 24);\r
   OrigSize  = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24);\r
 \r
-  if (SrcSize < CompSize + 8) {\r
+  if (SrcSize < CompSize + 8 || (CompSize + 8) < 8) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -877,7 +897,7 @@ Arguments:
 \r
 Returns:\r
 \r
-  EFI_SUCCESS           - Decompression is successfull\r
+  EFI_SUCCESS           - Decompression is successful\r
   EFI_INVALID_PARAMETER - The source data is corrupted\r
 \r
 --*/\r
@@ -912,7 +932,7 @@ Arguments:
 \r
 Returns:\r
 \r
-  EFI_SUCCESS           - Decompression is successfull\r
+  EFI_SUCCESS           - Decompression is successful\r
   EFI_INVALID_PARAMETER - The source data is corrupted\r
 \r
 --*/\r