From 2204cc986649265fd2748557f05f4521f177fa98 Mon Sep 17 00:00:00 2001 From: Bryan Donlan Date: Mon, 22 May 2017 11:37:14 -0700 Subject: [PATCH] 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 Signed-off-by: Matthias Sohn --- .../tst/org/eclipse/jgit/util/FSTest.java | 15 ++++++++++++--- .../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 4061b5600..2c8273d03 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 void testReadPipePosixCommandFailure() 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 229355c50..1cc39bd46 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 @@ protected static String readPipe(File dir, String[] command, 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();