8314491: Linux: jexec launched via PATH fails to find java

Reviewed-by: dholmes, rriggs
This commit is contained in:
Vladimir Petko 2023-09-10 23:20:49 +00:00 committed by David Holmes
parent 9a83d55887
commit dab1c213fd
2 changed files with 30 additions and 14 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -168,7 +168,16 @@ int main(int argc, const char * argv[]) {
/* Get the path to the java binary, which is in a known position relative /* Get the path to the java binary, which is in a known position relative
* to our current position, which is in argv[0]. */ * to our current position, which is in argv[0]. */
if (getJavaPath(argv[argi++], java, RELATIVE_DEPTH) != 0) { int error = getJavaPath(argv[argi++], java, RELATIVE_DEPTH);
#ifdef __linux__
/* Try to read the symbolic link to the current binary
* if the java path can not be resolved from argv[0]. */
if (error != 0) {
error = getJavaPath("/proc/self/exe", java, RELATIVE_DEPTH);
}
#endif
if (error != 0) {
errorExit(errno, MISSING_JAVA_MSG); errorExit(errno, MISSING_JAVA_MSG);
} }
alen = (argc + 2) * (sizeof (const char *)); alen = (argc + 2) * (sizeof (const char *));

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -23,14 +23,16 @@
/* /*
* @test * @test
* @bug 8175000 * @bug 8175000 8314491
* @summary test jexec * @summary test jexec
* @requires os.family == "linux"
* @build TestHelper * @build TestHelper
* @run main Jexec * @run main Jexec
*/ */
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
public class Jexec extends TestHelper { public class Jexec extends TestHelper {
private final File testJar; private final File testJar;
@ -54,20 +56,12 @@ public class Jexec extends TestHelper {
} }
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
// linux is the only supported platform, give the others a pass
if (!isLinux) {
System.err.println("Warning: unsupported platform test passes vacuously");
return;
}
// ok to run the test now
Jexec t = new Jexec(); Jexec t = new Jexec();
t.run(null); t.run(null);
} }
@Test private void runTest(String... cmds) throws Exception {
void jexec() throws Exception { TestResult tr = doExec(cmds);
TestResult tr = doExec(jexecCmd.getAbsolutePath(),
testJar.getAbsolutePath(), message);
if (!tr.isOK()) { if (!tr.isOK()) {
System.err.println(tr); System.err.println(tr);
throw new Exception("incorrect exit value"); throw new Exception("incorrect exit value");
@ -77,4 +71,17 @@ public class Jexec extends TestHelper {
throw new Exception("expected message \'" + message + "\' not found"); throw new Exception("expected message \'" + message + "\' not found");
} }
} }
@Test
void jexec() throws Exception {
runTest(jexecCmd.getAbsolutePath(),
testJar.getAbsolutePath(), message);
}
@Test
void jexecInPath() throws Exception {
Path jexec = Path.of(jexecCmd.getAbsolutePath());
runTest("/bin/sh", "-c",
String.format("PATH=%s ; jexec %s '%s'",jexec.getParent(), testJar.getAbsolutePath(), message));
}
} }