[PATCH 2/3] programs/cmd: Fix an off-by-one error in WCMD_expand_envvar().

Francois Gouget fgouget at codeweavers.com
Wed Mar 23 21:59:40 CDT 2022


The expanded string length must include the trailing null character for
'magic' environment variables too.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
Compare the lstrlenW() return value with ExpandEnvironmentStringsW()'s.
---
 programs/cmd/tests/test_builtins.cmd |  7 +++++++
 programs/cmd/wcmdmain.c              | 10 +++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 8133268d2dd..d8150692b54 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1791,9 +1791,16 @@ call :checkenvvars WINE_foo 6 WINE_bar 6
 
 echo --- Magic environment variables
 echo Century=%date:~6,2%
+set WINE_foo=%date:~9,1%
+if not defined WINE_foo echo "%%date%% is too short"
+rem But may be longer depending on locale
 
 set WINE_foo=%time:~7,1%
 if not defined WINE_foo echo "No seconds in %%time%%"
+set WINE_foo=%time:~10,1%
+if not defined WINE_foo echo "No 1/100s in %%time%%"
+set WINE_foo=%time:~11,1%
+if defined WINE_foo echo "Found more time at the end of %%time%%"
 
 set WINE_foo=%random%
 if %WINE_foo% equ %random% echo "%%random%% is not random"
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index cd083449ffe..fbded294741 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -615,24 +615,24 @@ static WCHAR *WCMD_expand_envvar(WCHAR *start, WCHAR startchar)
     /* override if existing env var called that name              */
     if (WCMD_is_magic_envvar(thisVar, L"ERRORLEVEL")) {
       wsprintfW(thisVarContents, L"%d", errorlevel);
-      len = lstrlenW(thisVarContents);
+      len = lstrlenW(thisVarContents) + 1;
     } else if (WCMD_is_magic_envvar(thisVar, L"DATE")) {
       GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL,
                     NULL, thisVarContents, MAXSTRING);
-      len = lstrlenW(thisVarContents);
+      len = lstrlenW(thisVarContents) + 1;
     } else if (WCMD_is_magic_envvar(thisVar, L"TIME")) {
       GetTimeFormatW(LOCALE_USER_DEFAULT, 0, NULL,
                         NULL, thisVarContents, MAXSTRING);
       /* FIXME This should have 1/100s precision as well as a localized
        * decimal separator */
       lstrcatW(thisVarContents, L".00");
-      len = lstrlenW(thisVarContents);
+      len = lstrlenW(thisVarContents) + 1;
     } else if (WCMD_is_magic_envvar(thisVar, L"CD")) {
       GetCurrentDirectoryW(MAXSTRING, thisVarContents);
-      len = lstrlenW(thisVarContents);
+      len = lstrlenW(thisVarContents) + 1;
     } else if (WCMD_is_magic_envvar(thisVar, L"RANDOM")) {
       wsprintfW(thisVarContents, L"%d", rand() % 32768);
-      len = lstrlenW(thisVarContents);
+      len = lstrlenW(thisVarContents) + 1;
     } else {
 
       len = ExpandEnvironmentStringsW(thisVar, thisVarContents, ARRAY_SIZE(thisVarContents));
-- 
2.30.2




More information about the wine-devel mailing list