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>
This commit is contained in:
parent
a46b28808b
commit
2204cc9866
|
@ -172,9 +172,18 @@ public void testReadPipePosixCommandFailure()
|
||||||
FS fs = FS.DETECTED.newInstance();
|
FS fs = FS.DETECTED.newInstance();
|
||||||
assumeTrue(fs instanceof FS_POSIX);
|
assumeTrue(fs instanceof FS_POSIX);
|
||||||
|
|
||||||
String r = FS.readPipe(fs.userHome(),
|
FS.readPipe(fs.userHome(),
|
||||||
new String[] { "bash", "--login", "-c", "foobar" },
|
new String[] { "/bin/sh", "-c", "exit 1" },
|
||||||
Charset.defaultCharset().name());
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -497,7 +497,13 @@ protected static String readPipe(File dir, String[] command,
|
||||||
if (env != null) {
|
if (env != null) {
|
||||||
pb.environment().putAll(env);
|
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();
|
p.getOutputStream().close();
|
||||||
GobblerThread gobbler = new GobblerThread(p, command, dir);
|
GobblerThread gobbler = new GobblerThread(p, command, dir);
|
||||||
gobbler.start();
|
gobbler.start();
|
||||||
|
|
Loading…
Reference in New Issue