diff --git a/patches/byte-buddy/0001-Remove-dependencies.patch b/patches/byte-buddy/0001-Remove-dependencies.patch index d2ae8325..855d1fd8 100644 --- a/patches/byte-buddy/0001-Remove-dependencies.patch +++ b/patches/byte-buddy/0001-Remove-dependencies.patch @@ -1,16 +1,16 @@ -From 9a9b315faafa179a6bdc7247d655350afbaa00de Mon Sep 17 00:00:00 2001 +From 8b3db19885d64a06913c4d6e686575ad2a92f546 Mon Sep 17 00:00:00 2001 From: Marian Koncek Date: Mon, 11 Dec 2023 13:02:33 +0100 Subject: [PATCH 1/2] Remove dependencies Forwarded: not-needed --- - .../net/bytebuddy/agent/VirtualMachine.java | 2006 +---------------- + .../net/bytebuddy/agent/VirtualMachine.java | 2244 +---------------- .../dynamic/loading/ClassInjector.java | 95 +- - 2 files changed, 2 insertions(+), 2099 deletions(-) + 2 files changed, 2 insertions(+), 2337 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 7a748ade01..d15d47d3c4 100644 +index e959f52032..9932545a66 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,11 +15,6 @@ @@ -25,7 +25,7 @@ index 7a748ade01..d15d47d3c4 100644 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.agent.utility.nullability.MaybeNull; import net.bytebuddy.agent.utility.nullability.UnknownNull; -@@ -151,15 +146,7 @@ public interface VirtualMachine { +@@ -153,15 +148,7 @@ public interface VirtualMachine { * {@inheritDoc} */ public Class run() { @@ -42,7 +42,7 @@ index 7a748ade01..d15d47d3c4 100644 } } -@@ -229,23 +216,6 @@ public interface VirtualMachine { +@@ -231,23 +218,6 @@ public interface VirtualMachine { this.connection = connection; } @@ -66,13 +66,13 @@ index 7a748ade01..d15d47d3c4 100644 /** * Attaches to the supplied process id using the supplied connection factory. * -@@ -681,1980 +651,6 @@ public interface VirtualMachine { +@@ -683,2218 +653,6 @@ public interface VirtualMachine { */ protected abstract int read(T connection, byte[] buffer) throws IOException; } - - /** -- * Implements a connection for a Posix socket in JNA. +- * Implements a connection for a POSIX socket in JNA. - */ - class ForJnaPosixSocket extends OnPersistentByteChannel { - @@ -87,7 +87,7 @@ index 7a748ade01..d15d47d3c4 100644 - private final File socket; - - /** -- * Creates a connection for a virtual posix socket implemented in JNA. +- * Creates a connection for a virtual POSIX socket implemented in JNA. - * - * @param library The JNA library to use. - * @param socket The POSIX socket. @@ -139,7 +139,7 @@ index 7a748ade01..d15d47d3c4 100644 - } - - /** -- * A JNA library binding for Posix sockets. +- * A JNA library binding for POSIX sockets. - */ - protected interface PosixLibrary extends Library { - @@ -396,6 +396,9 @@ index 7a748ade01..d15d47d3c4 100644 - throw new IllegalArgumentException("Cannot supply more then four arguments to Windows attach mechanism: " + Arrays.asList(argument)); - } - String name = "\\\\.\\pipe\\javatool" + Math.abs(random.nextInt() + 1); +- +- WinBase.SECURITY_ATTRIBUTES sa = createSecurityAttributesToAllowMediumIntegrity(); +- - WinNT.HANDLE pipe = Kernel32.INSTANCE.CreateNamedPipe(name, - WinBase.PIPE_ACCESS_INBOUND, - WinBase.PIPE_TYPE_BYTE | WinBase.PIPE_READMODE_BYTE | WinBase.PIPE_WAIT, @@ -403,7 +406,7 @@ index 7a748ade01..d15d47d3c4 100644 - 4096, - 8192, - WinBase.NMPWAIT_USE_DEFAULT_WAIT, -- null); +- sa); - if (pipe == null) { - throw new Win32Exception(Native.getLastError()); - } @@ -462,6 +465,63 @@ index 7a748ade01..d15d47d3c4 100644 - } - - /** +- * Custom {@link WinBase.SECURITY_ATTRIBUTES} is required here to "get" Medium Integrity Level. +- * In order to allow Medium Integrity Level clients to open +- * and use a NamedPipe created by an High Integrity Level process. +- * +- * @return A security attributes object that gives everyone read and write access. +- */ +- private WinBase.SECURITY_ATTRIBUTES createSecurityAttributesToAllowMediumIntegrity() { +- // Allow read/write to Everybody +- WinNT.PSID pSidEverybody = new WinNT.PSID(WinNT.SECURITY_MAX_SID_SIZE); +- if (!Advapi32.INSTANCE.CreateWellKnownSid(WinNT.WELL_KNOWN_SID_TYPE.WinWorldSid, null, pSidEverybody, new IntByReference(WinNT.SECURITY_MAX_SID_SIZE))) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- // Allow full control to System +- WinNT.PSID pSidSystem = new WinNT.PSID(WinNT.SECURITY_MAX_SID_SIZE); +- if (!Advapi32.INSTANCE.CreateWellKnownSid(WinNT.WELL_KNOWN_SID_TYPE.WinBuiltinSystemOperatorsSid, null, pSidSystem, new IntByReference(WinNT.SECURITY_MAX_SID_SIZE))) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- // Allow full control to Administrators +- WinNT.PSID pSidAdmin = new WinNT.PSID(WinNT.SECURITY_MAX_SID_SIZE); +- if (!Advapi32.INSTANCE.CreateWellKnownSid(WinNT.WELL_KNOWN_SID_TYPE.WinBuiltinAdministratorsSid, null, pSidAdmin, new IntByReference(WinNT.SECURITY_MAX_SID_SIZE))) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- +- // Prepare ACL +- int cbAcl = Native.getNativeSize(WinNT.ACL.class, null); +- cbAcl += Native.getNativeSize(WinNT.ACCESS_ALLOWED_ACE.class, null) * 3; +- cbAcl += (Advapi32.INSTANCE.GetLengthSid(pSidEverybody) - WinDef.DWORD.SIZE); +- cbAcl += (Advapi32.INSTANCE.GetLengthSid(pSidSystem) - WinDef.DWORD.SIZE); +- cbAcl += (Advapi32.INSTANCE.GetLengthSid(pSidAdmin) - WinDef.DWORD.SIZE); +- cbAcl = Advapi32Util.alignOnDWORD(cbAcl); +- WinNT.ACL pAcl = new WinNT.ACL(cbAcl); +- if (!Advapi32.INSTANCE.InitializeAcl(pAcl, cbAcl, WinNT.ACL_REVISION)) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- if (!Advapi32.INSTANCE.AddAccessAllowedAce(pAcl, WinNT.ACL_REVISION, WinNT.GENERIC_READ | WinNT.GENERIC_WRITE, pSidEverybody)) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- if (!Advapi32.INSTANCE.AddAccessAllowedAce(pAcl, WinNT.ACL_REVISION, WinNT.GENERIC_ALL, pSidSystem)) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- if (!Advapi32.INSTANCE.AddAccessAllowedAce(pAcl, WinNT.ACL_REVISION, WinNT.GENERIC_ALL, pSidAdmin)) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- WinNT.SECURITY_DESCRIPTOR sd = new WinNT.SECURITY_DESCRIPTOR(64 * 1024); +- if (!Advapi32.INSTANCE.InitializeSecurityDescriptor(sd, WinNT.SECURITY_DESCRIPTOR_REVISION)) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- if (!Advapi32.INSTANCE.SetSecurityDescriptorDacl(sd, true, pAcl, false)) { +- throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); +- } +- WinBase.SECURITY_ATTRIBUTES sa = new WinBase.SECURITY_ATTRIBUTES(); +- sa.dwLength = new WinDef.DWORD(sa.size()); +- sa.lpSecurityDescriptor = sd.getPointer(); +- return sa; +- } +- +- /** - * {@inheritDoc} - */ - public void close() { @@ -982,7 +1042,8 @@ index 7a748ade01..d15d47d3c4 100644 - } - - /** -- * Attaches to the supplied process id using the default JNA implementation. +- * Attaches to the supplied process id using the default JNA implementation. This method will not consider +- * attaching to VMs owned by different users than the current user. - * - * @param processId The process id. - * @return A suitable virtual machine implementation. @@ -1004,7 +1065,11 @@ index 7a748ade01..d15d47d3c4 100644 - * @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(processId)), ".com_ibm_tools_attach"); +- String temporary = System.getProperty(IBM_TEMPORARY_FOLDER); +- File directory = temporary == null +- ? new File(dispatcher.getTemporaryFolder(processId), ".com_ibm_tools_attach") +- : new File(temporary); +- long userId = dispatcher.userId(); - RandomAccessFile attachLock = new RandomAccessFile(new File(directory, "_attachlock"), "rw"); - try { - FileLock attachLockLock = attachLock.getChannel().lock(); @@ -1018,10 +1083,9 @@ index 7a748ade01..d15d47d3c4 100644 - if (vmFolder == null) { - throw new IllegalStateException("No descriptor files found in " + directory); - } -- long userId = dispatcher.userId(); - virtualMachines = new ArrayList(); - for (File aVmFolder : vmFolder) { -- if (aVmFolder.isDirectory() && dispatcher.getOwnerIdOf(aVmFolder) == userId) { +- if (aVmFolder.isDirectory() && (userId == 0L || dispatcher.getOwnerIdOf(aVmFolder) == userId)) { - File attachInfo = new File(aVmFolder, "attachInfo"); - if (attachInfo.isFile()) { - Properties virtualMachine = new Properties(); @@ -1084,10 +1148,19 @@ index 7a748ade01..d15d47d3c4 100644 - key = Long.toHexString(SECURE_RANDOM.nextLong()); - } - File reply = new File(receiver, "replyInfo"); +- long targetUserId; +- try { +- targetUserId = Long.parseLong(target.getProperty("userUid")); +- } catch (NumberFormatException ignored) { +- targetUserId = 0L; +- } - try { - if (reply.createNewFile()) { - dispatcher.setPermissions(reply, 0600); - } +- if (userId == 0L && targetUserId != 0L) { +- dispatcher.chownFileToUser(reply, targetUserId); +- } - FileOutputStream outputStream = new FileOutputStream(reply); - try { - outputStream.write(key.getBytes("UTF-8")); @@ -1380,6 +1453,14 @@ index 7a748ade01..d15d47d3c4 100644 - void decrementSemaphore(File directory, String name, boolean global, int count); - - /** +- * Changes the ownership of a file. Can be called only if this process is owned by root. +- * +- * @param file The path of the file to change ownership of. +- * @param userId The user that should own the file. +- */ +- void chownFileToUser(File file, long userId); +- +- /** - * A connector implementation for a POSIX environment using JNA. - */ - class ForJnaPosixEnvironment implements Dispatcher { @@ -1390,22 +1471,12 @@ index 7a748ade01..d15d47d3c4 100644 - private final PosixLibrary library; - - /** -- * The maximum amount of attempts for checking the result of a foreign process. -- */ -- private final int attempts; -- -- /** -- * The pause between two checks for another process to return. -- */ -- private final long pause; -- -- /** -- * The time unit of the pause time. +- * The POSIX owner provider to use. - */ -- private final TimeUnit timeUnit; +- private final PosixOwnerProvider provider; - - /** -- * Creates a new connector for a POSIX enviornment using JNA. +- * Creates a new connector for a POSIX environment using JNA. - * - * @param attempts The maximum amount of attempts for checking the result of a foreign process. - * @param pause The pause between two checks for another process to return. @@ -1413,9 +1484,9 @@ index 7a748ade01..d15d47d3c4 100644 - */ - @SuppressWarnings("deprecation") - public ForJnaPosixEnvironment(int attempts, long pause, TimeUnit timeUnit) { -- this.attempts = attempts; -- this.pause = pause; -- this.timeUnit = timeUnit; +- provider = Platform.isAIX() +- ? new PosixOwnerProvider.UsingIStat(attempts, pause, timeUnit) +- : new PosixOwnerProvider.UsingStat(attempts, pause, timeUnit); - library = Native.loadLibrary("c", PosixLibrary.class); - } - @@ -1459,40 +1530,7 @@ index 7a748ade01..d15d47d3c4 100644 - */ - @SuppressFBWarnings(value = "OS_OPEN_STREAM", justification = "The stream life-cycle is bound to its process.") - public int getOwnerIdOf(File file) { -- try { -- // The binding for 'stat' is very platform dependant. To avoid the complexity of binding the correct method, -- // stat is called as a separate command. This is less efficient but more portable. -- Process process = Runtime.getRuntime().exec(new String[]{"stat", -- Platform.isMac() ? "-f" : "-c", -- "%u", -- file.getAbsolutePath()}); -- int attempts = this.attempts; -- boolean exited = false; -- String line = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")).readLine(); -- do { -- try { -- if (process.exitValue() != 0) { -- throw new IllegalStateException("Error while executing stat"); -- } -- exited = true; -- break; -- } catch (IllegalThreadStateException ignored) { -- try { -- Thread.sleep(timeUnit.toMillis(pause)); -- } catch (InterruptedException exception) { -- Thread.currentThread().interrupt(); -- throw new IllegalStateException(exception); -- } -- } -- } while (--attempts > 0); -- if (!exited) { -- process.destroy(); -- throw new IllegalStateException("Command for stat did not exit in time"); -- } -- return Integer.parseInt(line); -- } catch (IOException exception) { -- throw new IllegalStateException("Unable to execute stat command", exception); -- } +- return provider.getOwnerIdOf(file); - } - - /** @@ -1517,6 +1555,13 @@ index 7a748ade01..d15d47d3c4 100644 - } - - /** +- * {@inheritDoc} +- */ +- public void chownFileToUser(File file, long userId) { +- library.chown(file.getAbsolutePath(), userId); +- } +- +- /** - * Notifies a POSIX semaphore. - * - * @param directory The semaphore's directory. @@ -1532,21 +1577,17 @@ index 7a748ade01..d15d47d3c4 100644 - PosixLibrary.SemaphoreOperation target = new PosixLibrary.SemaphoreOperation(); - target.operation = operation; - target.flags = flags; -- try { -- while (count-- > 0) { -- try { -- library.semop(semaphore, target, 1); -- } catch (LastErrorException exception) { -- if (acceptUnavailable && (Native.getLastError() == PosixLibrary.EAGAIN -- || Native.getLastError() == PosixLibrary.EDEADLK)) { -- break; -- } else { -- throw exception; -- } +- while (count-- > 0) { +- try { +- library.semop(semaphore, target, 1); +- } catch (LastErrorException exception) { +- if (acceptUnavailable && (Native.getLastError() == PosixLibrary.EAGAIN +- || Native.getLastError() == PosixLibrary.EDEADLK)) { +- break; +- } else { +- throw exception; - } - } -- } finally { -- target = null; - } - } - @@ -1622,6 +1663,16 @@ index 7a748ade01..d15d47d3c4 100644 - int chmod(String path, int mode) throws LastErrorException; - - /** +- * Runs the {@code chown} command. +- * +- * @param path The file path. +- * @param userId The user id to set. +- * @return The return code. +- * @throws LastErrorException If an error occurred. +- */ +- int chown(String path, long userId) throws LastErrorException; +- +- /** - * Runs the {@code ftok} command. - * - * @param path The file path. @@ -1680,6 +1731,186 @@ index 7a748ade01..d15d47d3c4 100644 - } - } - } +- +- /** +- * Represents a system that supports POSIX ownership. +- */ +- protected interface PosixOwnerProvider { +- +- /** +- * 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); +- +- /** +- * An implementation of reading POSIX ownership using {@code stat}. +- */ +- class UsingStat implements PosixOwnerProvider { +- +- /** +- * The maximum amount of attempts for checking the result of a foreign process. +- */ +- private final int attempts; +- +- /** +- * The pause between two checks for another process to return. +- */ +- private final long pause; +- +- /** +- * The time unit of the pause time. +- */ +- private final TimeUnit timeUnit; +- +- /** +- * Creates a new provider where an owner is derived using the {@code stat} command. +- * +- * @param attempts The maximum amount of attempts for checking the result of a foreign process. +- * @param pause The pause between two checks for another process to return. +- * @param timeUnit The time unit of the pause time. +- */ +- public UsingStat(int attempts, long pause, TimeUnit timeUnit) { +- this.attempts = attempts; +- this.pause = pause; +- this.timeUnit = timeUnit; +- } +- +- /** +- * {@inheritDoc} +- */ +- public int getOwnerIdOf(File file) { +- try { +- // The binding for 'stat' is very platform dependant. To avoid the complexity of binding the correct method, +- // stat is called as a separate command. This is less efficient but more portable. +- Process process = Runtime.getRuntime().exec(new String[]{"stat", +- Platform.isMac() ? "-f" : "-c", +- "%u", +- file.getAbsolutePath()}); +- int attempts = this.attempts; +- String line = null; +- do { +- try { +- if (process.exitValue() != 0) { +- throw new IllegalStateException("Error while executing stat"); +- } +- BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); +- try { +- line = reader.readLine(); +- } finally { +- reader.close(); +- } +- break; +- } catch (IllegalThreadStateException ignored) { +- try { +- Thread.sleep(timeUnit.toMillis(pause)); +- } catch (InterruptedException exception) { +- Thread.currentThread().interrupt(); +- throw new IllegalStateException(exception); +- } +- } +- } while (--attempts > 0); +- if (line == null) { +- process.destroy(); +- throw new IllegalStateException("Command for stat did not exit in time"); +- } +- return Integer.parseInt(line); +- } catch (IOException exception) { +- throw new IllegalStateException("Unable to execute stat command", exception); +- } +- } +- } +- +- /** +- * An implementation for reading a POSIX owner using {@code istat}. +- */ +- class UsingIStat implements PosixOwnerProvider { +- +- /** +- * A pattern to represent the owner on the console output. +- */ +- private static final Pattern AIX_OWNER_PATTERN = Pattern.compile("Owner: (\\d+)\\("); +- +- /** +- * The maximum amount of attempts for checking the result of a foreign process. +- */ +- private final int attempts; +- +- /** +- * The pause between two checks for another process to return. +- */ +- private final long pause; +- +- /** +- * The time unit of the pause time. +- */ +- private final TimeUnit timeUnit; +- +- /** +- * Creates a new provider for reading a POSIX owner using {@code istat}. +- * +- * @param attempts The maximum amount of attempts for checking the result of a foreign process. +- * @param pause The pause between two checks for another process to return. +- * @param timeUnit The time unit of the pause time. +- */ +- public UsingIStat(int attempts, long pause, TimeUnit timeUnit) { +- this.attempts = attempts; +- this.pause = pause; +- this.timeUnit = timeUnit; +- } +- +- /** +- * {@inheritDoc} +- */ +- public int getOwnerIdOf(File file) { +- try { +- Process process = Runtime.getRuntime().exec(new String[]{"istat", file.getAbsolutePath()}); +- int attempts = this.attempts; +- String lines = null; +- do { +- try { +- if (process.exitValue() != 0) { +- throw new IllegalStateException("Error while executing istat"); +- } +- StringBuilder output = new StringBuilder(); +- BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); +- try { +- String line; +- while ((line = reader.readLine()) != null) { +- output.append(line).append("\n"); +- } +- } finally { +- reader.close(); +- } +- lines = output.toString(); +- break; +- } catch (IllegalThreadStateException ignored) { +- try { +- Thread.sleep(timeUnit.toMillis(pause)); +- } catch (InterruptedException exception) { +- Thread.currentThread().interrupt(); +- throw new IllegalStateException(exception); +- } +- } +- } while (--attempts > 0); +- if (lines == null) { +- process.destroy(); +- throw new IllegalStateException("Command for istat did not exit in time"); +- } +- Matcher matcher = AIX_OWNER_PATTERN.matcher(lines); +- if (matcher.find()) { +- return Integer.parseInt(matcher.group(1)); +- } else { +- throw new IllegalStateException("Unable to parse response from istat command: " + lines); +- } +- } catch (IOException exception) { +- throw new IllegalStateException("Unable to execute istat command", exception); +- } +- } +- } +- } - } - - /** @@ -1805,6 +2036,13 @@ index 7a748ade01..d15d47d3c4 100644 - } - - /** +- * {@inheritDoc} +- */ +- public void chownFileToUser(File file, long userId) { +- /* do nothing */ +- } +- +- /** - * Opens a semaphore for signaling another process that an attachment is performed. - * - * @param directory The control directory. @@ -2048,7 +2286,7 @@ index 7a748ade01..d15d47d3c4 100644 } } 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 89b238d07c..4db5cff999 100644 +index 582fbad274..4916af2db4 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,7 +15,6 @@ @@ -2059,7 +2297,7 @@ index 89b238d07c..4db5cff999 100644 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.ByteBuddy; import net.bytebuddy.ClassFileVersion; -@@ -2791,79 +2790,13 @@ public interface ClassInjector { +@@ -2850,79 +2849,13 @@ public interface ClassInjector { return new Unavailable("J9 does not support JNA-based class definition"); } try { @@ -2140,7 +2378,7 @@ index 89b238d07c..4db5cff999 100644 /** * An unavailable dispatcher for JNA-based class injection. */ -@@ -2898,32 +2831,6 @@ public interface ClassInjector { +@@ -2957,32 +2890,6 @@ public interface ClassInjector { throw new UnsupportedOperationException("JNA is not available and JNA-based injection cannot be used: " + error); } } @@ -2174,5 +2412,5 @@ index 89b238d07c..4db5cff999 100644 } } -- -2.46.0 +2.51.0 diff --git a/patches/byte-buddy/0002-Allow-nullability-annotations-on-local-variables.patch b/patches/byte-buddy/0002-Allow-nullability-annotations-on-local-variables.patch index a3b3c429..d08d9e7c 100644 --- a/patches/byte-buddy/0002-Allow-nullability-annotations-on-local-variables.patch +++ b/patches/byte-buddy/0002-Allow-nullability-annotations-on-local-variables.patch @@ -1,4 +1,4 @@ -From 6e945cc133e9b3066788dade1eea1b62d3bc2034 Mon Sep 17 00:00:00 2001 +From 3b446c258ca2a20a4c2aee4722fb106d4f342f11 Mon Sep 17 00:00:00 2001 From: Mikolaj Izdebski Date: Thu, 1 Feb 2024 14:49:14 +0100 Subject: [PATCH 2/2] Allow nullability annotations on local variables @@ -138,5 +138,5 @@ index 4f9ecf365f..9325e8e636 100644 @Nonnull(when = When.UNKNOWN) @TypeQualifierNickname -- -2.46.0 +2.51.0 diff --git a/project/byte-buddy.properties b/project/byte-buddy.properties index 5a5f2e12..df57c540 100644 --- a/project/byte-buddy.properties +++ b/project/byte-buddy.properties @@ -1,3 +1,3 @@ url=https://github.com/raphw/byte-buddy.git ref=byte-buddy-@.@.@ -version=1.14.10 +version=1.17.7