Commit caad1d8e authored by Andreas Mohr's avatar Andreas Mohr Committed by Alexandre Julliard

- prevent mem leak of CRTDLL_acmdln_dll

- better argument parsing - last xargv entry has to be NULL - return value is environment pointer instead of NULL - added a spec entry for bsearch()
parent 6619f5a7
...@@ -351,7 +351,7 @@ init CRTDLL_Init ...@@ -351,7 +351,7 @@ init CRTDLL_Init
@ cdecl atof(str) atof @ cdecl atof(str) atof
@ cdecl atoi(str) atoi @ cdecl atoi(str) atoi
@ cdecl atol(str) atol @ cdecl atol(str) atol
@ stub bsearch @ cdecl bsearch(ptr ptr long long ptr) bsearch
@ cdecl calloc(long long) CRTDLL_calloc @ cdecl calloc(long long) CRTDLL_calloc
@ cdecl ceil(double) ceil @ cdecl ceil(double) ceil
@ stub clearerr @ stub clearerr
......
...@@ -121,17 +121,21 @@ BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) ...@@ -121,17 +121,21 @@ BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
/********************************************************************* /*********************************************************************
* _GetMainArgs (CRTDLL.022) * _GetMainArgs (CRTDLL.022)
*/ */
DWORD __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv, LPSTR * __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,
LPSTR *environ,DWORD flag) LPSTR *environ,DWORD flag)
{ {
char *cmdline; char *cmdline;
char **xargv; char **xargv;
int xargc,i,afterlastspace; int xargc,end,last_arg,afterlastspace;
DWORD version; DWORD version;
TRACE("(%p,%p,%p,%ld).\n", TRACE("(%p,%p,%p,%ld).\n",
argc,argv,environ,flag argc,argv,environ,flag
); );
if (CRTDLL_acmdln_dll != NULL)
HeapFree(GetProcessHeap(), 0, CRTDLL_acmdln_dll);
CRTDLL_acmdln_dll = cmdline = HEAP_strdupA( GetProcessHeap(), 0, CRTDLL_acmdln_dll = cmdline = HEAP_strdupA( GetProcessHeap(), 0,
GetCommandLineA() ); GetCommandLineA() );
TRACE("got '%s'\n", cmdline); TRACE("got '%s'\n", cmdline);
...@@ -150,27 +154,40 @@ DWORD __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv, ...@@ -150,27 +154,40 @@ DWORD __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,
/* missing threading init */ /* missing threading init */
i=0;xargv=NULL;xargc=0;afterlastspace=0; end=0;last_arg=0;xargv=NULL;xargc=0;afterlastspace=0;
while (cmdline[i]) { while (1)
if (cmdline[i]==' ') { {
if ((cmdline[end]==' ') || (cmdline[end]=='\0'))
{
if (cmdline[end]=='\0')
last_arg=1;
else
cmdline[end]='\0';
/* alloc xargc + NULL entry */
xargv=(char**)HeapReAlloc( GetProcessHeap(), 0, xargv, xargv=(char**)HeapReAlloc( GetProcessHeap(), 0, xargv,
sizeof(char*)*(++xargc)); sizeof(char*)*(xargc+1));
cmdline[i]='\0'; if (strlen(cmdline+afterlastspace))
xargv[xargc-1] = HEAP_strdupA( GetProcessHeap(), 0, {
xargv[xargc] = HEAP_strdupA( GetProcessHeap(), 0,
cmdline+afterlastspace); cmdline+afterlastspace);
i++; xargc++;
while (cmdline[i]==' ') if (!last_arg) /* need to seek to the next arg ? */
i++; {
if (cmdline[i]) end++;
afterlastspace=i; while (cmdline[end]==' ')
} else end++;
i++; }
afterlastspace=end;
}
else
{
xargv[xargc] = NULL; /* the last entry is NULL */
break;
}
}
else
end++;
} }
xargv=(char**)HeapReAlloc( GetProcessHeap(), 0, xargv,
sizeof(char*)*(++xargc));
cmdline[i]='\0';
xargv[xargc-1] = HEAP_strdupA( GetProcessHeap(), 0,
cmdline+afterlastspace);
CRTDLL_argc_dll = xargc; CRTDLL_argc_dll = xargc;
*argc = xargc; *argc = xargc;
CRTDLL_argv_dll = xargv; CRTDLL_argv_dll = xargv;
...@@ -179,7 +196,7 @@ DWORD __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv, ...@@ -179,7 +196,7 @@ DWORD __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,
TRACE("found %d arguments\n", TRACE("found %d arguments\n",
CRTDLL_argc_dll); CRTDLL_argc_dll);
CRTDLL_environ_dll = *environ = GetEnvironmentStringsA(); CRTDLL_environ_dll = *environ = GetEnvironmentStringsA();
return 0; return environ;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment