timja / jenkins-gh-issues-poc-06-18

0 stars 0 forks source link

[JENKINS-59844] Process Launcher shouldn't throw ArrayIndexOutOfBoundException on empty command #4644

Open timja opened 4 years ago

timja commented 4 years ago

If you try to launch a blank command  ('  ') using Launch.ProcStarter#cmdAsSingleString, an ArrayIndexOutOfBoundException is thrown.

Example of command invocation:

launcher.launch()
    .cmdAsSingleString("   ")
    .envs(computer.getEnvironment())
    .readStdout()
    .pwd(rootPath)
    .start();

Exception thrown:

java.lang.ArrayIndexOutOfBoundsException: 0
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1014)
    at hudson.Proc$LocalProc.(Proc.java:249)
    at hudson.Proc$LocalProc.(Proc.java:218)
    at hudson.Launcher$LocalLauncher.launch(Launcher.java:930)
    at hudson.Launcher$ProcStarter.start(Launcher.java:450)
    at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:1299)
    at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:1260)
    at hudson.remoting.UserRequest.perform(UserRequest.java:205)
    at hudson.remoting.UserRequest.perform(UserRequest.java:52)
    at hudson.remoting.Request$2.run(Request.java:356)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

This exception is odd, and difficult to understand. In my understanding, the cause of the error (invalid command) should be more clear, and ideally, validated sooner.


Originally reported by ealvarez, imported from: Process Launcher shouldn't throw ArrayIndexOutOfBoundException on empty command
  • status: Reopened
  • priority: Minor
  • resolution: Unresolved
  • imported: 2022/01/10
timja commented 4 years ago

dishitd:

Hi - I will like to work on this. However, I am unable to reporduce the issue. Can you please provide the steps to reproduce?

timja commented 4 years ago

ealvarez:

Here you have a test to reproduce it:

https://github.com/EstherAF/jenkins/commit/198e0a22c326f7d5a1c130deb56063592e646d41

timja commented 4 years ago

mramonleon:

dishitd I've been working on it for a while. Are you fine if I take care of it?

timja commented 4 years ago

dishitd:

Sure go ahead

timja commented 4 years ago

mramonleon:

The documentation of the ProcessBuilder class specified that the start method will return an IndexOutOfBoundsException if the command is the empty string, see the documentation here: https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html#start--

IndexOutOfBoundsException - if the command is an empty list (has size 0)

So the behavior is the expected. The code sending this command is the one in charge to avoid that or capture the exception properly.

I will close this ticket becase as it is described, there is nothing to do generally.

timja commented 4 years ago

mramonleon:

Not sure about the right final status of the ticket

timja commented 4 years ago

ealvarez:

If this exception is expected, it is my understanding that its meaning should be documented, to allow the client to proactively check this failing condition.

timja commented 4 years ago

mramonleon:

It's documented: https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html#start--

timja commented 4 years ago

ealvarez:

After talking with mramonleon, we agreed that:

The objective is to make clearer the cause of this exception, so the least risky solution is:

I'm creating a PR with these little changes