diff options
author | Bryan Donlan <bdonlan@gmail.com> | 2017-05-22 11:37:14 -0700 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2017-05-24 23:35:39 +0200 |
commit | 2204cc986649265fd2748557f05f4521f177fa98 (patch) | |
tree | 7b5eb7432d277553748ce2b62a24d6ae47dc661b | |
parent | a46b28808b303d326eb79c7a42aec0147e171a39 (diff) | |
download | jgit-2204cc986649265fd2748557f05f4521f177fa98.tar.gz jgit-2204cc986649265fd2748557f05f4521f177fa98.zip |
Fix null return from FS.readPipe when command fails to launch
When a command invoked from readPipe fails to launch (i.e. the exec call
fails due to a missing command executable), Process.start() throws,
which gets caught by the generic IOException handler, resulting in a
null return. This change detects this case and rethrows a
CommandFailedException instead.
Additionally, this change uses /bin/sh instead of bash for its posix
command failure test, to accomodate building in environments where bash
is unavailable.
Change-Id: Ifae51e457e5718be610c0a0914b18fe35ea7b008
Signed-off-by: Bryan Donlan <bdonlan@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java | 15 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java | 8 |
2 files changed, 19 insertions, 4 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java index 4061b5600b..2c8273d03c 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java @@ -172,9 +172,18 @@ public class FSTest { FS fs = FS.DETECTED.newInstance(); assumeTrue(fs instanceof FS_POSIX); - String r = FS.readPipe(fs.userHome(), - new String[] { "bash", "--login", "-c", "foobar" }, + FS.readPipe(fs.userHome(), + new String[] { "/bin/sh", "-c", "exit 1" }, Charset.defaultCharset().name()); - System.out.println(r); + } + + @Test(expected = CommandFailedException.class) + public void testReadPipeCommandStartFailure() + throws CommandFailedException { + FS fs = FS.DETECTED.newInstance(); + + FS.readPipe(fs.userHome(), + new String[] { "this-command-does-not-exist" }, + Charset.defaultCharset().name()); } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java index 229355c50a..1cc39bd46c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -497,7 +497,13 @@ public abstract class FS { if (env != null) { pb.environment().putAll(env); } - Process p = pb.start(); + Process p; + try { + p = pb.start(); + } catch (IOException e) { + // Process failed to start + throw new CommandFailedException(-1, e.getMessage(), e); + } p.getOutputStream().close(); GobblerThread gobbler = new GobblerThread(p, command, dir); gobbler.start(); |