wine/programs/start start.c
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Nov 10 05:06:15 CST 2005
ChangeSet ID: 21205
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/10 05:06:15
Modified files:
programs/start : start.c
Log message:
Mike McCormack <mike at codeweavers.com>
Remove the limit on the length of the command line.
Patch: http://cvs.winehq.org/patch.py?id=21205
Old revision New revision Changes Path
1.2 1.3 +29 -18 wine/programs/start/start.c
Index: wine/programs/start/start.c
diff -u -p wine/programs/start/start.c:1.2 wine/programs/start/start.c:1.3
--- wine/programs/start/start.c:1.2 10 Nov 2005 11: 6:15 -0000
+++ wine/programs/start/start.c 10 Nov 2005 11: 6:15 -0000
@@ -101,12 +101,25 @@ static void license(void)
fatal_string(STRING_LICENSE);
}
+static char *build_args( int argc, char **argv )
+{
+ int i, len = 1;
+ char *ret, *p;
+
+ for (i = 0; i < argc; i++ )
+ len += strlen(argv[i]) + 1;
+ ret = HeapAlloc( GetProcessHeap(), 0, len );
+
+ for (i = 0, p = ret; i < argc; i++ )
+ p += sprintf(p, " %s", argv[i]);
+ return ret;
+}
+
int main(int argc, char *argv[])
{
- char arguments[MAX_PATH];
- char *p;
SHELLEXECUTEINFO sei;
- int argi;
+ char *args;
+ int i;
memset(&sei, 0, sizeof(sei));
sei.cbSize = sizeof(sei);
@@ -119,24 +132,24 @@ int main(int argc, char *argv[])
* flags start with /, are case insensitive,
* and may be run together in same word.
*/
- for (argi=1; argi<argc; argi++) {
+ for (i=1; i<argc; i++) {
int ci;
- if (argv[argi][0] != '/')
+ if (argv[i][0] != '/')
break;
/* Handle all options in this word */
- for (ci=0; argv[argi][ci]; ) {
+ for (ci=0; argv[i][ci]; ) {
/* Skip slash */
ci++;
- switch(argv[argi][ci]) {
+ switch(argv[i][ci]) {
case 'l':
case 'L':
license();
break; /* notreached */
case 'm':
case 'M':
- if (argv[argi][ci+1] == 'a' || argv[argi][ci+1] == 'A')
+ if (argv[i][ci+1] == 'a' || argv[i][ci+1] == 'A')
sei.nShow = SW_SHOWMAXIMIZED;
else
sei.nShow = SW_SHOWMINIMIZED;
@@ -150,30 +163,28 @@ int main(int argc, char *argv[])
sei.fMask |= SEE_MASK_NOCLOSEPROCESS;
break;
default:
- printf("Option '%s' not recognized\n", argv[argi]+ci-1);
+ printf("Option '%s' not recognized\n", argv[i]+ci-1);
usage();
}
/* Skip to next slash */
- while (argv[argi][ci] && (argv[argi][ci] != '/'))
+ while (argv[i][ci] && (argv[i][ci] != '/'))
ci++;
}
}
- if (argi == argc)
+ if (i == argc)
usage();
- sei.lpFile = argv[argi++];
-
- /* FIXME - prone to overflow */
- arguments[0] = 0;
- for (p = arguments; argi < argc; argi++)
- p += sprintf(p, " %s", argv[argi]);
+ sei.lpFile = argv[i++];
- sei.lpParameters = arguments;
+ args = build_args( argc - i, &argv[i] );
+ sei.lpParameters = args;
if (!ShellExecuteEx(&sei))
fatal_string_error(STRING_EXECFAIL, GetLastError());
+ HeapFree( GetProcessHeap(), 0, args );
+
if (sei.fMask & SEE_MASK_NOCLOSEPROCESS) {
DWORD exitcode;
DWORD waitcode;
More information about the wine-cvs
mailing list