Proposed JEP: Safer Process Launch by ProcessBuilder and Runtime.exec

Raffaello Giulietti raffaello.giulietti at gmail.com
Fri Jan 28 19:14:51 UTC 2022


Hi Roger,

I'm trying the following (ugly) code on JDK 17/Win, where Args.exe does 
nothing else than writing out its argv[], redirecting to a log file.

     public static void main(String[] args) throws IOException, 
InterruptedException {
         String[] command = {
                 "C:\\Users\\alpha\\Args.exe",
                 "",
                 "a",
                 "",
                 "b",
                 "",
         };
         var processBuilder = new ProcessBuilder(command);
         processBuilder.redirectOutput(new 
File("C:\\Users\\alpha\\my.log"));
         var process = processBuilder.start();
         Thread.sleep(2_000);
         System.out.println("process.exitValue() = " + process.exitValue());
     }


Here's the log file

argv[0] = [C:\Users\alpha\Args.exe]
argv[1] = []
argv[2] = [a]
argv[3] = []
argv[4] = [b]
argv[5] = []

so empty args seem to work correctly, at least in this plain example.

Have you specific examples that behave incorrectly?
I'm asking because I'd like to setup a simple set of rules to solve the 
issue on Windows altogether.





On 2022-01-28 16:48, Roger Riggs wrote:
> Hi Raffaello,
> 
> For .exe executables, one example is an empty string in the list of 
> arguments to ProcessBuilder.
> The empty string is not visible in the generated command line. For 
> position sensitive commands, it appears the argument is dropped.
> An argument in ProcessBuilder with mismatched quotes can cause the 
> argument to be joined with the next in the generated command line.
> A stray "\" at the end of an argument can cause the following character 
> to be quoted, possibly joining the argument with the next.
> 
> For .cmd executables, cmd.exe interprets more characters as argument 
> separators and will split arguments.
> For example, an argument with a semi-colon or comma, (unquoted) will be 
> split into two arguments when parsed by cmd.exe.
> The goal is to improve the integrity and robustness of the command 
> encoding.
> 
> Thanks, Roger
> 
> 
> On 1/28/22 4:07 AM, Raffaello Giulietti wrote:
>> Hello,
>>
>> if I understand correctly, the issue addressed here (on Windows) is 
>> how to assemble a single command string from an array of argument 
>> strings to pass to CreateProcess() in a way that the individual 
>> argument strings can be fully recovered in the invoked program.
>> Similarly when the command string is passed to an instance of cmd.exe.
>>
>> Are there known (non security critical) examples that do not work 
>> correctly JDK 18 or earlier?
>>
>>
>> Greetings
>> Raffaello
>>
>>
>> On 2022-01-20 19:05, Roger Riggs wrote:
>>> A JEP to Improve safety of process launch by ProcessBuilder and 
>>> Runtime.exec on Windows[1].
>>>
>>> Argument encoding errors have been problematic on Windows systems due to
>>> improperly quoted command arguments.
>>>
>>> The idea is to tighten up quoting and encoding of command line 
>>> arguments.
>>>
>>> Comments appreciated,  Roger
>>>
>>> [1] https://bugs.openjdk.java.net/browse/JDK-8263697
> 


More information about the core-libs-dev mailing list