ChangeSet ID: 21205 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/10 05:06:15
Modified files: programs/start : start.c
Log message: Mike McCormack mike@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;