Browse Source

Fix off-by-one error in syswin.inc:setup_arguments.

Rika Ichinose 1 year ago
parent
commit
4383aab15a
1 changed files with 6 additions and 7 deletions
  1. 6 7
      rtl/win/syswin.inc

+ 6 - 7
rtl/win/syswin.inc

@@ -278,7 +278,7 @@ begin
           args[result.nargs]:=chars+result.nchars;
           args[result.nargs]:=chars+result.nchars;
         inc(result.nargs);
         inc(result.nargs);
         if result.nchars=0 then
         if result.nchars=0 then
-          argsStartInCmdLine:=cmdLine;
+          argsStartInCmdLine:=cmdLine-1;
       end;
       end;
     if Assigned(chars) then
     if Assigned(chars) then
       chars[result.nchars]:=c;
       chars[result.nchars]:=c;
@@ -324,9 +324,10 @@ begin
     argv:=PPAnsiChar(argvw+argc);
     argv:=PPAnsiChar(argvw+argc);
     wchars:=PWideChar(argv+argc+1);
     wchars:=PWideChar(argv+argc+1);
     achars:=PAnsiChar(wchars+nArg0W+1+pc.nchars);
     achars:=PAnsiChar(wchars+nArg0W+1+pc.nchars);
+    acharse:=achars+nArg0A+1+pc.nachars;
     if Assigned(argvw) then
     if Assigned(argvw) then
       break;
       break;
-    argvw:=SysGetMem(PtrUint(achars+nArg0A+1+pc.nachars));
+    argvw:=SysGetMem(PtrUint(acharse));
   until not Assigned(argvw); { If ReturnNilIfGrowHeapFails was customized to true, let it crash on allocation failure instead of looping endlessly. }
   until not Assigned(argvw); { If ReturnNilIfGrowHeapFails was customized to true, let it crash on allocation failure instead of looping endlessly. }
 
 
   Move(PWideChar(buf)^, wchars^, nArg0W*sizeof(widechar));
   Move(PWideChar(buf)^, wchars^, nArg0W*sizeof(widechar));
@@ -335,17 +336,15 @@ begin
   ParseCommandLine(CmdLineW, argvw+1, wchars+nArg0W+1);
   ParseCommandLine(CmdLineW, argvw+1, wchars+nArg0W+1);
 
 
   { Convert argvw to argv. }
   { Convert argvw to argv. }
-  acharse:=achars+nArg0A+1+pc.nachars;
   for iarg:=0 to pc.nargs do
   for iarg:=0 to pc.nargs do
     begin
     begin
       argv[iarg]:=achars;
       argv[iarg]:=achars;
-      inc(achars, WideCharToMultiByte(DefaultSystemCodePage, 0, argvw[iarg], length(argvw[iarg]), achars, acharse-achars, nil, nil)+1);
-      achars[-1]:=#0;
+      inc(achars, WideCharToMultiByte(DefaultSystemCodePage, 0, argvw[iarg], -1, achars, acharse-achars, nil, nil));
     end;
     end;
   argv[argc]:=nil;
   argv[argc]:=nil;
 end;
 end;
 
 
-procedure finalize_arguments;
+procedure finalize_arguments; inline;
 begin
 begin
   SysFreeMem(argvw);
   SysFreeMem(argvw);
 end;
 end;
@@ -806,7 +805,7 @@ begin
   CtrlBreakHandler := Handler;
   CtrlBreakHandler := Handler;
 end;
 end;
 
 
-procedure WinFinalizeSystem;
+procedure WinFinalizeSystem; inline;
 begin
 begin
   finalize_arguments;
   finalize_arguments;
 end;
 end;