Update to upstream version 1.12.0

Resolves: rhbz#1880669
This commit is contained in:
Marian Koncek 2021-11-09 12:43:55 +01:00
parent e755375210
commit 38aa4250f8
5 changed files with 366 additions and 451 deletions

View File

@ -1,6 +1,6 @@
From ceca0b287ac211a968e84cee7f05cfd6c2a843ec Mon Sep 17 00:00:00 2001
From 395fcc56d403d0625fe4930af4b2b772b0958fe1 Mon Sep 17 00:00:00 2001
From: Marian Koncek <mkoncek@redhat.com>
Date: Tue, 29 Sep 2020 14:46:16 +0200
Date: Tue, 9 Nov 2021 11:55:22 +0100
Subject: [PATCH] Avoid bundling asm
---
@ -8,7 +8,7 @@ Subject: [PATCH] Avoid bundling asm
1 file changed, 15 insertions(+), 55 deletions(-)
diff --git a/byte-buddy/pom.xml b/byte-buddy/pom.xml
index 16388f3..c97b4d9 100644
index 403f684..0d1d98c 100644
--- a/byte-buddy/pom.xml
+++ b/byte-buddy/pom.xml
@@ -26,8 +26,6 @@
@ -17,7 +17,7 @@ index 16388f3..c97b4d9 100644
<properties>
- <shade.source>org.objectweb.asm</shade.source>
- <shade.target>net.bytebuddy.jar.asm</shade.target>
<packages.list>
<packages.list.external>
net.bytebuddy,
net.bytebuddy.agent.builder,
@@ -62,9 +60,6 @@
@ -27,27 +27,10 @@ index 16388f3..c97b4d9 100644
- ${shade.target},
- ${shade.target}.signature,
- ${shade.target}.commons
</packages.list>
</properties>
@@ -79,6 +74,16 @@
<artifactId>byte-buddy-dep</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm</artifactId>
+ <version>${version.asm}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-commons</artifactId>
+ <version>${version.asm}</version>
+ </dependency>
</dependencies>
<build>
@@ -105,44 +110,6 @@
</packages.list.external>
<packages.list.internal>
net.bytebuddy.utility.dispatcher
@@ -120,44 +115,6 @@
<createDependencyReducedPom>true</createDependencyReducedPom>
<createSourcesJar>${bytebuddy.extras}</createSourcesJar>
<shadeSourcesContent>true</shadeSourcesContent>
@ -92,7 +75,7 @@ index 16388f3..c97b4d9 100644
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>net.bytebuddy.build.Plugin$Engine$Default</mainClass>
@@ -151,21 +118,14 @@
@@ -166,21 +123,14 @@
<resource>META-INF/LICENSE</resource>
</transformer>
</transformers>
@ -119,6 +102,23 @@ index 16388f3..c97b4d9 100644
</plugin>
<!-- Disable pitest as it fails for empty modules -->
<plugin>
@@ -243,6 +193,16 @@
<artifactId>asm</artifactId>
<version>${version.asm}</version>
</dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm</artifactId>
+ <version>${version.asm}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-commons</artifactId>
+ <version>${version.asm}</version>
+ </dependency>
</dependencies>
<executions>
<execution>
--
2.26.2
2.31.1

View File

