MdeModulePkg/DxePrintLibPrint2Protocol: Fix incomplete print output
authorWang, Jian J <jian.j.wang@intel.com>
Tue, 2 Jan 2018 08:20:21 +0000 (16:20 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 2 Jan 2018 08:31:29 +0000 (16:31 +0800)
This is caused by a previous patch which tried to fix string over-read.
It's found that that patch for PrintLib in MdePkg will cause premature
terminating of loop used to traversing format string and cause incomplete
string output. Because this library uses similar code to do the same
job, it has the same issue too. So the fix is also the same.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
MdeModulePkg/Library/DxePrintLibPrint2Protocol/PrintLib.c

index 0e6178fc9c8fe23623e4634cc635b37b3798b01d..e09520c81b248e4f8e325a81cb6533074c649a8a 100644 (file)
@@ -2051,7 +2051,9 @@ InternalPrintLibSPrintMarker (
       // ArgumentString is either null-terminated, or it contains Precision characters\r
       //\r
       for (Count = 0;\r
-            ArgumentString[Count * BytesPerArgumentCharacter] != '\0' &&\r
+            (ArgumentString[Count * BytesPerArgumentCharacter] != '\0' ||\r
+             (BytesPerArgumentCharacter > 1 &&\r
+              ArgumentString[Count * BytesPerArgumentCharacter + 1]!= '\0')) &&\r
             (Count < Precision || ((Flags & PRECISION) == 0));\r
             Count++) {\r
         ArgumentCharacter = ((ArgumentString[Count * BytesPerArgumentCharacter] & 0xff) | ((ArgumentString[Count * BytesPerArgumentCharacter + 1]) << 8)) & ArgumentMask;\r
@@ -2110,7 +2112,9 @@ InternalPrintLibSPrintMarker (
     //\r
     // Copy the string into the output buffer performing the required type conversions\r
     //\r
-    while (Index < Count && (*ArgumentString) != '\0') {\r
+    while (Index < Count &&\r
+           (ArgumentString[0] != '\0' ||\r
+            (BytesPerArgumentCharacter > 1 && ArgumentString[1] != '\0'))) {\r
       ArgumentCharacter = ((*ArgumentString & 0xff) | (((UINT8)*(ArgumentString + 1)) << 8)) & ArgumentMask;\r
 \r
       LengthToReturn += (1 * BytesPerOutputCharacter);\r