]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/Common/ParseInf.c
BaseTools/C/Common: Fix potential memory leak
[mirror_edk2.git] / BaseTools / Source / C / Common / ParseInf.c
index 8305f14aef3081502e9cd937dd2a8fe84f665e63..d7845366d499fc82bb3503c9548e7f503d7defb1 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
+This contains some useful functions for parsing INF files.\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \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
@@ -9,15 +10,7 @@ http://opensource.org/licenses/bsd-license.php
 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
 \r
-Module Name:\r
-\r
-  ParseInf.c\r
-\r
-Abstract:\r
-\r
-  This contains some useful functions for parsing INF files.\r
-\r
---*/\r
+**/\r
 \r
 #include <assert.h>\r
 #include <string.h>\r
@@ -25,6 +18,7 @@ Abstract:
 #include <stdlib.h>\r
 #include "EfiUtilityMsgs.h"\r
 #include "ParseInf.h"\r
+#include "CommonLib.h"\r
 \r
 CHAR8 *\r
 ReadLine (\r
@@ -46,7 +40,7 @@ Routine Description:
 Arguments:\r
 \r
   InputFile     Memory file image.\r
-  InputBuffer   Buffer to read into, must be _MAX_PATH size.\r
+  InputBuffer   Buffer to read into, must be MaxLength size.\r
   MaxLength     The maximum size of the input buffer.\r
 \r
 Returns:\r
@@ -165,7 +159,7 @@ Returns:
 \r
 --*/\r
 {\r
-  CHAR8 InputBuffer[_MAX_PATH];\r
+  CHAR8 InputBuffer[MAX_LONG_FILE_PATH];\r
   CHAR8 *CurrentToken;\r
 \r
   //\r
@@ -188,7 +182,7 @@ Returns:
     //\r
     // Read a line\r
     //\r
-    ReadLine (InputFile, InputBuffer, _MAX_PATH);\r
+    ReadLine (InputFile, InputBuffer, MAX_LONG_FILE_PATH);\r
 \r
     //\r
     // Check if the section is found\r
@@ -222,7 +216,7 @@ Arguments:
   Section   The section to search for, a string within [].\r
   Token     The token to search for, e.g. EFI_PEIM_RECOVERY, followed by an = in the INF file.\r
   Instance  The instance of the token to search for.  Zero is the first instance.\r
-  Value     The string that holds the value following the =.  Must be _MAX_PATH in size.\r
+  Value     The string that holds the value following the =.  Must be MAX_LONG_FILE_PATH in size.\r
 \r
 Returns:\r
 \r
@@ -234,8 +228,9 @@ Returns:
 \r
 --*/\r
 {\r
-  CHAR8   InputBuffer[_MAX_PATH];\r
+  CHAR8   InputBuffer[MAX_LONG_FILE_PATH];\r
   CHAR8   *CurrentToken;\r
+  CHAR8   *Delimiter;\r
   BOOLEAN ParseError;\r
   BOOLEAN ReadError;\r
   UINTN   Occurrance;\r
@@ -273,7 +268,7 @@ Returns:
       //\r
       // Read a line from the file\r
       //\r
-      if (ReadLine (InputFile, InputBuffer, _MAX_PATH) == NULL) {\r
+      if (ReadLine (InputFile, InputBuffer, MAX_LONG_FILE_PATH) == NULL) {\r
         //\r
         // Error reading from input file\r
         //\r
@@ -283,8 +278,13 @@ Returns:
       //\r
       // Get the first non-whitespace string\r
       //\r
+      Delimiter = strchr (InputBuffer, '=');\r
+      if (Delimiter != NULL) {\r
+        *Delimiter = 0;\r
+      }\r
+\r
       CurrentToken = strtok (InputBuffer, " \t\n");\r
-      if (CurrentToken == NULL) {\r
+      if (CurrentToken == NULL || Delimiter == NULL) {\r
         //\r
         // Whitespace line found (or comment) so continue\r
         //\r
@@ -311,17 +311,29 @@ Returns:
           //\r
           // Copy the contents following the =\r
           //\r
-          CurrentToken = strtok (NULL, "= \t\n");\r
-          if (CurrentToken == NULL) {\r
+          CurrentToken = Delimiter + 1;\r
+          if (*CurrentToken == 0) {\r
             //\r
             // Nothing found, parsing error\r
             //\r
             ParseError = TRUE;\r
           } else {\r
+            //\r
+            // Strip leading white space\r
+            //\r
+            while (*CurrentToken == ' ' || *CurrentToken == '\t') {\r
+              CurrentToken++;\r
+            }\r
             //\r
             // Copy the current token to the output value\r
             //\r
             strcpy (Value, CurrentToken);\r
+            //\r
+            // Strip trailing white space\r
+            //\r
+            while (strlen(Value) > 0 && (*(Value + strlen(Value) - 1) == ' ' || *(Value + strlen(Value) - 1) == '\t')) {\r
+              *(Value + strlen(Value) - 1) = 0;\r
+            }\r
             return EFI_SUCCESS;\r
           }\r
         } else {\r
@@ -379,10 +391,10 @@ Returns:
 --*/\r
 {\r
   INT32 Index;\r
-  UINT32 Data1;\r
-  UINT32 Data2;\r
-  UINT32 Data3;\r
-  UINT16 Data4[8];\r
+  int   Data1;\r
+  int   Data2;\r
+  int   Data3;\r
+  int   Data4[8];\r
 \r
   if (AsciiGuidBuffer == NULL || GuidBuffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -416,7 +428,7 @@ Returns:
   //\r
   Index = sscanf (\r
             AsciiGuidBuffer,\r
-            "%08x-%04x-%04x-%02hx%02hx-%02hx%02hx%02hx%02hx%02hx%02hx",\r
+            "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
             &Data1,\r
             &Data2,\r
             &Data3,\r
@@ -484,64 +496,88 @@ Returns:
 --*/\r
 {\r
   UINT8   Index;\r
-  UINT64  HexNumber;\r
+  UINT64  Value;\r
   CHAR8   CurrentChar;\r
   \r
   //\r
   // Initialize the result\r
   //\r
-  HexNumber = 0;\r
+  Value = 0;\r
+  Index = 0;\r
   \r
   //\r
-  // Check input paramter\r
+  // Check input parameter\r
   //\r
   if (AsciiString == NULL || ReturnValue == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+  while (AsciiString[Index] == ' ') {\r
+    Index ++;\r
+  }\r
+  \r
   //\r
   // Add each character to the result\r
   //\r
-  if (IsHex || (AsciiString[0] == '0' && (AsciiString[1] == 'x' || AsciiString[1] == 'X'))) {\r
-    //\r
-    // Verify string is a hex number\r
-    //\r
-    for (Index = 2; Index < strlen (AsciiString); Index++) {\r
-      if (isxdigit (AsciiString[Index]) == 0) {\r
-        return EFI_ABORTED;\r
-      }\r
-    }\r
+  \r
+  //\r
+  // Skip first two chars only if the string starts with '0x' or '0X'\r
+  //\r
+  if (AsciiString[Index] == '0' && (AsciiString[Index + 1] == 'x' || AsciiString[Index + 1] == 'X')) {\r
+    IsHex = TRUE;\r
+    Index += 2;\r
+  }\r
+  if (IsHex) {\r
     //\r
     // Convert the hex string.\r
     //\r
-    for (Index = 2; AsciiString[Index] != '\0'; Index++) {\r
+    for (; AsciiString[Index] != '\0'; Index++) {\r
       CurrentChar = AsciiString[Index];\r
-      HexNumber *= 16;\r
+      if (CurrentChar == ' ') {\r
+        break;\r
+      }\r
+      //\r
+      // Verify Hex string\r
+      //\r
+      if (isxdigit ((int)CurrentChar) == 0) {\r
+        return EFI_ABORTED;\r
+      }\r
+      //\r
+      // Add hex value\r
+      //\r
+      Value *= 16;\r
       if (CurrentChar >= '0' && CurrentChar <= '9') {\r
-        HexNumber += CurrentChar - '0';\r
+        Value += CurrentChar - '0';\r
       } else if (CurrentChar >= 'a' && CurrentChar <= 'f') {\r
-        HexNumber += CurrentChar - 'a' + 10;\r
+        Value += CurrentChar - 'a' + 10;\r
       } else if (CurrentChar >= 'A' && CurrentChar <= 'F') {\r
-        HexNumber += CurrentChar - 'A' + 10;\r
-      } else {\r
-        //\r
-        // Unrecognized character\r
-        //\r
-        return EFI_ABORTED;\r
+        Value += CurrentChar - 'A' + 10;\r
       }\r
     }\r
 \r
-    *ReturnValue = HexNumber;\r
+    *ReturnValue = Value;\r
   } else {\r
     //\r
-    // Verify string is a number\r
+    // Convert dec string is a number\r
     //\r
-    for (Index = 0; Index < strlen (AsciiString); Index++) {\r
-      if (isdigit (AsciiString[Index]) == 0) {\r
+    for (; Index < strlen (AsciiString); Index++) {\r
+      CurrentChar = AsciiString[Index];\r
+      if (CurrentChar == ' ') {\r
+        break;\r
+      }\r
+      //\r
+      // Verify Dec string\r
+      //\r
+      if (isdigit ((int)CurrentChar) == 0) {\r
         return EFI_ABORTED;\r
       }\r
+      //\r
+      // Add dec value\r
+      //\r
+      Value = Value * 10;\r
+      Value += CurrentChar - '0';\r
     }\r
 \r
-    *ReturnValue = atol (AsciiString);\r
+    *ReturnValue = Value;\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -562,7 +598,7 @@ Routine Description:
 Arguments:\r
 \r
   InputFile     Stream pointer.\r
-  InputBuffer   Buffer to read into, must be _MAX_PATH size.\r
+  InputBuffer   Buffer to read into, must be MAX_LONG_FILE_PATH size.\r
 \r
 Returns:\r
 \r
@@ -582,7 +618,7 @@ Returns:
   //\r
   // Read a line\r
   //\r
-  if (fgets (InputBuffer, _MAX_PATH, InputFile) == NULL) {\r
+  if (fgets (InputBuffer, MAX_LONG_FILE_PATH, InputFile) == NULL) {\r
     return NULL;\r
   }\r
   //\r
@@ -628,7 +664,7 @@ Returns:
 \r
 --*/\r
 {\r
-  CHAR8 InputBuffer[_MAX_PATH];\r
+  CHAR8 InputBuffer[MAX_LONG_FILE_PATH];\r
   CHAR8 *CurrentToken;\r
 \r
   //\r