summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Vorlicek <janvorli@microsoft.com>2017-01-04 22:05:43 +0100
committerGitHub <noreply@github.com>2017-01-04 22:05:43 +0100
commitedc1320180a3d68a16855da8da82f01871bf3a1d (patch)
tree029978c089a211cb6902530859ab44685854a1f1
parent06c78a5f7b27efeb7d462b1ba1c139f320d3fb80 (diff)
downloadcoreclr-edc1320180a3d68a16855da8da82f01871bf3a1d.tar.gz
coreclr-edc1320180a3d68a16855da8da82f01871bf3a1d.tar.bz2
coreclr-edc1320180a3d68a16855da8da82f01871bf3a1d.zip
Fix NULL string printing in printf (#8800)
The functions implementing various printf flavors in PAL were not handling correctly the case when a string pointer passed to them for %S and %s formats was NULL. Instead of printing `(null)`, they were crashing. This change fixes the problem and also adds PAL tests to verify it is working properly.
-rw-r--r--src/pal/src/cruntime/printfcpp.cpp96
-rw-r--r--src/pal/tests/palsuite/c_runtime/_snprintf_s/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_snprintf_s/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_snwprintf_s/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_snwprintf_s/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/fprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/fprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/fwprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/fwprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/printf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/printf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/sprintf_s/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/sprintf_s/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/swprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/swprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vfprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vfprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vsprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vsprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vswprintf/test2/test2.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/vswprintf/test3/test3.cpp6
-rw-r--r--src/pal/tests/palsuite/c_runtime/wprintf/test2/test2.cpp6
28 files changed, 216 insertions, 42 deletions
diff --git a/src/pal/src/cruntime/printfcpp.cpp b/src/pal/src/cruntime/printfcpp.cpp
index 85ec698991..0b9072102b 100644
--- a/src/pal/src/cruntime/printfcpp.cpp
+++ b/src/pal/src/cruntime/printfcpp.cpp
@@ -35,6 +35,9 @@ SET_DEFAULT_DEBUG_CHANNEL(CRT);
using namespace CorUnix;
+static const char __nullstring[] = "(null)"; /* string to print on null ptr */
+static const WCHAR __wnullstring[] = W("(null)"); /* string to print on null ptr */
+
int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format, va_list ap);
int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *format, va_list ap);
@@ -863,7 +866,7 @@ Parameters:
- padding style flags (PRINTF_FORMAT_FLAGS)
*******************************************************************************/
-INT Internal_AddPaddingVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, LPSTR In,
+INT Internal_AddPaddingVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, LPCSTR In,
INT Padding, INT Flags)
{
LPSTR Out;
@@ -1096,7 +1099,8 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
{
CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */
LPCWSTR Fmt = format;
- LPWSTR TempWStr = NULL;
+ LPCWSTR TempWStr = NULL;
+ LPWSTR AllocedTempWStr = NULL;
LPWSTR WorkingWStr = NULL;
WCHAR TempWChar[2];
INT Flags;
@@ -1105,7 +1109,6 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
INT Prefix;
INT Type;
INT TempInt;
- BOOL WStrWasMalloced = FALSE;
int mbtowcResult;
int written=0;
int paddingReturnValue;
@@ -1133,7 +1136,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
(Type == PFF_TYPE_STRING || Type == PFF_TYPE_WSTRING)) ||
(Type == PFF_TYPE_WSTRING && (Flags & PFF_ZERO) != 0))
{
- WStrWasMalloced = FALSE;
+ AllocedTempWStr = NULL;
if (WIDTH_STAR == Width)
{
@@ -1162,37 +1165,50 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
else
{
/* %lS assumes a LPSTR argument. */
- LPSTR s = va_arg(ap, LPSTR );
- UINT Length = 0;
- Length = MultiByteToWideChar( CP_ACP, 0, s, -1, NULL, 0 );
- if ( Length != 0 )
+ LPCSTR s = va_arg(ap, LPSTR );
+ if (s == NULL)
+ {
+ TempWStr = NULL;
+ }
+ else
{
- TempWStr =
- (LPWSTR)InternalMalloc( (Length) * sizeof( WCHAR ) );
- if ( TempWStr )
+ UINT Length = 0;
+ Length = MultiByteToWideChar( CP_ACP, 0, s, -1, NULL, 0 );
+ if ( Length != 0 )
{
- WStrWasMalloced = TRUE;
- MultiByteToWideChar( CP_ACP, 0, s, -1,
- TempWStr, Length );
+ AllocedTempWStr =
+ (LPWSTR)InternalMalloc( (Length) * sizeof( WCHAR ) );
+
+ if ( AllocedTempWStr )
+ {
+ MultiByteToWideChar( CP_ACP, 0, s, -1,
+ AllocedTempWStr, Length );
+ TempWStr = AllocedTempWStr;
+ }
+ else
+ {
+ ERROR( "InternalMalloc failed.\n" );
+ LOGEXIT("vfwprintf returns int -1\n");
+ PERF_EXIT(vfwprintf);
+ va_end(ap);
+ return -1;
+ }
}
else
{
- ERROR( "InternalMalloc failed.\n" );
+ ASSERT( "Unable to convert from multibyte "
+ " to wide char.\n" );
LOGEXIT("vfwprintf returns int -1\n");
PERF_EXIT(vfwprintf);
va_end(ap);
return -1;
}
}
- else
- {
- ASSERT( "Unable to convert from multibyte "
- " to wide char.\n" );
- LOGEXIT("vfwprintf returns int -1\n");
- PERF_EXIT(vfwprintf);
- va_end(ap);
- return -1;
- }
+ }
+
+ if (TempWStr == NULL)
+ {
+ TempWStr = __wnullstring;
}
INT Length = PAL_wcslen(TempWStr);
@@ -1203,10 +1219,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
LOGEXIT("vfwprintf returns int -1\n");
PERF_EXIT(vfwprintf);
pthrCurrent->SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- if (WStrWasMalloced)
- {
- free(TempWStr);
- }
+ free(AllocedTempWStr);
va_end(ap);
return -1;
}
@@ -1221,10 +1234,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
if (wcsncpy_s(WorkingWStr, (Length + 1), TempWStr, Precision+1) != SAFECRT_SUCCESS)
{
ERROR("Internal_AddPaddingVfwprintf failed\n");
- if (WStrWasMalloced)
- {
- free(TempWStr);
- }
+ free(AllocedTempWStr);
free(WorkingWStr);
LOGEXIT("wcsncpy_s failed!\n");
PERF_EXIT(vfwprintf);
@@ -1250,10 +1260,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
if (paddingReturnValue == -1)
{
ERROR("Internal_AddPaddingVfwprintf failed\n");
- if (WStrWasMalloced)
- {
- free(TempWStr);
- }
+ free(AllocedTempWStr);
free(WorkingWStr);
LOGEXIT("vfwprintf returns int -1\n");
PERF_EXIT(vfwprintf);
@@ -1263,10 +1270,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for
written += paddingReturnValue;
free(WorkingWStr);
- if (WStrWasMalloced)
- {
- free(TempWStr);
- }
+ free(AllocedTempWStr);
}
else if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_CHAR)
{
@@ -1525,7 +1529,7 @@ int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format,
{
CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */
LPCSTR Fmt = format;
- LPWSTR TempWStr;
+ LPCWSTR TempWStr;
LPSTR TempStr;
WCHAR TempWChar;
INT Flags;
@@ -1574,6 +1578,10 @@ int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format,
}
TempWStr = va_arg(ap, LPWSTR);
+ if (TempWStr == NULL)\
+ {
+ TempWStr = __wnullstring;
+ }
Length = WideCharToMultiByte(CP_ACP, 0, TempWStr, -1, 0,
0, 0, 0);
if (!Length)
@@ -1743,9 +1751,13 @@ int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format,
{
// Some versions of fprintf don't support 0-padded strings,
// so we handle them here.
- char *tempStr;
+ const char *tempStr;
tempStr = va_arg(ap, char *);
+ if (tempStr == NULL)
+ {
+ tempStr = __nullstring;
+ }
Length = strlen(tempStr);
paddingReturnValue = Internal_AddPaddingVfprintf(
pthrCurrent,
diff --git a/src/pal/tests/palsuite/c_runtime/_snprintf_s/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/_snprintf_s/test2/test2.cpp
index e58669466f..54ef80bae3 100644
--- a/src/pal/tests/palsuite/c_runtime/_snprintf_s/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_snprintf_s/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_snprintf_s/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/_snprintf_s/test3/test3.cpp
index 3c52b44246..99c25a654b 100644
--- a/src/pal/tests/palsuite/c_runtime/_snprintf_s/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_snprintf_s/test3/test3.cpp
@@ -39,6 +39,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test2/test2.cpp
index 86bfdc9839..7d8dd65c38 100644
--- a/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest(convert("foo %5.2s"), convert("bar"), convert("foo ba"));
DoWStrTest(convert("foo %-5s"), convert("bar"), convert("foo bar "));
DoWStrTest(convert("foo %05s"), convert("bar"), convert("foo 00bar"));
+ DoWStrTest(convert("foo %s"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hs"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ws"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %Ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %I64s"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test3/test3.cpp
index f6db6f265d..b4a4a32ae2 100644
--- a/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_snwprintf_s/test3/test3.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest(convert("foo %5.2S"), "bar", convert("foo ba"));
DoStrTest(convert("foo %-5S"), "bar", convert("foo bar "));
DoStrTest(convert("foo %05S"), "bar", convert("foo 00bar"));
+ DoStrTest(convert("foo %S"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %lS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %wS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %LS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %I64S"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test2/test2.cpp
index 69c8c2723b..e5808f363e 100644
--- a/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test2/test2.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test3/test3.cpp
index a244aa44b6..bb8b153b52 100644
--- a/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_vsnprintf_s/test3/test3.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test2/test2.cpp
index 18e5adffd3..b2958dfa8d 100644
--- a/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test2/test2.cpp
@@ -34,6 +34,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest(convert("foo %5.2s"), convert("bar"), convert("foo ba"));
DoWStrTest(convert("foo %-5s"), convert("bar"), convert("foo bar "));
DoWStrTest(convert("foo %05s"), convert("bar"), convert("foo 00bar"));
+ DoWStrTest(convert("foo %s"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hs"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ws"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %Ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %I64s"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test3/test3.cpp
index 5e2bfa21a0..657a911b5c 100644
--- a/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/_vsnwprintf_s/test3/test3.cpp
@@ -34,6 +34,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest(convert("foo %5.2S"), "bar", convert("foo ba"));
DoStrTest(convert("foo %-5S"), "bar", convert("foo bar "));
DoStrTest(convert("foo %05S"), "bar", convert("foo 00bar"));
+ DoStrTest(convert("foo %S"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %lS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %wS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %LS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %I64S"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/fprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/fprintf/test2/test2.cpp
index 1ed7f3fd23..1441827489 100644
--- a/src/pal/tests/palsuite/c_runtime/fprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/fprintf/test2/test2.cpp
@@ -36,6 +36,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/fprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/fprintf/test3/test3.cpp
index 6185135581..dd34c08536 100644
--- a/src/pal/tests/palsuite/c_runtime/fprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/fprintf/test3/test3.cpp
@@ -35,6 +35,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/fwprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/fwprintf/test2/test2.cpp
index ecd3c513df..1e03147619 100644
--- a/src/pal/tests/palsuite/c_runtime/fwprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/fwprintf/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest(convert("foo %5.2s"), convert("bar"), "foo ba");
DoWStrTest(convert("foo %-5s"), convert("bar"), "foo bar ");
DoWStrTest(convert("foo %05s"), convert("bar"), "foo 00bar");
+ DoWStrTest(convert("foo %s"), NULL, "foo (null)");
+ DoStrTest(convert("foo %hs"), NULL, "foo (null)");
+ DoWStrTest(convert("foo %ls"), NULL, "foo (null)");
+ DoWStrTest(convert("foo %ws"), NULL, "foo (null)");
+ DoWStrTest(convert("foo %Ls"), NULL, "foo (null)");
+ DoWStrTest(convert("foo %I64s"), NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/fwprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/fwprintf/test3/test3.cpp
index d718a19067..ff24aa715f 100644
--- a/src/pal/tests/palsuite/c_runtime/fwprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/fwprintf/test3/test3.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest(convert("foo %5.2S"),"bar", "foo ba");
DoStrTest(convert("foo %-5S"), "bar", "foo bar ");
DoStrTest(convert("foo %05S"), "bar", "foo 00bar");
+ DoStrTest(convert("foo %S"), NULL, "foo (null)");
+ DoStrTest(convert("foo %hS"), NULL, "foo (null)");
+ DoWStrTest(convert("foo %lS"), NULL, "foo (null)");
+ DoWStrTest(convert("foo %wS"), NULL, "foo (null)");
+ DoStrTest(convert("foo %LS"), NULL, "foo (null)");
+ DoStrTest(convert("foo %I64S"), NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/printf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/printf/test2/test2.cpp
index e766ef4a90..1c61b1d86d 100644
--- a/src/pal/tests/palsuite/c_runtime/printf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/printf/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/printf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/printf/test3/test3.cpp
index 5cc530948c..79fe7213b3 100644
--- a/src/pal/tests/palsuite/c_runtime/printf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/printf/test3/test3.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/sprintf_s/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/sprintf_s/test2/test2.cpp
index 990f4f04a8..a3eb71dd1c 100644
--- a/src/pal/tests/palsuite/c_runtime/sprintf_s/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/sprintf_s/test2/test2.cpp
@@ -40,6 +40,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/sprintf_s/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/sprintf_s/test3/test3.cpp
index c0dc8e1716..dd6e590263 100644
--- a/src/pal/tests/palsuite/c_runtime/sprintf_s/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/sprintf_s/test3/test3.cpp
@@ -39,6 +39,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/swprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/swprintf/test2/test2.cpp
index deffd3edd7..1c2f420fe9 100644
--- a/src/pal/tests/palsuite/c_runtime/swprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/swprintf/test2/test2.cpp
@@ -40,6 +40,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest(convert("foo %5.2s"), convert("bar"), convert("foo ba"));
DoWStrTest(convert("foo %-5s"), convert("bar"), convert("foo bar "));
DoWStrTest(convert("foo %05s"), convert("bar"), convert("foo 00bar"));
+ DoWStrTest(convert("foo %s"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hs"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ws"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %Ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %I64s"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/swprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/swprintf/test3/test3.cpp
index 42875c0640..8c6c38c96b 100644
--- a/src/pal/tests/palsuite/c_runtime/swprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/swprintf/test3/test3.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest(convert("foo %5.2S"),"bar", convert("foo ba"));
DoStrTest(convert("foo %-5S"), "bar", convert("foo bar "));
DoStrTest(convert("foo %05S"), "bar", convert("foo 00bar"));
+ DoStrTest(convert("foo %S"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %lS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %wS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %LS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %I64S"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
}
diff --git a/src/pal/tests/palsuite/c_runtime/vfprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/vfprintf/test2/test2.cpp
index d01117f047..0228734525 100644
--- a/src/pal/tests/palsuite/c_runtime/vfprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vfprintf/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoStrTest("foo %ls", NULL, "foo (null)");
+ DoStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vfprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/vfprintf/test3/test3.cpp
index 0081daa426..879446f851 100644
--- a/src/pal/tests/palsuite/c_runtime/vfprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vfprintf/test3/test3.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/vprintf/test2/test2.cpp
index 4d9c9bc6f5..72b79e5969 100644
--- a/src/pal/tests/palsuite/c_runtime/vprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vprintf/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/vprintf/test3/test3.cpp
index 5376c56b76..66cd509d94 100644
--- a/src/pal/tests/palsuite/c_runtime/vprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vprintf/test3/test3.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vsprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/vsprintf/test2/test2.cpp
index fbd4b41068..fc9163e976 100644
--- a/src/pal/tests/palsuite/c_runtime/vsprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vsprintf/test2/test2.cpp
@@ -36,6 +36,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest("foo %5.2s", "bar", "foo ba");
DoStrTest("foo %-5s", "bar", "foo bar ");
DoStrTest("foo %05s", "bar", "foo 00bar");
+ DoStrTest("foo %s", NULL, "foo (null)");
+ DoStrTest("foo %hs", NULL, "foo (null)");
+ DoWStrTest("foo %ls", NULL, "foo (null)");
+ DoWStrTest("foo %ws", NULL, "foo (null)");
+ DoStrTest("foo %Ls", NULL, "foo (null)");
+ DoStrTest("foo %I64s", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vsprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/vsprintf/test3/test3.cpp
index 742370ebe9..4656bf3a92 100644
--- a/src/pal/tests/palsuite/c_runtime/vsprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vsprintf/test3/test3.cpp
@@ -37,6 +37,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest("foo %5.2S", convert("bar"), "foo ba");
DoWStrTest("foo %-5S", convert("bar"), "foo bar ");
DoWStrTest("foo %05S", convert("bar"), "foo 00bar");
+ DoWStrTest("foo %S", NULL, "foo (null)");
+ DoStrTest("foo %hS", NULL, "foo (null)");
+ DoWStrTest("foo %lS", NULL, "foo (null)");
+ DoWStrTest("foo %wS", NULL, "foo (null)");
+ DoWStrTest("foo %LS", NULL, "foo (null)");
+ DoWStrTest("foo %I64S", NULL, "foo (null)");
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vswprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/vswprintf/test2/test2.cpp
index 491d99f0cf..a7b1b3a336 100644
--- a/src/pal/tests/palsuite/c_runtime/vswprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vswprintf/test2/test2.cpp
@@ -34,6 +34,12 @@ int __cdecl main(int argc, char *argv[])
DoWStrTest(convert("foo %5.2s"), convert("bar"), convert("foo ba"));
DoWStrTest(convert("foo %-5s"), convert("bar"), convert("foo bar "));
DoWStrTest(convert("foo %05s"), convert("bar"), convert("foo 00bar"));
+ DoWStrTest(convert("foo %s"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hs"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %ws"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %Ls"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %I64s"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/vswprintf/test3/test3.cpp b/src/pal/tests/palsuite/c_runtime/vswprintf/test3/test3.cpp
index 1eb0b65ebe..40c7d2afcf 100644
--- a/src/pal/tests/palsuite/c_runtime/vswprintf/test3/test3.cpp
+++ b/src/pal/tests/palsuite/c_runtime/vswprintf/test3/test3.cpp
@@ -34,6 +34,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest(convert("foo %5.2S"), "bar", convert("foo ba"));
DoStrTest(convert("foo %-5S"), "bar", convert("foo bar "));
DoStrTest(convert("foo %05S"), "bar", convert("foo 00bar"));
+ DoStrTest(convert("foo %S"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %hS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %lS"), NULL, convert("foo (null)"));
+ DoWStrTest(convert("foo %wS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %LS"), NULL, convert("foo (null)"));
+ DoStrTest(convert("foo %I64S"), NULL, convert("foo (null)"));
PAL_Terminate();
return PASS;
diff --git a/src/pal/tests/palsuite/c_runtime/wprintf/test2/test2.cpp b/src/pal/tests/palsuite/c_runtime/wprintf/test2/test2.cpp
index 254e98a394..4e54d452e8 100644
--- a/src/pal/tests/palsuite/c_runtime/wprintf/test2/test2.cpp
+++ b/src/pal/tests/palsuite/c_runtime/wprintf/test2/test2.cpp
@@ -38,6 +38,12 @@ int __cdecl main(int argc, char *argv[])
DoStrTest(u"foo %5.2s", u"bar", u"foo ba");
DoStrTest(u"foo %-5s", u"bar", u"foo bar ");
DoStrTest(u"foo %05s", u"bar", u"foo 00bar");
+ DoStrTest(u"foo %s", NULL, u"foo (null)");
+ DoStrTest(u"foo %hs", NULL, u"foo (null)");
+ DoStrTest(u"foo %ls", NULL, u"foo (null)");
+ DoStrTest(u"foo %ws", NULL, u"foo (null)");
+ DoStrTest(u"foo %Ls", NULL, u"foo (null)");
+ DoStrTest(u"foo %I64s", NULL, u"foo (null)");
PAL_Terminate();
return PASS;