]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxePrintLibPrint2Protocol/PrintLib.c
MdePkg/PrintLib: Fix possible negative value left shift
[mirror_edk2.git] / MdeModulePkg / Library / DxePrintLibPrint2Protocol / PrintLib.c
index b3e7cb2a25fbd98f8e77df365f1f1634b05730b6..b58db8e011a8517c741e947b2990c29522242488 100644 (file)
@@ -130,7 +130,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
   //\r
   // Get the first character from the format string\r
   //\r
-  FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+  FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
   while (FormatCharacter != 0) {\r
     if (FormatCharacter == '%') {\r
@@ -148,7 +148,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
         //\r
         // Get the next character from the format string\r
         //\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
         switch (FormatCharacter) {\r
         case '.': \r
@@ -226,7 +226,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
     //\r
     // If BASE_LIST is larger than Size, then return FALSE\r
     //\r
-    if ((UINTN)((UINT8 *)BaseListMarker - (UINT8 *)BaseListStart) > Size) {\r
+    if (((UINTN)BaseListMarker - (UINTN)BaseListStart) > Size) {\r
       DEBUG ((DEBUG_ERROR, "The input variable argument list is too long. Please consider breaking into multiple print calls.\n"));\r
       return FALSE;\r
     }\r
@@ -239,7 +239,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
     //\r
     // Get the next character from the format string\r
     //\r
-    FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+    FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
   }\r
   return TRUE;\r
 }\r
@@ -598,7 +598,11 @@ UnicodeSPrintAsciiFormat (
   return NumberOfPrinted;\r
 }\r
 \r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
 /**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
   Converts a decimal value to a Null-terminated Unicode string.\r
   \r
   Converts the decimal number specified by Value to a Null-terminated Unicode \r
@@ -665,6 +669,72 @@ UnicodeValueToString (
   return StrnLenS (Buffer, BufferSize / sizeof (CHAR16));\r
 }\r
 \r
+#endif\r
+\r
+/**\r
+  Converts a decimal value to a Null-terminated Unicode string.\r
+\r
+  Converts the decimal number specified by Value to a Null-terminated Unicode\r
+  string specified by Buffer containing at most Width characters. No padding of\r
+  spaces is ever performed. If Width is 0 then a width of\r
+  MAXIMUM_VALUE_CHARACTERS is assumed. If the conversion contains more than\r
+  Width characters, then only the first Width characters are placed in Buffer.\r
+  Additional conversion parameters are specified in Flags.\r
+\r
+  The Flags bit LEFT_JUSTIFY is always ignored.\r
+  All conversions are left justified in Buffer.\r
+  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and\r
+  commas are inserted every 3rd digit starting from the right.\r
+  If RADIX_HEX is set in Flags, then the output buffer will be formatted in\r
+  hexadecimal format.\r
+  If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in\r
+  Buffer is a '-'.\r
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then\r
+  Buffer is padded with '0' characters so the combination of the optional '-'\r
+  sign character, '0' characters, digit characters for Value, and the\r
+  Null-terminator add up to Width characters.\r
+\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  @param  Buffer      The pointer to the output buffer for the produced\r
+                      Null-terminated Unicode string.\r
+  @param  BufferSize  The size of Buffer in bytes, including the\r
+                      Null-terminator.\r
+  @param  Flags       The bitmask of flags that specify left justification,\r
+                      zero pad, and commas.\r
+  @param  Value       The 64-bit signed value to convert to a string.\r
+  @param  Width       The maximum number of Unicode characters to place in\r
+                      Buffer, not including the Null-terminator.\r
+\r
+  @retval RETURN_SUCCESS           The decimal value is converted.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If BufferSize cannot hold the converted\r
+                                   value.\r
+  @retval RETURN_INVALID_PARAMETER If Buffer is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not\r
+                                   zero, and BufferSize is greater than\r
+                                   (PcdMaximumUnicodeStringLength *\r
+                                   sizeof (CHAR16) + 1).\r
+                                   If unsupported bits are set in Flags.\r
+                                   If both COMMA_TYPE and RADIX_HEX are set in\r
+                                   Flags.\r
+                                   If Width >= MAXIMUM_VALUE_CHARACTERS.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+UnicodeValueToStringS (\r
+  IN OUT CHAR16  *Buffer,\r
+  IN UINTN       BufferSize,\r
+  IN UINTN       Flags,\r
+  IN INT64       Value,\r
+  IN UINTN       Width\r
+  )\r
+{\r
+  return mPrint2SProtocol->UnicodeValueToStringS (Buffer, BufferSize, Flags, Value, Width);\r
+}\r
+\r
 /**\r
   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
   ASCII format string and a VA_LIST argument list.\r
@@ -1007,7 +1077,11 @@ AsciiSPrintUnicodeFormat (
 }\r
 \r
 \r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
 /**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
   Converts a decimal value to a Null-terminated ASCII string.\r
   \r
   Converts the decimal number specified by Value to a Null-terminated ASCII string \r
@@ -1073,6 +1147,70 @@ AsciiValueToString (
   return AsciiStrnLenS (Buffer, BufferSize / sizeof (CHAR8));\r
 }\r
 \r
+#endif\r
+\r
+/**\r
+  Converts a decimal value to a Null-terminated Ascii string.\r
+\r
+  Converts the decimal number specified by Value to a Null-terminated Ascii\r
+  string specified by Buffer containing at most Width characters. No padding of\r
+  spaces is ever performed. If Width is 0 then a width of\r
+  MAXIMUM_VALUE_CHARACTERS is assumed. If the conversion contains more than\r
+  Width characters, then only the first Width characters are placed in Buffer.\r
+  Additional conversion parameters are specified in Flags.\r
+\r
+  The Flags bit LEFT_JUSTIFY is always ignored.\r
+  All conversions are left justified in Buffer.\r
+  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and\r
+  commas are inserted every 3rd digit starting from the right.\r
+  If RADIX_HEX is set in Flags, then the output buffer will be formatted in\r
+  hexadecimal format.\r
+  If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in\r
+  Buffer is a '-'.\r
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then\r
+  Buffer is padded with '0' characters so the combination of the optional '-'\r
+  sign character, '0' characters, digit characters for Value, and the\r
+  Null-terminator add up to Width characters.\r
+\r
+  If an error would be returned, then the function will ASSERT().\r
+\r
+  @param  Buffer      The pointer to the output buffer for the produced\r
+                      Null-terminated Ascii string.\r
+  @param  BufferSize  The size of Buffer in bytes, including the\r
+                      Null-terminator.\r
+  @param  Flags       The bitmask of flags that specify left justification,\r
+                      zero pad, and commas.\r
+  @param  Value       The 64-bit signed value to convert to a string.\r
+  @param  Width       The maximum number of Ascii characters to place in\r
+                      Buffer, not including the Null-terminator.\r
+\r
+  @retval RETURN_SUCCESS           The decimal value is converted.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If BufferSize cannot hold the converted\r
+                                   value.\r
+  @retval RETURN_INVALID_PARAMETER If Buffer is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not\r
+                                   zero, and BufferSize is greater than\r
+                                   PcdMaximumAsciiStringLength.\r
+                                   If unsupported bits are set in Flags.\r
+                                   If both COMMA_TYPE and RADIX_HEX are set in\r
+                                   Flags.\r
+                                   If Width >= MAXIMUM_VALUE_CHARACTERS.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiValueToStringS (\r
+  IN OUT CHAR8   *Buffer,\r
+  IN UINTN       BufferSize,\r
+  IN UINTN       Flags,\r
+  IN INT64       Value,\r
+  IN UINTN       Width\r
+  )\r
+{\r
+  return mPrint2SProtocol->AsciiValueToStringS (Buffer, BufferSize, Flags, Value, Width);\r
+}\r
+\r
 #define PREFIX_SIGN           BIT1\r
 #define PREFIX_BLANK          BIT2\r
 #define LONG_TYPE             BIT4\r
@@ -1458,7 +1596,7 @@ InternalPrintLibSPrintMarker (
   //\r
   // Get the first character from the format string\r
   //\r
-  FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+  FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
   //\r
   // Loop until the end of the format string is reached or the output buffer is full\r
@@ -1490,7 +1628,7 @@ InternalPrintLibSPrintMarker (
       //\r
       for (Done = FALSE; !Done; ) {\r
         Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         switch (FormatCharacter) {\r
         case '.': \r
           Flags |= PRECISION; \r
@@ -1543,7 +1681,7 @@ InternalPrintLibSPrintMarker (
           for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ){\r
             Count = (Count * 10) + FormatCharacter - '0';\r
             Format += BytesPerFormatCharacter;\r
-            FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+            FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
           }\r
           Format -= BytesPerFormatCharacter;\r
           if ((Flags & PRECISION) == 0) {\r
@@ -1822,7 +1960,7 @@ InternalPrintLibSPrintMarker (
 \r
       case '\r':\r
         Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         if (FormatCharacter == '\n') {\r
           //\r
           // Translate '\r\n' to '\r\n'\r
@@ -1843,7 +1981,7 @@ InternalPrintLibSPrintMarker (
         //\r
         ArgumentString = "\r\n";\r
         Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         if (FormatCharacter != '\r') {\r
           Format   -= BytesPerFormatCharacter;\r
         }\r
@@ -1862,7 +2000,7 @@ InternalPrintLibSPrintMarker (
  \r
     case '\r':\r
       Format += BytesPerFormatCharacter;\r
-      FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+      FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
       if (FormatCharacter == '\n') {\r
         //\r
         // Translate '\r\n' to '\r\n'\r
@@ -1883,7 +2021,7 @@ InternalPrintLibSPrintMarker (
       //\r
       ArgumentString = "\r\n";\r
       Format += BytesPerFormatCharacter;\r
-      FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+      FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
       if (FormatCharacter != '\r') {\r
         Format   -= BytesPerFormatCharacter;\r
       }\r
@@ -2011,7 +2149,7 @@ InternalPrintLibSPrintMarker (
     //\r
     // Get the next character from the format string\r
     //\r
-    FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+    FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
   }\r
 \r
   if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {\r