From 9d8fbddcb4165ca068475c806ad858c86e28f3bc Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 25 Jun 2024 13:46:06 +0200 Subject: [PATCH 1/2] Avoid storing the class bytes in MemoryClassPathElement ProtectionDomain Related to #41417 --- .../classloading/MemoryClassPathElement.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java b/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java index b77b6dbf18168..e75d1919e2637 100644 --- a/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java +++ b/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java @@ -21,6 +21,9 @@ public class MemoryClassPathElement extends AbstractClassPathElement { + private static final ProtectionDomain NULL_PROTECTION_DOMAIN = new ProtectionDomain( + new CodeSource(null, (Certificate[]) null), null); + private volatile Map resources; private volatile long lastModified = System.currentTimeMillis(); private final boolean runtime; @@ -112,14 +115,10 @@ public Set getProvidedResources() { @Override public ProtectionDomain getProtectionDomain() { - URL url = null; - try { - url = new URL(null, "quarkus:/", new MemoryUrlStreamHandler("quarkus:/")); - } catch (MalformedURLException e) { - throw new RuntimeException("Unable to create protection domain for memory element", e); - } - CodeSource codesource = new CodeSource(url, (Certificate[]) null); - return new ProtectionDomain(codesource, null); + // we used to include the class bytes in the ProtectionDomain + // but it is not a good idea + // see https://github.com/quarkusio/quarkus/issues/41417 for more details about the problem + return NULL_PROTECTION_DOMAIN; } @Override From 0d9e15ff150e1ca04cd6ee034971b2fe2c1439f3 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 25 Jun 2024 15:55:15 +0200 Subject: [PATCH 2/2] Make MemoryUrlStreamHandler static to avoid references to all resources --- .../classloading/MemoryClassPathElement.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java b/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java index e75d1919e2637..d6c3864673c55 100644 --- a/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java +++ b/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/MemoryClassPathElement.java @@ -88,7 +88,7 @@ public String getPath() { public URL getUrl() { String path = "quarkus:" + name; try { - URL url = new URL(null, path, new MemoryUrlStreamHandler(name)); + URL url = new URL(null, path, new MemoryUrlStreamHandler(resources.get(name), lastModified)); return url; } catch (MalformedURLException e) { @@ -126,11 +126,13 @@ public void close() throws IOException { } - private class MemoryUrlStreamHandler extends URLStreamHandler { - private final String name; + private static class MemoryUrlStreamHandler extends URLStreamHandler { + private final byte[] bytes; + private long lastModified; - public MemoryUrlStreamHandler(String name) { - this.name = name; + public MemoryUrlStreamHandler(byte[] bytes, long lastModified) { + this.bytes = bytes; + this.lastModified = lastModified; } @Override @@ -142,7 +144,7 @@ public void connect() throws IOException { @Override public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(resources.get(name)); + return new ByteArrayInputStream(bytes); } @Override @@ -152,12 +154,12 @@ public long getLastModified() { @Override public int getContentLength() { - return resources.get(name).length; + return bytes.length; } @Override public long getContentLengthLong() { - return resources.get(name).length; + return bytes.length; } }; }