@ -1,14 +1,15 @@
From 4dcae48a47d1c2123d5ec86f3e2d6ef1adab8a83 Mon Sep 17 00:00:00 2001
From c54cc280a38d05ffe93a1af6922afcefe4d0cf71 Mon Sep 17 00:00:00 2001
From: Marian Koncek <mkoncek@redhat.com>
Date: Wed, 30 Sep 2020 13:04:45 +0200
Subject: [PATCH] Remove dependency on jna
Date: Mon, 1 Nov 2021 12:51:02 +0100
Subject: [PATCH] Remove dependencies
---
.../net/bytebuddy/agent/VirtualMachine.java | 2275 +++--------------
1 file changed, 357 insertions(+), 1918 deletions(-)
.../net/bytebuddy/agent/VirtualMachine.java | 1978 +----------------
.../dynamic/loading/ClassInjector.java | 104 +-
2 files changed, 2 insertions(+), 2080 deletions(-)
diff --git a/byte-buddy-agent/src/main/java/net/bytebuddy/agent/VirtualMachine.java b/byte-buddy-agent/src/main/java/net/bytebuddy/agent/VirtualMachine.java
index 245581d..80cab63 100644
index 32fe7d1fad..795d648512 100644
--- a/byte-buddy-agent/src/main/java/net/bytebuddy/agent/VirtualMachine.java
+++ b/byte-buddy-agent/src/main/java/net/bytebuddy/agent/VirtualMachine.java
@@ -15,13 +15,6 @@
@ -25,7 +26,24 @@ index 245581d..80cab63 100644
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
@@ -227,23 +220,6 @@ public interface VirtualMachine {
@@ -149,15 +142,7 @@ public interface VirtualMachine {
* {@inheritDoc}
*/
public Class<? extends VirtualMachine> run() {
- try {
- Class.forName("com.sun.jna.Platform");
- } catch (ClassNotFoundException exception) {
- throw new IllegalStateException("Optional JNA dependency is not available", exception);
- }
- return System.getProperty("java.vm.name", "").toUpperCase(Locale.US).contains("J9")
- ? ForOpenJ9.class
- : ForHotSpot.class;
-
+ throw new IllegalStateException("Optional JNA dependency is not available");
}
}
@@ -227,23 +212,6 @@ public interface VirtualMachine {
this.connection = connection;
}
@ -49,7 +67,7 @@ index 245581d..80cab63 100644
/**
* Attaches to the supplied process id using the supplied connection factory.
*
@@ -515,7 +491,6 @@ public interface VirtualMachine {
@@ -515,7 +483,6 @@ public interface VirtualMachine {
/**
* {@inheritDoc}
*/
@ -57,40 +75,26 @@ index 245581d..80cab63 100644
public Connection connect(String processId) throws IOException {
File socket = new File(temporaryDirectory, SOCKET_FILE_PREFIX + processId);
if (!socket.exists()) {
@@ -679,1949 +654,413 @@ public interface VirtualMachine {
@@ -679,1949 +646,6 @@ public interface VirtualMachine {
*/
protected abstract int read(T connection, byte[] buffer) throws IOException;
}
+ }
+ }
-
- /**
- * Implements a connection for a Posix socket in JNA.
- */
- class ForJnaPosixSocket extends OnPersistentByteChannel<Integer> {
+ /**
+ * A virtual machine attachment implementation for OpenJ9 or any compatible JVM.
+ */
+ class ForOpenJ9 extends AbstractBase {
-
- /**
- * The JNA library to use.
- */
- private final PosixLibrary library;
+ /**
+ * The temporary folder for attachment files for OpenJ9 VMs.
+ */
+ private static final String IBM_TEMPORARY_FOLDER = "com.ibm.tools.attach.directory";
-
- /**
- * The POSIX socket.
- */
- private final File socket;
+ /**
+ * The socket on which this VM and the target VM communicate.
+ */
+ private final Socket socket;
-
- /**
- * Creates a connection for a virtual posix socket implemented in JNA.
- *
@ -101,39 +105,13 @@ index 245581d..80cab63 100644
- this.library = library;
- this.socket = socket;
- }
+ /**
+ * Creates a new virtual machine connection for OpenJ9.
+ *
+ * @param socket The socket on which this VM and the target VM communicate.
+ */
+ protected ForOpenJ9(Socket socket) {
+ this.socket = socket;
+ }
-
- @Override
- protected Integer connect() {
- int handle = library.socket(1, 1, 0);
+ /**
+ * Attaches to the supplied process id.
+ *
+ * @param processId The process id.
+ * @param timeout The timeout for establishing the socket connection.
+ * @param dispatcher The connector to use to communicate with the target VM.
+ * @return A suitable virtual machine implementation.
+ * @throws IOException If an IO exception occurs during establishing the connection.
+ */
+ public static VirtualMachine attach(String processId, int timeout, Dispatcher dispatcher) throws IOException {
+ File directory = new File(System.getProperty(IBM_TEMPORARY_FOLDER, dispatcher.getTemporaryFolder()), ".com_ibm_tools_attach");
+ RandomAccessFile attachLock = new RandomAccessFile(new File(directory, "_attachlock"), "rw");
+ try {
+ FileLock attachLockLock = attachLock.getChannel().lock();
+ try {
+ List<Properties> virtualMachines;
+ RandomAccessFile master = new RandomAccessFile(new File(directory, "_master"), "rw");
try {
- try {
- PosixLibrary.SocketAddress address = new PosixLibrary.SocketAddress();
+ FileLock masterLock = master.getChannel().lock();
try {
- try {
- address.setPath(socket.getAbsolutePath());
- library.connect(handle, address, address.size());
- return handle;
@ -265,10 +243,7 @@ index 245581d..80cab63 100644
- System.arraycopy(new byte[]{0}, 0, this.path, path.length(), 1);
- } catch (UnsupportedEncodingException exception) {
- throw new IllegalStateException(exception);
+ File[] vmFolder = directory.listFiles();
+ if (vmFolder == null) {
+ throw new IllegalStateException("No descriptor files found in " + directory);
}
- }
- }
-
- @Override
@ -323,54 +298,13 @@ index 245581d..80cab63 100644
- temporaryDirectory = "/tmp";
- } else {
- temporaryDirectory = memory.getString(0);
+ long userId = dispatcher.userId();
+ virtualMachines = new ArrayList<Properties>();
+ for (File aVmFolder : vmFolder) {
+ if (aVmFolder.isDirectory() && dispatcher.getOwnerIdOf(aVmFolder) == userId) {
+ File attachInfo = new File(aVmFolder, "attachInfo");
+ if (attachInfo.isFile()) {
+ Properties virtualMachine = new Properties();
+ FileInputStream inputStream = new FileInputStream(attachInfo);
+ try {
+ virtualMachine.load(inputStream);
+ } finally {
+ inputStream.close();
+ }
+ int targetProcessId = Integer.parseInt(virtualMachine.getProperty("processId"));
+ long targetUserId;
+ try {
+ targetUserId = Long.parseLong(virtualMachine.getProperty("userUid"));
+ } catch (NumberFormatException ignored) {
+ targetUserId = 0L;
+ }
+ if (userId != 0L && targetUserId == 0L) {
+ targetUserId = dispatcher.getOwnerIdOf(attachInfo);
+ }
+ if (targetProcessId == 0L || dispatcher.isExistingProcess(targetProcessId)) {
+ virtualMachines.add(virtualMachine);
+ } else if (userId == 0L || targetUserId == userId) {
+ File[] vmFile = aVmFolder.listFiles();
+ if (vmFile != null) {
+ for (File aVmFile : vmFile) {
+ if (!aVmFile.delete()) {
+ aVmFile.deleteOnExit();
+ }
+ }
+ }
+ if (!aVmFolder.delete()) {
+ aVmFolder.deleteOnExit();
+ }
+ }
+ }
}
- }
- } finally {
- memory = null;
}
- }
- } else {
- temporaryDirectory = "/tmp";
+ } finally {
+ masterLock.release();
}
- }
- return new Factory(temporaryDirectory, attempts, pause, timeUnit);
- }
-
@ -403,9 +337,7 @@ index 245581d..80cab63 100644
- * @return The amount of bytes written to the buffer.
- */
- long confstr(int name, Pointer buffer, long length);
+ } finally {
+ master.close();
}
- }
- }
- }
-
@ -471,13 +403,7 @@ index 245581d..80cab63 100644
- throw new IllegalArgumentException("Unknown protocol version: " + protocol);
- } else if (argument.length > 4) {
- throw new IllegalArgumentException("Cannot supply more then four arguments to Windows attach mechanism: " + Arrays.asList(argument));
+ Properties target = null;
+ for (Properties virtualMachine : virtualMachines) {
+ if (virtualMachine.getProperty("processId").equalsIgnoreCase(processId)) {
+ target = virtualMachine;
+ break;
+ }
}
- }
- String name = "\\\\.\\pipe\\javatool" + Math.abs(random.nextInt() + 1);
- WinNT.HANDLE pipe = Kernel32.INSTANCE.CreateNamedPipe(name,
- WinBase.PIPE_ACCESS_INBOUND,
@ -489,11 +415,8 @@ index 245581d..80cab63 100644
- null);
- if (pipe == null) {
- throw new Win32Exception(Native.getLastError());
+ if (target == null) {
+ throw new IllegalStateException("Could not locate target process info in " + directory);
}
+ ServerSocket serverSocket = new ServerSocket(0);
try {
- }
- try {
- WinDef.LPVOID data = attachLibrary.allocate_remote_argument(process,
- name,
- argument.length < 1 ? null : argument[0],
@ -503,19 +426,12 @@ index 245581d..80cab63 100644
- if (data == null) {
- throw new Win32Exception(Native.getLastError());
- }
+ serverSocket.setSoTimeout(timeout);
+ File receiver = new File(directory, target.getProperty("vmId"));
+ String key = Long.toHexString(new SecureRandom().nextLong());
+ File reply = new File(receiver, "replyInfo");
try {
- try {
- WinNT.HANDLE thread = library.CreateRemoteThread(process, null, 0, code.getPointer(), data.getPointer(), null, null);
- if (thread == null) {
- throw new Win32Exception(Native.getLastError());
+ if (reply.createNewFile()) {
+ dispatcher.setPermissions(reply, 0600);
}
+ FileOutputStream outputStream = new FileOutputStream(reply);
try {
- }
- try {
- int result = Kernel32.INSTANCE.WaitForSingleObject(thread, WinBase.INFINITE);
- if (result != 0) {
- throw new Win32Exception(result);
@ -524,7 +440,7 @@ index 245581d..80cab63 100644
- if (!library.GetExitCodeThread(thread, exitCode)) {
- throw new Win32Exception(Native.getLastError());
- } else if (exitCode.getValue() != 0) {
- throw new IllegalStateException("Target could not dispatch command successfully");
- throw new IllegalStateException("Target VM could not dispatch command successfully: " + exitCode.getValue());
- }
- if (!Kernel32.INSTANCE.ConnectNamedPipe(pipe, null)) {
- int code = Native.getLastError();
@ -533,11 +449,7 @@ index 245581d..80cab63 100644
- }
- }
- return new NamedPipeResponse(pipe);
+ outputStream.write(key.getBytes("UTF-8"));
+ outputStream.write("\n".getBytes("UTF-8"));
+ outputStream.write(Long.toString(serverSocket.getLocalPort()).getBytes("UTF-8"));
+ outputStream.write("\n".getBytes("UTF-8"));
} finally {
- } finally {
- if (!Kernel32.INSTANCE.CloseHandle(thread)) {
- throw new Win32Exception(Native.getLastError());
- }
@ -545,8 +457,7 @@ index 245581d..80cab63 100644
- } finally {
- if (!library.VirtualFreeEx(process, data.getPointer(), 0, MEM_RELEASE)) {
- throw new Win32Exception(Native.getLastError());
+ outputStream.close();
}
- }
- }
- } catch (Throwable throwable) {
- if (!Kernel32.INSTANCE.CloseHandle(pipe)) {
@ -1545,8 +1456,7 @@ index 245581d..80cab63 100644
- boolean exited = false;
- String line = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")).readLine();
- do {
+ Map<RandomAccessFile, FileLock> locks = new HashMap<RandomAccessFile, FileLock>();
try {
- try {
- if (process.exitValue() != 0) {
- throw new IllegalStateException("Error while executing stat");
- }
@ -1558,20 +1468,7 @@ index 245581d..80cab63 100644
- } catch (InterruptedException exception) {
- Thread.currentThread().interrupt();
- throw new IllegalStateException(exception);
+ String pid = Long.toString(dispatcher.pid());
+ for (Properties virtualMachine : virtualMachines) {
+ if (!virtualMachine.getProperty("processId").equalsIgnoreCase(pid)) {
+ String attachNotificationSync = virtualMachine.getProperty("attachNotificationSync");
+ RandomAccessFile syncFile = new RandomAccessFile(attachNotificationSync == null
+ ? new File(directory, "attachNotificationSync")
+ : new File(attachNotificationSync), "rw");
+ try {
+ locks.put(syncFile, syncFile.getChannel().lock());
+ } catch (IOException ignored) {
+ syncFile.close();
+ }
+ }
}
- }
- }
- } while (--attempts > 0);
- if (!exited) {
@ -1631,19 +1528,7 @@ index 245581d..80cab63 100644
- break;
- } else {
- throw exception;
+ int notifications = 0;
+ File[] item = directory.listFiles();
+ if (item != null) {
+ for (File anItem : item) {
+ String name = anItem.getName();
+ if (!name.startsWith(".trash_")
+ && !name.equalsIgnoreCase("_attachlock")
+ && !name.equalsIgnoreCase("_master")
+ && !name.equalsIgnoreCase("_notifier")) {
+ notifications += 1;
+ }
+ }
}
- }
- }
- }
- } finally {
@ -1933,22 +1818,10 @@ index 245581d..80cab63 100644
- mutex = library.OpenMutex(WinNT.STANDARD_RIGHTS_REQUIRED | WinNT.SYNCHRONIZE | 0x0001, false, CREATION_MUTEX_NAME);
- if (mutex == null) {
- throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
+ boolean global = Boolean.parseBoolean(target.getProperty("globalSemaphore"));
+ dispatcher.incrementSemaphore(directory, "_notifier", global, notifications);
+ try {
+ Socket socket = serverSocket.accept();
+ String answer = new String(read(socket), "UTF-8");
+ if (answer.contains(' ' + key + ' ')) {
+ return new ForOpenJ9(socket);
+ } else {
+ socket.close();
+ throw new IllegalStateException("Unexpected answered to attachment: " + answer);
}
- }
- } else {
- throw new Win32Exception(lastError);
+ } finally {
+ dispatcher.decrementSemaphore(directory, "_notifier", global, notifications);
}
- }
- }
- int result = Kernel32.INSTANCE.WaitForSingleObject(mutex, 2000);
- switch (result) {
@ -1956,9 +1829,7 @@ index 245581d..80cab63 100644
- case WinError.WAIT_TIMEOUT:
- throw new Win32Exception(result);
- default:
+ } finally {
+ for (Map.Entry<RandomAccessFile, FileLock> entry : locks.entrySet()) {
try {
- try {
- String target = (global ? "Global\\" : "")
- + (directory.getAbsolutePath() + '_' + name).replaceAll("[^a-zA-Z0-9_]", "")
- + "_semaphore";
@ -1983,62 +1854,27 @@ index 245581d..80cab63 100644
- } finally {
- if (!library.ReleaseMutex(mutex)) {
- throw new Win32Exception(Native.getLastError());
+ try {
+ entry.getValue().release();
+ } finally {
+ entry.getKey().close();
}
+ } catch (Throwable ignored) {
+ /* do nothing */
}
+ }
}
} finally {
- }
- }
- }
- } finally {
- securityAttributes = null;
+ if (!reply.delete()) {
+ reply.deleteOnExit();
+ }
}
} finally {
- }
- } finally {
- securityDescriptor = null;
+ serverSocket.close();
}
+ } finally {
+ attachLockLock.release();
}
+ } finally {
+ attachLock.close();
+ }
+ }
- }
- }
-
- /**
- * A library for interacting with Windows.
- */
- protected interface WindowsLibrary extends StdCallLibrary {
+ /**
+ * {@inheritDoc}
+ */
+ public Properties getSystemProperties() throws IOException {
+ write(socket, "ATTACH_GETSYSTEMPROPERTIES".getBytes("UTF-8"));
+ Properties properties = new Properties();
+ properties.load(new ByteArrayInputStream(read(socket)));
+ return properties;
+ }
-
- /**
- * Indicates that a semaphore requires all access rights.
- */
- int SEMAPHORE_ALL_ACCESS = 0x1F0003;
+ /**
+ * {@inheritDoc}
+ */
+ public Properties getAgentProperties() throws IOException {
+ write(socket, "ATTACH_GETAGENTPROPERTIES".getBytes("UTF-8"));
+ Properties properties = new Properties();
+ properties.load(new ByteArrayInputStream(read(socket)));
+ return properties;
+ }
-
- /**
- * Opens an existing semaphore.
- *
@ -2049,19 +1885,7 @@ index 245581d..80cab63 100644
- */
- @SuppressWarnings("checkstyle:methodname")
- WinNT.HANDLE OpenSemaphoreW(int access, boolean inheritHandle, String name);
+ /**
+ * {@inheritDoc}
+ */
+ public void loadAgent(String jarFile, String argument) throws IOException {
+ write(socket, ("ATTACH_LOADAGENT(instrument," + jarFile + '=' + (argument == null ? "" : argument) + ')').getBytes("UTF-8"));
+ String answer = new String(read(socket), "UTF-8");
+ if (answer.startsWith("ATTACH_ERR")) {
+ throw new IllegalStateException("Target VM failed loading agent: " + answer);
+ } else if (!answer.startsWith("ATTACH_ACK") && !answer.startsWith("ATTACH_RESULT=")) {
+ throw new IllegalStateException("Unexpected response: " + answer);
+ }
+ }
-
- /**
- * Creates a new semaphore.
- *
@ -2073,19 +1897,7 @@ index 245581d..80cab63 100644
- */
- @SuppressWarnings("checkstyle:methodname")
- WinNT.HANDLE CreateSemaphoreW(WinBase.SECURITY_ATTRIBUTES securityAttributes, long count, long maximumCount, String name);
+ /**
+ * {@inheritDoc}
+ */
+ public void loadAgentPath(String path, String argument) throws IOException {
+ write(socket, ("ATTACH_LOADAGENTPATH(" + path + (argument == null ? "" : (',' + argument)) + ')').getBytes("UTF-8"));
+ String answer = new String(read(socket), "UTF-8");
+ if (answer.startsWith("ATTACH_ERR")) {
+ throw new IllegalStateException("Target VM failed loading native agent: " + answer);
+ } else if (!answer.startsWith("ATTACH_ACK") && !answer.startsWith("ATTACH_RESULT=")) {
+ throw new IllegalStateException("Unexpected response: " + answer);
+ }
+ }
-
- /**
- * Releases the semaphore.
- *
@ -2096,19 +1908,7 @@ index 245581d..80cab63 100644
- */
- @SuppressWarnings("checkstyle:methodname")
- boolean ReleaseSemaphore(WinNT.HANDLE handle, long count, Long previousCount);
+ /**
+ * {@inheritDoc}
+ */
+ public void loadAgentLibrary(String library, String argument) throws IOException {
+ write(socket, ("ATTACH_LOADAGENTLIBRARY(" + library + (argument == null ? "" : (',' + argument)) + ')').getBytes("UTF-8"));
+ String answer = new String(read(socket), "UTF-8");
+ if (answer.startsWith("ATTACH_ERR")) {
+ throw new IllegalStateException("Target VM failed loading native library: " + answer);
+ } else if (!answer.startsWith("ATTACH_ACK") && !answer.startsWith("ATTACH_RESULT=")) {
+ throw new IllegalStateException("Unexpected response: " + answer);
+ }
+ }
-
- /**
- * Create or opens a mutex.
- *
@ -2119,22 +1919,7 @@ index 245581d..80cab63 100644
- */
- @SuppressWarnings("checkstyle:methodname")
- WinNT.HANDLE CreateMutex(SecurityAttributes attributes, boolean owner, String name);
+ /**
+ * {@inheritDoc}
+ */
+ public void startManagementAgent(Properties properties) throws IOException {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ properties.store(outputStream, null);
+ write(socket, "ATTACH_START_MANAGEMENT_AGENT".getBytes("UTF-8"));
+ write(socket, outputStream.toByteArray());
+ String answer = new String(read(socket), "UTF-8");
+ if (answer.startsWith("ATTACH_ERR")) {
+ throw new IllegalStateException("Target VM could not start management agent: " + answer);
+ } else if (!answer.startsWith("ATTACH_ACK") && !answer.startsWith("ATTACH_RESULT=")) {
+ throw new IllegalStateException("Unexpected response: " + answer);
+ }
+ }
-
- /**
- * Opens an existing object.
- *
@ -2145,23 +1930,7 @@ index 245581d..80cab63 100644
- */
- @SuppressWarnings("checkstyle:methodname")
- WinNT.HANDLE OpenMutex(int access, boolean inherit, String name);
+ /**
+ * {@inheritDoc}
+ */
+ public String startLocalManagementAgent() throws IOException {
+ write(socket, "ATTACH_START_LOCAL_MANAGEMENT_AGENT".getBytes("UTF-8"));
+ String answer = new String(read(socket), "UTF-8");
+ if (answer.startsWith("ATTACH_ERR")) {
+ throw new IllegalStateException("Target VM could not start management agent: " + answer);
+ } else if (answer.startsWith("ATTACH_ACK")) {
+ return answer.substring("ATTACH_ACK".length());
+ } else if (answer.startsWith("ATTACH_RESULT=")) {
+ return answer.substring("ATTACH_RESULT=".length());
+ } else {
+ throw new IllegalStateException("Unexpected response: " + answer);
+ }
+ }
-
- /**
- * Releases the supplied mutex.
- *
@ -2170,18 +1939,7 @@ index 245581d..80cab63 100644
- */
- @SuppressWarnings("checkstyle:methodname")
- boolean ReleaseMutex(WinNT.HANDLE handle);
+ /**
+ * {@inheritDoc}
+ */
+ public void detach() throws IOException {
+ try {
+ write(socket, "ATTACH_DETACH".getBytes("UTF-8"));
+ read(socket); // The answer is intentionally ignored.
+ } finally {
+ socket.close();
+ }
+ }
-
- /**
- * A structure representing a mutex's security attributes.
- */
@ -2209,72 +1967,23 @@ index 245581d..80cab63 100644
- return Arrays.asList("length", "securityDescriptor", "inherit");
- }
- }
+ /**
+ * Writes the supplied value to the target socket.
+ *
+ * @param socket The socket to write to.
+ * @param value The value being written.
+ * @throws IOException If an I/O exception occurs.
+ */
+ private static void write(Socket socket, byte[] value) throws IOException {
+ socket.getOutputStream().write(value);
+ socket.getOutputStream().write(0);
+ socket.getOutputStream().flush();
+ }
+
+ /**
+ * Reads a {@code '\0'}-terminated value from the target socket.
+ *
+ * @param socket The socket to read from.
+ * @return The value that was read.
+ * @throws IOException If an I/O exception occurs.
+ */
+ private static byte[] read(Socket socket) throws IOException {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = socket.getInputStream().read(buffer)) != -1) {
+ if (length > 0 && buffer[length - 1] == 0) {
+ outputStream.write(buffer, 0, length - 1);
+ break;
+ } else {
+ outputStream.write(buffer, 0, length);
}
+ }
+ return outputStream.toByteArray();
+ }
- }
-
- /**
- * A handle for an attachment which is represented by a pair of handles.
- */
- protected static class AttachmentHandle implements Closeable {
+ /**
+ * A dispatcher for native operations being used for communication with an OpenJ9 virtual machine.
+ */
+ public interface Dispatcher {
-
- /**
- * The parent handle.
- */
- private final WinNT.HANDLE parent;
+ /**
+ * Returns this machine's temporary folder.
+ *
+ * @return The temporary folder.
+ */
+ String getTemporaryFolder();
-
- /**
- * The child handle.
- */
- private final WinNT.HANDLE child;
+ /**
+ * Returns the process id of this process.
+ *
+ * @return The process id of this process.
+ */
+ int pid();
-
- /**
- * Creates a new attachment handle.
- *
@ -2285,13 +1994,7 @@ index 245581d..80cab63 100644
- this.parent = parent;
- this.child = child;
- }
+ /**
+ * Returns the user id of this process.
+ *
+ * @return The user id of this process
+ */
+ int userId();
-
- /**
- * Returns the handle on which signals are to be sent.
- *
@ -2300,14 +2003,7 @@ index 245581d..80cab63 100644
- protected WinNT.HANDLE getHandle() {
- return child;
- }
+ /**
+ * Returns {@code true} if the supplied process id is a running process.
+ *
+ * @param processId The process id to evaluate.
+ * @return {@code true} if the supplied process id is currently running.
+ */
+ boolean isExistingProcess(int processId);
-
- /**
- * {@inheritDoc}
- */
@ -2326,44 +2022,198 @@ index 245581d..80cab63 100644
- }
- }
- }
+ /**
+ * Returns the user id of the owner of the supplied file.
+ *
+ * @param file The file for which to locate the owner.
+ * @return The owner id of the supplied file.
+ */
+ int getOwnerIdOf(File file);
+
+ /**
+ * Sets permissions for the supplied file.
+ *
+ * @param file The file for which to set the permissions.
+ * @param permissions The permission bits to set.
+ */
+ void setPermissions(File file, int permissions);
+
+ /**
+ * Increments a semaphore.
+ *
+ * @param directory The sempahore's control directory.
+ * @param name The semaphore's name.
+ * @param global {@code true} if the semaphore is in the global namespace (only applicable on Windows).
+ * @param count The amount of increments.
+ */
+ void incrementSemaphore(File directory, String name, boolean global, int count);
+
+ /**
+ * Decrements a semaphore.
+ *
+ * @param directory The sempahore's control directory.
+ * @param name The semaphore's name.
+ * @param global {@code true} if the semaphore is in the global namespace (only applicable on Windows).
+ * @param count The amount of decrements.
+ */
+ void decrementSemaphore(File directory, String name, boolean global, int count);
}
}
}
diff --git a/byte-buddy-dep/src/main/java/net/bytebuddy/dynamic/loading/ClassInjector.java b/byte-buddy-dep/src/main/java/net/bytebuddy/dynamic/loading/ClassInjector.java
index 279b6497d2..a63ce63d5c 100644
--- a/byte-buddy-dep/src/main/java/net/bytebuddy/dynamic/loading/ClassInjector.java
+++ b/byte-buddy-dep/src/main/java/net/bytebuddy/dynamic/loading/ClassInjector.java
@@ -15,8 +15,6 @@
*/
package net.bytebuddy.dynamic.loading;
-import com.sun.jna.*;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.asm.MemberRemoval;
@@ -507,7 +505,6 @@ public interface ClassInjector {
/**
* {@inheritDoc}
*/
- @SuppressFBWarnings(value = "REC_CATCH_EXCEPTION", justification = "Exception should not be rethrown but trigger a fallback")
public Initializable run() {
try {
if (JavaModule.isSupported()) {
@@ -583,7 +580,6 @@ public interface ClassInjector {
* @return A direct dispatcher for class injection.
* @throws Exception If the creation is impossible.
*/
- @SuppressFBWarnings(value = "DP_DO_INSIDE_DO_PRIVILEGED", justification = "Privilege is explicit caller responsibility")
protected static Initializable make() throws Exception {
Method getDefinedPackage;
if (JavaModule.isSupported()) { // Avoid accidental lookup of method with same name in Java 8 J9 VM.
@@ -888,7 +884,6 @@ public interface ClassInjector {
* @return An indirect dispatcher for class creation.
* @throws Exception If the dispatcher cannot be created.
*/
- @SuppressFBWarnings(value = "DP_DO_INSIDE_DO_PRIVILEGED", justification = "Privilege is explicit caller responsibility")
protected static Initializable make() throws Exception {
if (Boolean.getBoolean(UsingUnsafe.SAFE_PROPERTY)) {
return new Initializable.Unavailable("Use of Unsafe was disabled by system property");
@@ -1150,7 +1145,6 @@ public interface ClassInjector {
* @return An appropriate initializable.
* @throws Exception If the injector cannot be created.
*/
- @SuppressFBWarnings(value = "DP_DO_INSIDE_DO_PRIVILEGED", justification = "Privilege is explicit caller responsibility")
protected static Initializable make() throws Exception {
if (Boolean.getBoolean(UsingUnsafe.SAFE_PROPERTY)) {
return new Initializable.Unavailable("Use of Unsafe was disabled by system property");
@@ -1888,7 +1882,6 @@ public interface ClassInjector {
/**
* {@inheritDoc}
*/
- @SuppressFBWarnings(value = "REC_CATCH_EXCEPTION", justification = "Exception should not be rethrown but trigger a fallback")
public Initializable run() {
if (Boolean.getBoolean(SAFE_PROPERTY)) {
return new Unavailable("Use of Unsafe was disabled by system property");
@@ -2093,7 +2086,6 @@ public interface ClassInjector {
*
* @param accessResolver The access resolver to use.
*/
- @SuppressFBWarnings(value = "REC_CATCH_EXCEPTION", justification = "Exception is captured to trigger lazy error upon use.")
public Factory(AccessResolver accessResolver) {
Dispatcher.Initializable dispatcher;
if (DISPATCHER.isAvailable()) {
@@ -2151,7 +2143,6 @@ public interface ClassInjector {
* other classes within this class's module.
* @return An appropriate injection strategy.
*/
- @SuppressFBWarnings(value = "REC_CATCH_EXCEPTION", justification = "Exception intends to trigger disabled injection strategy.")
public static Factory resolve(Instrumentation instrumentation, boolean local) {
if (ClassInjector.UsingUnsafe.isAvailable() || !JavaModule.isSupported()) {
return new Factory();
@@ -2733,85 +2724,18 @@ public interface ClassInjector {
/**
* {@inheritDoc}
*/
- @SuppressWarnings("deprecation")
public Dispatcher run() {
if (System.getProperty("java.vm.name", "").toUpperCase(Locale.US).contains("J9")) {
return new Unavailable("J9 does not support JNA-based class definition");
}
try {
- Map<String, Object> options = new HashMap<String, Object>();
- options.put(Library.OPTION_ALLOW_OBJECTS, Boolean.TRUE);
- if (Platform.isWindows() && !Platform.is64Bit()) {
- options.put(Library.OPTION_FUNCTION_MAPPER, Windows32BitFunctionMapper.INSTANCE);
- }
- return new Enabled(Native.loadLibrary("jvm", Jvm.class, options));
+ return new Unavailable("JNA is not available");
} catch (Throwable throwable) {
return new Unavailable(throwable.getMessage());
}
}
}
- /**
- * A mapper for 32-bit Windows functions where names are defined with different convention.
- */
- enum Windows32BitFunctionMapper implements FunctionMapper {
-
- /**
- * The singleton instance.
- */
- INSTANCE;
-
- /**
- * {@inheritDoc}
- */
- public String getFunctionName(NativeLibrary library, Method method) {
- if (method.getName().equals("JVM_DefineClass")) {
- return "_JVM_DefineClass@24";
- }
- return method.getName();
- }
- }
-
- /**
- * An enabled dispatcher for JNA-based class injection.
- */
- @HashCodeAndEqualsPlugin.Enhance
- class Enabled implements Dispatcher {
-
- /**
- * The JNA-dispatcher to use for invoking JNI's class definition utilities.
- */
- private final Jvm jvm;
-
- /**
- * Creates a new dispatcher for a JNI's class definition utilities.
- *
- * @param jvm The JNA-dispatcher to use for invoking JNI's class definition utilities.
- */
- protected Enabled(Jvm jvm) {
- this.jvm = jvm;
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean isAvailable() {
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- public Class<?> defineClass(ClassLoader classLoader, String name, byte[] binaryRepresentation, ProtectionDomain protectionDomain) {
- return jvm.JVM_DefineClass(JNIEnv.CURRENT,
- name.replace('.', '/'),
- classLoader,
- binaryRepresentation,
- binaryRepresentation.length,
- protectionDomain);
- }
- }
-
/**
* An unavailable dispatcher for JNA-based class injection.
*/
@@ -2846,32 +2770,6 @@ public interface ClassInjector {
throw new UnsupportedOperationException("JNA is not available and JNA-based injection cannot be used: " + error);
}
}
-
- /**
- * A JNA dispatcher for the JVM's <i>JVM_DefineClass</i> method.
- */
- interface Jvm extends Library {
-
- /**
- * Defines a new class into a given class loader.
- *
- * @param env The JNI environment.
- * @param name The internal name of the class.
- * @param classLoader The class loader to inject into or {@code null} if injecting into the bootstrap loader.
- * @param binaryRepresentation The class's binary representation.
- * @param length The length of the class's binary representation.
- * @param protectionDomain The protection domain or {@code null} if no explicit protection domain should be used.
- * @return The class that was defined.
- * @throws LastErrorException If an error occurs during injection.
- */
- @SuppressWarnings("checkstyle:methodname")
- Class<?> JVM_DefineClass(JNIEnv env,
- String name,
- ClassLoader classLoader,
- byte[] binaryRepresentation,
- int length,
- ProtectionDomain protectionDomain) throws LastErrorException;
- }
}
}
}
--
2.26.2
2.31.1

View File

@ -0,0 +1,53 @@
From b7b286c16c4aba60ce47e0df3f6e97cfb005b21c Mon Sep 17 00:00:00 2001
From: Marian Koncek <mkoncek@redhat.com>
Date: Tue, 9 Nov 2021 12:23:28 +0100
Subject: [PATCH] Remove JDK 15 sealed classes
---
.../bytebuddy/test/precompiled/Sealed.java | 34 -------------------
1 file changed, 34 deletions(-)
delete mode 100644 byte-buddy-dep/src/precompiled/java/net/bytebuddy/test/precompiled/Sealed.java
diff --git a/byte-buddy-dep/src/precompiled/java/net/bytebuddy/test/precompiled/Sealed.java b/byte-buddy-dep/src/precompiled/java/net/bytebuddy/test/precompiled/Sealed.java
deleted file mode 100644
index 28d9835..0000000
--- a/byte-buddy-dep/src/precompiled/java/net/bytebuddy/test/precompiled/Sealed.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014 - Present Rafael Winterhalter
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.bytebuddy.test.precompiled;
-
-public sealed class Sealed permits Sealed.SubNonSealed, Sealed.SubSealed, Sealed.SubFinal {
-
- public static non-sealed class SubNonSealed extends Sealed {
- /* empty */
- }
-
- public static sealed class SubSealed extends Sealed permits SubSealed.SubSubFinal {
-
- public static final class SubSubFinal extends SubSealed {
- /* empty */
- }
- }
-
- public static final class SubFinal extends Sealed {
- /* empty */
- }
-}
--
2.31.1

View File

@ -1,8 +1,8 @@
%bcond_with bootstrap
Name: byte-buddy
Version: 1.10.20
Release: 3%{?dist}
Version: 1.12.0
Release: 1%{?dist}
Summary: Runtime code generation for the Java virtual machine
License: ASL 2.0
URL: http://bytebuddy.net/
@ -11,8 +11,9 @@ Source0: %{name}-%{version}.tar.gz
# Patch the build to avoid bundling inside shaded jars
Patch1: 0001-Avoid-bundling-asm.patch
Patch2: 0002-Remove-dependency-on-jna.patch
Patch2: 0002-Remove-dependencies.patch
Patch3: 0003-Remove-Java-14-tests.patch
Patch4: 0004-Remove-JDK-15-sealed-classes.patch
BuildRequires: maven-local
%if %{with bootstrap}
@ -78,8 +79,10 @@ This package contains API documentation for %{name}.
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
rm byte-buddy-agent/src/test/java/net/bytebuddy/agent/VirtualMachineAttachmentTest.java
rm byte-buddy-agent/src/test/java/net/bytebuddy/agent/VirtualMachineForOpenJ9Test.java
# Cause pre-compiled stuff to be re-compiled
mv byte-buddy-dep/src/precompiled/java/net/bytebuddy/build/*.java \
@ -105,6 +108,7 @@ mv byte-buddy-dep/src/precompiled/java/net/bytebuddy/test/precompiled/*.java \
%pom_remove_plugin :jitwatch-jarscan-maven-plugin
%pom_remove_plugin :clirr-maven-plugin
%pom_remove_plugin :maven-release-plugin
%pom_remove_plugin :nexus-staging-maven-plugin
# Avoid circural dependency
%pom_remove_plugin :byte-buddy-maven-plugin byte-buddy-dep
@ -124,8 +128,13 @@ sed -i -e '/SuppressFBWarnings/d' $(grep -lr SuppressFBWarnings)
%pom_remove_plugin :maven-shade-plugin byte-buddy
%pom_remove_plugin :maven-shade-plugin byte-buddy-benchmark
%pom_remove_dep :jna byte-buddy-agent
%pom_remove_dep :jna-platform byte-buddy-agent
%pom_remove_dep net.java.dev.jna:jna byte-buddy
%pom_remove_dep net.java.dev.jna:jna byte-buddy-dep
%pom_remove_dep net.java.dev.jna:jna byte-buddy-agent
%pom_remove_dep net.java.dev.jna:jna-platform byte-buddy
%pom_remove_dep net.java.dev.jna:jna-platform byte-buddy-dep
%pom_remove_dep net.java.dev.jna:jna-platform byte-buddy-agent
%build
# Ignore test failures, there seems to be something different about the
@ -152,6 +161,9 @@ sed -i -e '/SuppressFBWarnings/d' $(grep -lr SuppressFBWarnings)
%license LICENSE NOTICE
%changelog
* Tue Nov 09 2021 Marian Koncek <mkoncek@redhat.com> - 1.12.0-1
- Update to upstream version 1.12.0
* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.10.20-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild

View File

@ -1 +1 @@
SHA512 (byte-buddy-1.10.20.tar.gz) = a1e19f8da58a4320896b4e322048e19c66d23e9c172e0a701f3293f580557b0c274dbe465a89a208af7173a2ca21077349ebfbbb4db8d928c3a12aa44c41bc0e
SHA512 (byte-buddy-1.12.0.tar.gz) = a57d983920251f03b7d963d2525d94899d35298ba09a8b698e3f24e78a967b97fd1741f6e8ddda7613fffc4beee4a470e31615b49f9b9cdb12ff0e12391592f3