|
@@ -24,10 +24,12 @@ |
|
|
package jdk.test.lib; |
|
|
|
|
|
import java.io.File; |
|
|
import java.io.FileNotFoundException; |
|
|
import java.io.IOException; |
|
|
import java.io.RandomAccessFile; |
|
|
import java.nio.file.Path; |
|
|
import java.nio.file.Paths; |
|
|
import java.util.concurrent.TimeUnit; |
|
|
import java.util.regex.Pattern; |
|
|
import java.security.AccessController; |
|
|
import java.security.PrivilegedAction; |
|
@@ -231,6 +233,59 @@ public static boolean hasSA() { |
|
|
return true; |
|
|
} |
|
|
|
|
|
/** |
|
|
* Return true if the test JDK is signed, otherwise false. Only valid on OSX. |
|
|
*/ |
|
|
public static boolean isSignedOSX() throws IOException { |
|
|
// We only care about signed binaries for 10.14 and later (actually 10.14.5, but |
|
|
// for simplicity we'll also include earlier 10.14 versions). |
|
|
if (getOsVersionMajor() == 10 && getOsVersionMinor() < 14) { |
|
|
return false; // assume not signed |
|
|
} |
|
|
|
|
|
// Find the path to the java binary. |
|
|
String jdkPath = System.getProperty("java.home"); |
|
|
Path javaPath = Paths.get(jdkPath + "/bin/java"); |
|
|
String javaFileName = javaPath.toAbsolutePath().toString(); |
|
|
if (!javaPath.toFile().exists()) { |
|
|
throw new FileNotFoundException("Could not find file " + javaFileName); |
|
|
} |
|
|
|
|
|
// Run codesign on the java binary. |
|
|
ProcessBuilder pb = new ProcessBuilder("codesign", "-d", "-v", javaFileName); |
|
|
pb.redirectError(ProcessBuilder.Redirect.DISCARD); |
|
|
pb.redirectOutput(ProcessBuilder.Redirect.DISCARD); |
|
|
Process codesignProcess = pb.start(); |
|
|
try { |
|
|
if (codesignProcess.waitFor(10, TimeUnit.SECONDS) == false) { |
|
|
System.err.println("Timed out waiting for the codesign process to complete. Assuming not signed."); |
|
|
codesignProcess.destroyForcibly(); |
|
|
return false; // assume not signed |
|
|
} |
|
|
} catch (InterruptedException e) { |
|
|
throw new RuntimeException(e); |
|
|
} |
|
|
|
|
|
// Check codesign result to see if java binary is signed. Here are the |
|
|
// exit code meanings: |
|
|
// 0: signed |
|
|
// 1: not signed |
|
|
// 2: invalid arguments |
|
|
// 3: only has meaning with the -R argument. |
|
|
// So we should always get 0 or 1 as an exit value. |
|
|
if (codesignProcess.exitValue() == 0) { |
|
|
System.out.println("Target JDK is signed. Some tests may be skipped."); |
|
|
return true; // signed |
|
|
} else if (codesignProcess.exitValue() == 1) { |
|
|
System.out.println("Target JDK is not signed."); |
|
|
return false; // not signed |
|
|
} else { |
|
|
System.err.println("Executing codesign failed. Assuming unsigned: " + |
|
|
codesignProcess.exitValue()); |
|
|
return false; // not signed |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* Return a boolean for whether we expect to be able to attach |
|
|
* the SA to our own processes on this system. This requires |
|
@@ -241,7 +296,7 @@ public static boolean shouldSAAttach() throws IOException { |
|
|
if (isLinux()) { |
|
|
return canPtraceAttachLinux(); |
|
|
} else if (isOSX()) { |
|
|
return canAttachOSX(); |
|
|
return canAttachOSX() && !isSignedOSX(); |
|
|
} else { |
|
|
// Other platforms expected to work: |
|
|
return true; |
|
|