From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.45]) by mx.groups.io with SMTP id smtpd.web12.762.1589825276589844001 for ; Mon, 18 May 2020 11:07:57 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ispras.ru, ip: 83.149.199.45, mailfrom: cheptsov@ispras.ru) Received: from [127.0.0.1] (unknown [178.33.144.179]) by mail.ispras.ru (Postfix) with ESMTPSA id 447B6CD460; Mon, 18 May 2020 21:07:51 +0300 (MSK) From: "Vitaly Cheptsov" Message-Id: Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.80.23.2.2\)) Subject: Re: [edk2-devel] [PATCH V7 1/1] MdePkg: Fix SafeString performing assertions on runtime checks Date: Mon, 18 May 2020 21:07:49 +0300 In-Reply-To: Cc: "devel@edk2.groups.io" , Andrew Fish , Ard Biesheuvel , Bret Barkelew , "Brian J . Johnson" , "Chiu, Chasel" , "Justen, Jordan L" , Laszlo Ersek , Leif Lindholm , "Gao, Liming" , =?utf-8?Q?Marvin_H=C3=A4user?= , "Zimmer, Vincent" , "Gao, Zhichao" To: "Kinney, Michael D" References: <20200514173131.38072-1-cheptsov@ispras.ru> <20200514173131.38072-2-cheptsov@ispras.ru> X-Mailer: Apple Mail (2.3608.80.23.2.2) X-Groupsio-MsgNum: 59760 Content-Type: multipart/signed; boundary="Apple-Mail=_D20BD992-C8C5-4C7D-B506-E3AE5A8C0689"; protocol="application/pgp-signature"; micalg=pgp-sha512 --Apple-Mail=_D20BD992-C8C5-4C7D-B506-E3AE5A8C0689 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Mike, Your suggestion sounds ok to me. As long as it is verbose I will not mind = its addition. However, I do not have a good idea of how can it look like. I= f you post something I can include it. Thanks, Vitaly > 18 =D0=BC=D0=B0=D1=8F 2020 =D0=B3., =D0=B2 20:04, Kinney, Michael D =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB(=D0=B0)= : >=20 > Vitaly, >=20 > Reviewed-by: Michael D Kinney >=20 > I agree that can go in now for the stable tag. >=20 > The only additional comment I have received is if a DEBUG() message > can be added where the ASSERT() was removed. Perhaps only at the > DEBUG_VERBOSE level that is not usually enabled by default. A > developer that wants to see SAFE_STRING_CONSTRAINT_CHECK() conditions > that fail would need to enable DEBUG_VERBOSE messages. >=20 > Thanks, >=20 > Mike >=20 >=20 >> -----Original Message----- >> From: devel@edk2.groups.io On >> Behalf Of Vitaly Cheptsov >> Sent: Thursday, May 14, 2020 10:32 AM >> To: devel@edk2.groups.io >> Cc: Andrew Fish ; Ard Biesheuvel >> ; Bret Barkelew >> ; Brian J . Johnson >> ; Chiu, Chasel >> ; Justen, Jordan L >> ; Laszlo Ersek >> ; Leif Lindholm ; >> Gao, Liming ; Marvin H=C3=A4user >> ; Kinney, Michael D >> ; Zimmer, Vincent >> ; Gao, Zhichao >> >> Subject: [edk2-devel] [PATCH V7 1/1] MdePkg: Fix >> SafeString performing assertions on runtime checks >>=20 >> REF: >> https://bugzilla.tianocore.org/show_bug.cgi?id=3D2054 >>=20 >> Runtime checks returned via status return code should >> not work as >> assertions to permit parsing not trusted data with >> SafeString >> interfaces. >>=20 >> CC: Andrew Fish >> CC: Ard Biesheuvel >> CC: Bret Barkelew >> CC: Brian J. Johnson >> CC: Chasel Chiu >> CC: Jordan Justen >> CC: Laszlo Ersek >> CC: Leif Lindholm >> CC: Liming Gao >> CC: Marvin H=C3=A4user >> CC: Mike Kinney >> CC: Vincent Zimmer >> CC: Zhichao Gao >> Signed-off-by: Vitaly Cheptsov >> --- >> MdePkg/Include/Library/BaseLib.h | 111 ------------ >> ------- >> MdePkg/Library/BaseLib/SafeString.c | 112 ------------ >> -------- >> 2 files changed, 223 deletions(-) >>=20 >> diff --git a/MdePkg/Include/Library/BaseLib.h >> b/MdePkg/Include/Library/BaseLib.h >> index ecadff8b23..2c194ad943 100644 >> --- a/MdePkg/Include/Library/BaseLib.h >> +++ b/MdePkg/Include/Library/BaseLib.h >> @@ -189,7 +189,6 @@ StrnSizeS ( >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -225,7 +224,6 @@ StrCpyS ( >>=20 >>=20 >>=20 >> If Length > 0 and Destination is not aligned on a >> 16-bit boundary, then ASSERT(). >>=20 >>=20 >> If Length > 0 and Source is not aligned on a 16-bit >> boundary, then ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -263,7 +261,6 @@ StrnCpyS ( >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -303,7 +300,6 @@ StrCatS ( >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -350,12 +346,7 @@ StrnCatS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> @@ -406,12 +397,7 @@ StrDecimalToUintnS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> @@ -467,12 +453,7 @@ StrDecimalToUint64S ( >> the first character that is a not a valid >> hexadecimal character or NULL, >>=20 >>=20 >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> @@ -528,12 +509,7 @@ StrHexToUintnS ( >> the first character that is a not a valid >> hexadecimal character or NULL, >>=20 >>=20 >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> @@ -622,8 +598,6 @@ AsciiStrnSizeS ( >>=20 >>=20 >>=20 >> This function is similar as strcpy_s defined in C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -656,8 +630,6 @@ AsciiStrCpyS ( >>=20 >>=20 >>=20 >> This function is similar as strncpy_s defined in >> C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -692,8 +664,6 @@ AsciiStrnCpyS ( >>=20 >>=20 >>=20 >> This function is similar as strcat_s defined in C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -730,8 +700,6 @@ AsciiStrCatS ( >>=20 >>=20 >>=20 >> This function is similar as strncat_s defined in >> C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -777,12 +745,6 @@ AsciiStrnCatS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINTN, then >>=20 >>=20 >> @@ -832,12 +794,6 @@ AsciiStrDecimalToUintnS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINT64, then >>=20 >>=20 >> @@ -891,12 +847,6 @@ AsciiStrDecimalToUint64S ( >> character that is a not a valid hexadecimal >> character or Null-terminator, >>=20 >>=20 >> whichever on comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINTN, then >>=20 >>=20 >> @@ -950,12 +900,6 @@ AsciiStrHexToUintnS ( >> character that is a not a valid hexadecimal >> character or Null-terminator, >>=20 >>=20 >> whichever on comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINT64, then >>=20 >>=20 >> @@ -1506,16 +1450,8 @@ StrHexToUint64 ( >> "::" can be used to compress one or more groups of X >> when X contains only 0. >>=20 >>=20 >> The "::" can only appear once in the String. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -1567,16 +1503,8 @@ StrToIpv6Address ( >> When /P is in the String, the function stops at the >> first character that is not >>=20 >>=20 >> a valid decimal digit character after P is >> converted. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -1640,8 +1568,6 @@ StrToIpv4Address ( >> oo Data4[48:55] >>=20 >>=20 >> pp Data4[56:63] >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Guid is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> @param String Pointer to a Null- >> terminated Unicode string. >>=20 >>=20 >> @@ -1676,17 +1602,6 @@ StrToGuid ( >>=20 >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Buffer is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Length is not multiple of 2, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero and >> Length is greater than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If MaxBufferSize is less than (Length / 2), then >> ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> @param String Pointer to a Null- >> terminated Unicode string. >>=20 >>=20 >> @param Length The number of >> Unicode characters to decode. >>=20 >>=20 >> @param Buffer Pointer to the >> converted bytes array. >>=20 >>=20 >> @@ -1777,7 +1692,6 @@ UnicodeStrToAsciiStr ( >> the upper 8 bits, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -1824,7 +1738,6 @@ UnicodeStrToAsciiStrS ( >> If any Unicode characters in Source contain non-zero >> value in the upper 8 >>=20 >>=20 >> bits, then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -2388,10 +2301,6 @@ AsciiStrHexToUint64 ( >> "::" can be used to compress one or more groups of X >> when X contains only 0. >>=20 >>=20 >> The "::" can only appear once in the String. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -2443,10 +2352,6 @@ AsciiStrToIpv6Address ( >> When /P is in the String, the function stops at the >> first character that is not >>=20 >>=20 >> a valid decimal digit character after P is >> converted. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -2508,9 +2413,6 @@ AsciiStrToIpv4Address ( >> oo Data4[48:55] >>=20 >>=20 >> pp Data4[56:63] >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Guid is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> @param String Pointer to a Null- >> terminated ASCII string. >>=20 >>=20 >> @param Guid Pointer to the >> converted GUID. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -2541,17 +2443,6 @@ AsciiStrToGuid ( >> decoding stops after Length of characters and >> outputs Buffer containing >>=20 >>=20 >> (Length / 2) bytes. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Buffer is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Length is not multiple of 2, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero and >> Length is greater than >>=20 >>=20 >> - PcdMaximumAsciiStringLength, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If MaxBufferSize is less than (Length / 2), then >> ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> @param String Pointer to a Null- >> terminated ASCII string. >>=20 >>=20 >> @param Length The number of ASCII >> characters to decode. >>=20 >>=20 >> @param Buffer Pointer to the >> converted bytes array. >>=20 >>=20 >> @@ -2632,7 +2523,6 @@ AsciiStrToUnicodeStr ( >> equal or greater than ((AsciiStrLen (Source) + 1) * >> sizeof (CHAR16)) in bytes. >>=20 >>=20 >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -2678,7 +2568,6 @@ AsciiStrToUnicodeStrS ( >> ((MIN(AsciiStrLen(Source), Length) + 1) * sizeof >> (CHAR8)) in bytes. >>=20 >>=20 >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then Destination and >> DestinationLength are >>=20 >>=20 >> unmodified. >>=20 >>=20 >> diff --git a/MdePkg/Library/BaseLib/SafeString.c >> b/MdePkg/Library/BaseLib/SafeString.c >> index 7dc03d2caa..41d9137b83 100644 >> --- a/MdePkg/Library/BaseLib/SafeString.c >> +++ b/MdePkg/Library/BaseLib/SafeString.c >> @@ -14,7 +14,6 @@ >>=20 >>=20 >>=20 >> #define SAFE_STRING_CONSTRAINT_CHECK(Expression, >> Status) \ >>=20 >>=20 >> do { \ >>=20 >>=20 >> - ASSERT (Expression); \ >>=20 >>=20 >> if (!(Expression)) { \ >>=20 >>=20 >> return Status; \ >>=20 >>=20 >> } \ >>=20 >>=20 >> @@ -197,7 +196,6 @@ StrnSizeS ( >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -279,7 +277,6 @@ StrCpyS ( >>=20 >>=20 >>=20 >> If Length > 0 and Destination is not aligned on a >> 16-bit boundary, then ASSERT(). >>=20 >>=20 >> If Length > 0 and Source is not aligned on a 16-bit >> boundary, then ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -372,7 +369,6 @@ StrnCpyS ( >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -473,7 +469,6 @@ StrCatS ( >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -590,12 +585,7 @@ StrnCatS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> @@ -705,12 +695,7 @@ StrDecimalToUintnS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> @@ -825,12 +810,7 @@ StrDecimalToUint64S ( >> the first character that is a not a valid >> hexadecimal character or NULL, >>=20 >>=20 >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> @@ -956,12 +936,7 @@ StrHexToUintnS ( >> the first character that is a not a valid >> hexadecimal character or NULL, >>=20 >>=20 >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> @@ -1091,16 +1066,8 @@ StrHexToUint64S ( >> "::" can be used to compress one or more groups of X >> when X contains only 0. >>=20 >>=20 >> The "::" can only appear once in the String. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -1317,16 +1284,8 @@ StrToIpv6Address ( >> When /P is in the String, the function stops at the >> first character that is not >>=20 >>=20 >> a valid decimal digit character after P is >> converted. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength Unicode characters, >> not including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -1482,8 +1441,6 @@ StrToIpv4Address ( >> oo Data4[48:55] >>=20 >>=20 >> pp Data4[56:63] >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Guid is NULL, then ASSERT(). >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> @param String Pointer to a Null- >> terminated Unicode string. >>=20 >>=20 >> @@ -1589,17 +1546,6 @@ StrToGuid ( >>=20 >>=20 >>=20 >> If String is not aligned in a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Buffer is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Length is not multiple of 2, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If PcdMaximumUnicodeStringLength is not zero and >> Length is greater than >>=20 >>=20 >> - PcdMaximumUnicodeStringLength, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If MaxBufferSize is less than (Length / 2), then >> ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> @param String Pointer to a Null- >> terminated Unicode string. >>=20 >>=20 >> @param Length The number of >> Unicode characters to decode. >>=20 >>=20 >> @param Buffer Pointer to the >> converted bytes array. >>=20 >>=20 >> @@ -1779,8 +1725,6 @@ AsciiStrnSizeS ( >>=20 >>=20 >>=20 >> This function is similar as strcpy_s defined in C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -1856,8 +1800,6 @@ AsciiStrCpyS ( >>=20 >>=20 >>=20 >> This function is similar as strncpy_s defined in >> C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -1944,8 +1886,6 @@ AsciiStrnCpyS ( >>=20 >>=20 >>=20 >> This function is similar as strcat_s defined in C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -2040,8 +1980,6 @@ AsciiStrCatS ( >>=20 >>=20 >>=20 >> This function is similar as strncat_s defined in >> C11. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @param Destination A pointer to a >> Null-terminated Ascii string. >>=20 >>=20 >> @@ -2154,12 +2092,6 @@ AsciiStrnCatS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINTN, then >>=20 >>=20 >> @@ -2266,12 +2198,6 @@ AsciiStrDecimalToUintnS ( >> be ignored. Then, the function stops at the first >> character that is a not a >>=20 >>=20 >> valid decimal character or a Null-terminator, >> whichever one comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid decimal digits in the above >> format, then 0 is stored >>=20 >>=20 >> at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINT64, then >>=20 >>=20 >> @@ -2382,12 +2308,6 @@ AsciiStrDecimalToUint64S ( >> character that is a not a valid hexadecimal >> character or Null-terminator, >>=20 >>=20 >> whichever on comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINTN, then >>=20 >>=20 >> @@ -2509,12 +2429,6 @@ AsciiStrHexToUintnS ( >> character that is a not a valid hexadecimal >> character or Null-terminator, >>=20 >>=20 >> whichever on comes first. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Data is NULL, then ASSERT(). >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero, and >> String contains more than >>=20 >>=20 >> - PcdMaximumAsciiStringLength Ascii characters, not >> including the >>=20 >>=20 >> - Null-terminator, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If String has no valid hexadecimal digits in the >> above format, then 0 is >>=20 >>=20 >> stored at the location pointed to by Data. >>=20 >>=20 >> If the number represented by String exceeds the >> range defined by UINT64, then >>=20 >>=20 >> @@ -2635,7 +2549,6 @@ AsciiStrHexToUint64S ( >> the upper 8 bits, then ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -2735,7 +2648,6 @@ UnicodeStrToAsciiStrS ( >> If any Unicode characters in Source contain non-zero >> value in the upper 8 >>=20 >>=20 >> bits, then ASSERT(). >>=20 >>=20 >> If Source is not aligned on a 16-bit boundary, then >> ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then Destination and >> DestinationLength are >>=20 >>=20 >> unmodified. >>=20 >>=20 >> @@ -2855,7 +2767,6 @@ UnicodeStrnToAsciiStrS ( >> equal or greater than ((AsciiStrLen (Source) + 1) * >> sizeof (CHAR16)) in bytes. >>=20 >>=20 >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then the Destination is >> unmodified. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -2948,7 +2859,6 @@ AsciiStrToUnicodeStrS ( >> ((MIN(AsciiStrLen(Source), Length) + 1) * sizeof >> (CHAR8)) in bytes. >>=20 >>=20 >>=20 >>=20 >>=20 >> If Destination is not aligned on a 16-bit boundary, >> then ASSERT(). >>=20 >>=20 >> - If an error would be returned, then the function >> will also ASSERT(). >>=20 >>=20 >>=20 >>=20 >>=20 >> If an error is returned, then Destination and >> DestinationLength are >>=20 >>=20 >> unmodified. >>=20 >>=20 >> @@ -3072,10 +2982,6 @@ AsciiStrnToUnicodeStrS ( >> "::" can be used to compress one or more groups of X >> when X contains only 0. >>=20 >>=20 >> The "::" can only appear once in the String. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -3291,10 +3197,6 @@ AsciiStrToIpv6Address ( >> When /P is in the String, the function stops at the >> first character that is not >>=20 >>=20 >> a valid decimal digit character after P is >> converted. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Address is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> If EndPointer is not NULL and Address is translated >> from String, a pointer >>=20 >>=20 >> to the character that stopped the scan is stored at >> the location pointed to >>=20 >>=20 >> by EndPointer. >>=20 >>=20 >> @@ -3448,9 +3350,6 @@ AsciiStrToIpv4Address ( >> oo Data4[48:55] >>=20 >>=20 >> pp Data4[56:63] >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - If Guid is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> @param String Pointer to a Null- >> terminated ASCII string. >>=20 >>=20 >> @param Guid Pointer to the >> converted GUID. >>=20 >>=20 >>=20 >>=20 >>=20 >> @@ -3550,17 +3449,6 @@ AsciiStrToGuid ( >> decoding stops after Length of characters and >> outputs Buffer containing >>=20 >>=20 >> (Length / 2) bytes. >>=20 >>=20 >>=20 >>=20 >>=20 >> - If String is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Buffer is NULL, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If Length is not multiple of 2, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If PcdMaximumAsciiStringLength is not zero and >> Length is greater than >>=20 >>=20 >> - PcdMaximumAsciiStringLength, then ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> - If MaxBufferSize is less than (Length / 2), then >> ASSERT(). >>=20 >>=20 >> - >>=20 >>=20 >> @param String Pointer to a Null- >> terminated ASCII string. >>=20 >>=20 >> @param Length The number of ASCII >> characters to decode. >>=20 >>=20 >> @param Buffer Pointer to the >> converted bytes array. >>=20 >>=20 >> -- >> 2.24.2 (Apple Git-127) >>=20 >>=20 >>=20 >=20 --Apple-Mail=_D20BD992-C8C5-4C7D-B506-E3AE5A8C0689 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEsLABAI5Y5VbvBdmpL8K2O86Eyz4FAl7CzvUACgkQL8K2O86E yz6z/RAAjC7+dw+wMFYUqMYKvOZZ26N94+EMdJ70NDYLzQHckmSGobNA/Wl83sCs tPxdt4tHJHVCltSVsgKa0vqUl2/OzaLFDmYPGr5Jg/8vUElPaIWQKLKP2vFAZ3Lz kXS9zchgcfLeGeMBfO7Y9oKRBqvSgXj1gAXQXrrp4EUYvhoXaAlSxppttcRMSIue zVD9E+/k2TJf8q40LEuxZbFf/DlqQE7bINnay5wohHquNEIaHfoarUwzkVoZJg4U thiPGo8TccJbgReETNaEiaIMNzYWX9DIQeOgy3br+IwFRNz7N5q74nG986hOsvrS 0rBK2MbRwYU3CL41L3YGm5/IAJG0YardifaejjwiZUeFz8y8z/VWsFPRU+I28DzM uwLRs3Ixeq2hX5u0eOJ21fiYy8UtodV9dEP0uB2hc/MyUEkJpAuVtKdwzDmDu2rh mSCHUNmcWlKGDor5oEyWNMzOhkMHwJZTKw+HTCs8hPO0d9U2cteARtSNtR9SBzOY oUKgPR0KjPM3S2A5vz3KDXi+dlGTgF0kLDDx4+1bFqrM2ADtxPy6hOSU93AsdtKP VZMtNp+gLrLj5Nnad5706wXfRQI4ALljX8/h4xgLn+oIdXzZItup1FRaWdfXrkU3 LBHFyQE+8M4k14ERkbS6Vs2PD6t4neNOYbosQUaSr5MJ/AgNPWs= =6BOq -----END PGP SIGNATURE----- --Apple-Mail=_D20BD992-C8C5-4C7D-B506-E3AE5A8C0689--