Protect MSVCRT__acmdln global variable from corruption
Dmitry Timoshkov
dmitry at sloboda.ru
Mon Feb 19 09:01:49 CST 2001
Hello.
Due to corruption of MSVCRT__acmdln global variable, applications
referencing it instead of using GetCommandLine (actually all GUI apps,
with MS run-time) never got its command line arguments.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Fix prototypes of MSVCRT___getmainargs and MSVCRT___wgetmainargs.
Protect MSVCRT__acmdln global variable from corruption.
diff -u cvs/wine/dlls/msvcrt/data.c wine/dlls/msvcrt/data.c
--- cvs/wine/dlls/msvcrt/data.c Mon Feb 12 22:12:19 2001
+++ wine/dlls/msvcrt/data.c Sat Feb 17 23:20:56 2001
@@ -142,8 +142,13 @@
int xargc,end,last_arg,afterlastspace;
DWORD version;
- MSVCRT__acmdln = cmdline = MSVCRT__strdup( GetCommandLineA() );
- MSVCRT__wcmdln = wcmdline = wstrdupa(cmdline);
+ MSVCRT__acmdln = MSVCRT__strdup( GetCommandLineA() );
+ MSVCRT__wcmdln = wcmdline = wstrdupa(MSVCRT__acmdln);
+
+ /* Make a copy of MSVCRT__acmdln to be able modify it.
+ We will free it at the end of processing. */
+ cmdline = MSVCRT__strdup(MSVCRT__acmdln);
+
TRACE("got '%s', wide = '%s'\n", cmdline, debugstr_w(wcmdline));
version = GetVersion();
@@ -207,6 +212,9 @@
MSVCRT___argv = xargv;
MSVCRT___wargv = wxargv;
+ /* Free a no more needed copy of the command line */
+ MSVCRT_free( cmdline );
+
TRACE("found %d arguments\n",MSVCRT___argc);
MSVCRT__environ = GetEnvironmentStringsA();
MSVCRT___initenv = &MSVCRT__environ;
@@ -224,25 +232,25 @@
/*********************************************************************
* __getmainargs (MSVCRT.@)
*/
-char** __cdecl MSVCRT___getmainargs(DWORD *argc,char ***argv,char **environ,DWORD flag)
+void __cdecl MSVCRT___getmainargs(int *argc, char ***argv, char **environ,
+ int expand_wildcards, void *_startupinfo)
{
- TRACE("(%p,%p,%p,%ld).\n",argc,argv,environ,flag);
+ TRACE("(%p,%p,%p,%d,%p).\n", argc, argv, environ, expand_wildcards, _startupinfo);
*argc = MSVCRT___argc;
*argv = MSVCRT___argv;
*environ = MSVCRT__environ;
- return environ;
}
/*********************************************************************
* __wgetmainargs (MSVCRT.@)
*/
-WCHAR** __cdecl MSVCRT___wgetmainargs(DWORD *argc,WCHAR ***wargv,WCHAR **wenviron,DWORD flag)
+void __cdecl MSVCRT___wgetmainargs(int *argc, WCHAR ***wargv, WCHAR **wenviron,
+ int expand_wildcards, void *_startupinfo)
{
- TRACE("(%p,%p,%p,%ld).\n",argc,wargv,wenviron,flag);
+ TRACE("(%p,%p,%p,%d,%p).\n", argc, wargv, wenviron, expand_wildcards, _startupinfo);
*argc = MSVCRT___argc;
*wargv = MSVCRT___wargv;
*wenviron = MSVCRT__wenviron;
- return wenviron;
}
/*********************************************************************
diff -u cvs/wine/dlls/msvcrt/msvcrt.spec wine/dlls/msvcrt/msvcrt.spec
--- cvs/wine/dlls/msvcrt/msvcrt.spec Fri Jan 26 12:27:24 2001
+++ wine/dlls/msvcrt/msvcrt.spec Sat Feb 17 23:18:01 2001
@@ -96,7 +96,7 @@
@ cdecl __dllonexit(ptr ptr ptr) MSVCRT___dllonexit
@ cdecl __doserrno() MSVCRT___doserrno
@ stub __fpecode #()
-@ cdecl __getmainargs(ptr ptr ptr long) MSVCRT___getmainargs
+@ cdecl __getmainargs(ptr ptr ptr long ptr) MSVCRT___getmainargs
@ extern __initenv MSVCRT___initenv
@ cdecl __isascii(long) MSVCRT___isascii
@ cdecl __iscsym(long) MSVCRT___iscsym
@@ -147,7 +147,7 @@
@ cdecl __unDNameEx() MSVCRT___unDNameEx #FIXME
@ extern __unguarded_readlc_active MSVCRT___unguarded_readlc_active
@ extern __wargv MSVCRT___wargv
-@ cdecl __wgetmainargs(ptr ptr ptr long) MSVCRT___wgetmainargs
+@ cdecl __wgetmainargs(ptr ptr ptr long ptr) MSVCRT___wgetmainargs
@ extern __winitenv MSVCRT___winitenv
@ cdecl _abnormal_termination() MSVCRT__abnormal_termination
@ cdecl _access(str long) MSVCRT__access
More information about the wine-patches
mailing list