cmd: Ensure environment variables fit in memory

Bruno Jesus 00cpxxx at gmail.com
Tue Jan 6 10:55:01 CST 2015


Fixes bug https://bugs.winehq.org/show_bug.cgi?id=37848
-------------- next part --------------
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 294a153..1a78b55 100644
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -496,15 +496,23 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
     WCHAR *begin = strchrW(firstModifier, '$') + 1;
     WCHAR *end   = strchrW(firstModifier, ':');
     WCHAR env[MAX_PATH];
-    WCHAR fullpath[MAX_PATH];
+    DWORD size;
 
     /* Extract the env var */
     memcpy(env, begin, (end-begin) * sizeof(WCHAR));
     env[(end-begin)] = 0x00;
 
-    /* If env var not found, return empty string */
-    if ((GetEnvironmentVariableW(env, fullpath, MAX_PATH) == 0) ||
-        (SearchPathW(fullpath, outputparam, NULL, MAX_PATH, outputparam, NULL) == 0)) {
+    size = GetEnvironmentVariableW(env, NULL, 0);
+    if (size > 0) {
+      WCHAR *fullpath = heap_alloc(size * sizeof(WCHAR));
+      if (!fullpath || (GetEnvironmentVariableW(env, fullpath, size) == 0) ||
+          (SearchPathW(fullpath, outputparam, NULL, MAX_PATH, outputparam, NULL) == 0))
+          size = 0;
+      heap_free(fullpath);
+    }
+
+    if (!size) {
+      /* If env var not found, return empty string */
       finaloutput[0] = 0x00;
       outputparam[0] = 0x00;
       skipFileParsing = TRUE;


More information about the wine-patches mailing list