Skip to content

Conversation

jponge
Copy link
Member

@jponge jponge commented Sep 4, 2025

This fixes Netty CVEs: CVE-2025-58057 and CVE-2025-58056

@quarkus-bot quarkus-bot bot added area/dependencies Pull requests that update a dependency file area/tracing labels Sep 4, 2025
Copy link

quarkus-bot bot commented Sep 4, 2025

/cc @brunobat (opentelemetry), @radcortez (opentelemetry)

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

We have failures in JVM / native mode for some HTTP compression tests, see ./mvnw clean verify -f integration-tests/vertx-http-compressors/

Copy link
Contributor

@jmartisk jmartisk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume we also need to update the version in independent-projects/vertx-utils/pom.xml (is that the cause of the failure?)

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

Good catch @jmartisk, let me see if this caused a mis-alignment

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

It's a needed POM bump, but it doesn't solve the problem.

@jponge jponge force-pushed the deps/vertx-4.5.21-main branch from feaf677 to 5286496 Compare September 4, 2025 09:29
@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

I've made aware @vietj and @geoand, I'm not sure if it's a test problem, a Quarkus problem, etc.

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

Also /cc @mkouba

@cescoffier
Copy link
Member

Do you have a stack trace or something?

@cescoffier
Copy link
Member

Ok, so, it's not nice.

When we use the Vert.x web client to retrieve the response, it got cut. It only does it when the compression use "deflate"

@cescoffier
Copy link
Member

It cut just before \n\r\n\r.... - so definitely related to the netty commit.

@cescoffier
Copy link
Member

Hum, every \n we have in the response, cut the response.

@cescoffier
Copy link
Member

Someone would have to check, but according to https://w4ke.info/2025/06/18/funky-chunks.html, we may have an illegal test in the sense that it introduces "funky chunks".

I'm surprised, as we mostly only introduce \n, which should be fine.

@cescoffier
Copy link
Member

Not sure actually - I've removed the line jump and still see cut content.

@cescoffier
Copy link
Member

The content appears to be compressed correctly, but the issue arises when we decompress it in the test to verify if it matches the original content. We use the Netty API directly; I don't see anything odd so far.

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

Also what I'm looking at (but no expert in that area)

@cescoffier
Copy link
Member

Ok, got it.

@cescoffier
Copy link
Member

cescoffier commented Sep 4, 2025

Apply the following:

Subject: [PATCH] Fix decompression
---
Index: integration-tests/vertx-http-compressors/app/src/test/java/io/quarkus/compressors/it/Testflow.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/integration-tests/vertx-http-compressors/app/src/test/java/io/quarkus/compressors/it/Testflow.java b/integration-tests/vertx-http-compressors/app/src/test/java/io/quarkus/compressors/it/Testflow.java
--- a/integration-tests/vertx-http-compressors/app/src/test/java/io/quarkus/compressors/it/Testflow.java	(revision 528649665e0f70e7890b44d6f30f0eaa0f8d1084)
+++ b/integration-tests/vertx-http-compressors/app/src/test/java/io/quarkus/compressors/it/Testflow.java	(date 1756987929779)
@@ -178,9 +178,9 @@
         if (algorithm != null && !"identity".equalsIgnoreCase(algorithm)) {
             final EmbeddedChannel channel;
             if ("gzip".equalsIgnoreCase(algorithm)) {
-                channel = new EmbeddedChannel(newZlibDecoder(ZlibWrapper.GZIP));
+                channel = new EmbeddedChannel(newZlibDecoder(ZlibWrapper.GZIP, 0));
             } else if ("deflate".equalsIgnoreCase(algorithm)) {
-                channel = new EmbeddedChannel(newZlibDecoder(ZlibWrapper.ZLIB));
+                channel = new EmbeddedChannel(newZlibDecoder(ZlibWrapper.ZLIB, 0));
             } else if ("br".equalsIgnoreCase(algorithm)) {
                 channel = new EmbeddedChannel(new BrotliDecoder());
             } else {
@@ -188,8 +188,18 @@
             }
             channel.writeInbound(Unpooled.copiedBuffer(payload));
             channel.finish();
-            final ByteBuf decompressed = channel.readInbound();
-            return decompressed.readCharSequence(decompressed.readableBytes(), StandardCharsets.UTF_8).toString();
+
+            // Read all output buffers - decompression might produce multiple buffers
+            final StringBuilder result = new StringBuilder();
+            ByteBuf decompressed;
+            while ((decompressed = channel.readInbound()) != null) {
+                try {
+                    result.append(decompressed.readCharSequence(decompressed.readableBytes(), StandardCharsets.UTF_8));
+                } finally {
+                    decompressed.release();
+                }
+            }
+            return result.toString();
         } else {
             return new String(payload, StandardCharsets.UTF_8);
         }

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

Let me check that + fix something else we discussed with @cescoffier

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

Let's have a green CI before backporting to #49869 and #49868

@sberyozkin
Copy link
Member

bouncy-castle-fips-jsse test is failing, I'm in a co-working space right now, it expires in an hour, so it is unlikely I'll find anything now, will look later this evening. If this PR must get in ASAP, I suggest ignore this test failure and go ahead with the merge and open an issue assigned to me to check the test failure.

@sberyozkin
Copy link
Member

The trace for the bouncycastle is here:

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
2025-09-04T13:15:02.4517767Z 	Suppressed: java.lang.IllegalAccessException: class io.netty.handler.ssl.BouncyCastleAlpnSslUtils cannot access a member of class org.bouncycastle.jsse.provider.ProvSSLEngine with modifiers "public synchronized"
2025-09-04T13:15:02.4519077Z 		at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
2025-09-04T13:15:02.4519682Z 		at java.base/java.lang.reflect.Method.invoke(Method.java:561)
2025-09-04T13:15:02.4521228Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslUtils.<clinit>(BouncyCastleAlpnSslUtils.java:83)
2025-09-04T13:15:02.4522023Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine$1.accept(BouncyCastleAlpnSslEngine.java:35)
2025-09-04T13:15:02.4522805Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine$1.accept(BouncyCastleAlpnSslEngine.java:32)
2025-09-04T13:15:02.4523486Z 		at io.netty.handler.ssl.JdkAlpnSslEngine.<init>(JdkAlpnSslEngine.java:92)
2025-09-04T13:15:02.4524173Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine.<init>(BouncyCastleAlpnSslEngine.java:31)
2025-09-04T13:15:02.4525188Z 		at io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper.wrapSslEngine(JdkAlpnApplicationProtocolNegotiator.java:139)
2025-09-04T13:15:02.4526167Z 		at io.netty.handler.ssl.JdkSslContext.configureAndWrapEngine(JdkSslContext.java:383)
2025-09-04T13:15:02.4526823Z 		at io.netty.handler.ssl.JdkSslContext.newEngine(JdkSslContext.java:357)
2025-09-04T13:15:02.4527678Z 		at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:1077)
2025-09-04T13:15:02.4528331Z 		at io.netty.handler.ssl.DelegatingSslContext.newHandler(DelegatingSslContext.java:100)
2025-09-04T13:15:02.4528958Z 		at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:1072)
2025-09-04T13:15:02.4529849Z 		at io.vertx.core.net.impl.SslChannelProvider.createServerSslHandler(SslChannelProvider.java:160)
2025-09-04T13:15:02.4531072Z 		at io.vertx.core.net.impl.SslChannelProvider.createServerHandler(SslChannelProvider.java:151)
2025-09-04T13:15:02.4531861Z 		at io.vertx.core.http.impl.HttpServerWorker.configurePipeline(HttpServerWorker.java:132)
2025-09-04T13:15:02.4532562Z 		at io.vertx.core.http.impl.HttpServerWorker.accept(HttpServerWorker.java:125)
2025-09-04T13:15:02.4533372Z 		at io.vertx.core.http.impl.HttpServerWorker.accept(HttpServerWorker.java:49)
2025-09-04T13:15:02.4534109Z 		at io.vertx.core.net.impl.TCPServerBase.lambda$listen$6(TCPServerBase.java:297)
2025-09-04T13:15:02.4534896Z 		at io.vertx.core.net.impl.ServerChannelLoadBalancer.initChannel(ServerChannelLoadBalancer.java:61)
2025-09-04T13:15:02.4535746Z 		at io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:129)
2025-09-04T13:15:02.4536583Z 		at io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:112)
2025-09-04T13:15:02.4537796Z 		at io.netty.channel.AbstractChannelHandlerContext.callHandlerAdded(AbstractChannelHandlerContext.java:1130)
2025-09-04T13:15:02.4539002Z 		at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:558)
2025-09-04T13:15:02.4540089Z 		at io.netty.channel.DefaultChannelPipeline.access$100(DefaultChannelPipeline.java:45)
2025-09-04T13:15:02.4541006Z 		at io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1410)
2025-09-04T13:15:02.4541985Z 		at io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1064)
2025-09-04T13:15:02.4542962Z 		at io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:599)
2025-09-04T13:15:02.4543767Z 		at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:513)
2025-09-04T13:15:02.4544572Z 		at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
2025-09-04T13:15:02.4545262Z 		at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:485)
2025-09-04T13:15:02.4545975Z 		at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
2025-09-04T13:15:02.4546952Z 		at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
2025-09-04T13:15:02.4547883Z 		at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
2025-09-04T13:15:02.4548603Z 		at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
2025-09-04T13:15:02.4549255Z 		at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
2025-09-04T13:15:02.4549986Z 		at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
2025-09-04T13:15:02.4550675Z 		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
2025-09-04T13:15:02.4551259Z 		at java.base/java.lang.Thread.run(Thread.java:840)
2025-09-04T13:15:02.4552053Z 	Suppressed: java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "java.lang.Class.getMethods()" because "intf" is null
2025-09-04T13:15:02.4553277Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslUtils.setHandshakeApplicationProtocolSelector(BouncyCastleAlpnSslUtils.java:207)
2025-09-04T13:15:02.4554239Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine$1.accept(BouncyCastleAlpnSslEngine.java:35)
2025-09-04T13:15:02.4555028Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine$1.accept(BouncyCastleAlpnSslEngine.java:32)
2025-09-04T13:15:02.4555799Z 		at io.netty.handler.ssl.JdkAlpnSslEngine.<init>(JdkAlpnSslEngine.java:92)
2025-09-04T13:15:02.4556706Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine.<init>(BouncyCastleAlpnSslEngine.java:31)
2025-09-04T13:15:02.4557867Z 		at io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper.wrapSslEngine(JdkAlpnApplicationProtocolNegotiator.java:139)
2025-09-04T13:15:02.4558879Z 		at io.netty.handler.ssl.JdkSslContext.configureAndWrapEngine(JdkSslContext.java:383)
2025-09-04T13:15:02.4559592Z 		at io.netty.handler.ssl.JdkSslContext.newEngine(JdkSslContext.java:357)
2025-09-04T13:15:02.4560208Z 		at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:1077)
2025-09-04T13:15:02.4560838Z 		at io.netty.handler.ssl.DelegatingSslContext.newHandler(DelegatingSslContext.java:100)
2025-09-04T13:15:02.4561496Z 		at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:1072)
2025-09-04T13:15:02.4562226Z 		at io.vertx.core.net.impl.SslChannelProvider.createServerSslHandler(SslChannelProvider.java:160)
2025-09-04T13:15:02.4563123Z 		at io.vertx.core.net.impl.SslChannelProvider.createServerHandler(SslChannelProvider.java:151)
2025-09-04T13:15:02.4563975Z 		at io.vertx.core.http.impl.HttpServerWorker.configurePipeline(HttpServerWorker.java:132)
2025-09-04T13:15:02.4564686Z 		at io.vertx.core.http.impl.HttpServerWorker.accept(HttpServerWorker.java:125)
2025-09-04T13:15:02.4565325Z 		at io.vertx.core.http.impl.HttpServerWorker.accept(HttpServerWorker.java:49)
2025-09-04T13:15:02.4565961Z 		at io.vertx.core.net.impl.TCPServerBase.lambda$listen$6(TCPServerBase.java:297)
2025-09-04T13:15:02.4566712Z 		at io.vertx.core.net.impl.ServerChannelLoadBalancer.initChannel(ServerChannelLoadBalancer.java:61)
2025-09-04T13:15:02.4567627Z 		at io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:129)
2025-09-04T13:15:02.4568294Z 		at io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:112)
2025-09-04T13:15:02.4569113Z 		at io.netty.channel.AbstractChannelHandlerContext.callHandlerAdded(AbstractChannelHandlerContext.java:1130)
2025-09-04T13:15:02.4569978Z 		at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:558)
2025-09-04T13:15:02.4570710Z 		at io.netty.channel.DefaultChannelPipeline.access$100(DefaultChannelPipeline.java:45)
2025-09-04T13:15:02.4571498Z 		at io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1410)
2025-09-04T13:15:02.4572405Z 		at io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1064)
2025-09-04T13:15:02.4573556Z 		at io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:599)
2025-09-04T13:15:02.4574553Z 		at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:513)
2025-09-04T13:15:02.4575200Z 		at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
2025-09-04T13:15:02.4575841Z 		at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:485)
2025-09-04T13:15:02.4576503Z 		at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
2025-09-04T13:15:02.4577253Z 		at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
2025-09-04T13:15:02.4578210Z 		at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
2025-09-04T13:15:02.4578885Z 		at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
2025-09-04T13:15:02.4579525Z 		at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
2025-09-04T13:15:02.4580193Z 		at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
2025-09-04T13:15:02.4580845Z 		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
2025-09-04T13:15:02.4581408Z 		at java.base/java.lang.Thread.run(Thread.java:840)
2025-09-04T13:15:02.4582015Z 	Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Class.getMethods()" because "intf" is null
2025-09-04T13:15:02.4582884Z 		at java.base/java.lang.reflect.Proxy$ProxyBuilder.referencedTypes(Proxy.java:744)
2025-09-04T13:15:02.4583477Z 		at java.base/java.lang.reflect.Proxy$ProxyBuilder.<init>(Proxy.java:645)
2025-09-04T13:15:02.4583954Z 		at java.base/java.lang.reflect.Proxy$ProxyBuilder.<init>(Proxy.java:656)
2025-09-04T13:15:02.4584558Z 		at java.base/java.lang.reflect.Proxy.lambda$getProxyConstructor$0(Proxy.java:429)
2025-09-04T13:15:02.4585351Z 		at java.base/jdk.internal.loader.AbstractClassLoaderValue$Memoizer.get(AbstractClassLoaderValue.java:329)
2025-09-04T13:15:02.4586281Z 		at java.base/jdk.internal.loader.AbstractClassLoaderValue.computeIfAbsent(AbstractClassLoaderValue.java:205)
2025-09-04T13:15:02.4587097Z 		at java.base/java.lang.reflect.Proxy.getProxyConstructor(Proxy.java:427)
2025-09-04T13:15:02.4587898Z 		at java.base/java.lang.reflect.Proxy.newProxyInstance(Proxy.java:1037)
2025-09-04T13:15:02.4588815Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslUtils.setHandshakeApplicationProtocolSelector(BouncyCastleAlpnSslUtils.java:183)
2025-09-04T13:15:02.4589561Z 		... 36 more
2025-09-04T13:15:02.4589936Z 	Suppressed: org.bouncycastle.tls.TlsFatalAlert: handshake_failure(40)
2025-09-04T13:15:02.4590277Z 		... 135 more
2025-09-04T13:15:02.4590957Z 	Suppressed: java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "java.lang.Class.getMethods()" because "intf" is null
2025-09-04T13:15:02.4592163Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslUtils.setHandshakeApplicationProtocolSelector(BouncyCastleAlpnSslUtils.java:207)
2025-09-04T13:15:02.4593180Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine$1.accept(BouncyCastleAlpnSslEngine.java:35)
2025-09-04T13:15:02.4593995Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine$1.accept(BouncyCastleAlpnSslEngine.java:32)
2025-09-04T13:15:02.4594697Z 		at io.netty.handler.ssl.JdkAlpnSslEngine.<init>(JdkAlpnSslEngine.java:92)
2025-09-04T13:15:02.4595382Z 		at io.netty.handler.ssl.BouncyCastleAlpnSslEngine.<init>(BouncyCastleAlpnSslEngine.java:31)
2025-09-04T13:15:02.4596423Z 		at io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper.wrapSslEngine(JdkAlpnApplicationProtocolNegotiator.java:139)

Specifically,

2025-09-04T13:15:02.4517767Z 	Suppressed: java.lang.IllegalAccessException: class io.netty.handler.ssl.BouncyCastleAlpnSslUtils cannot access a member of class org.bouncycastle.jsse.provider.ProvSSLEngine with modifiers "public synchronized"

I'm really not sure what can be done at the Quarkus level. Looks like some changes happened at the Netty level.

I'll try to check the history of changes later this evening

This comment has been minimized.

@jponge
Copy link
Member Author

jponge commented Sep 4, 2025

Not sure about this. I just pushed the test fix commit to the 3.20 / 3.15 backports, let's see how these branches do.

@sberyozkin
Copy link
Member

I've opened netty/netty#15627

@jponge
Copy link
Member Author

jponge commented Sep 5, 2025

Discussion happening in netty/netty#15627 (comment)

@sberyozkin
Copy link
Member

@holly-cummins Hi Holly, Julien confirmed the Netty code related to loading BouncyCastle classes (JSSE ones in particular) caused two Quarkus BC JSSE integrations tests failing. Can you please have a look at the linked Netty issue, if you can spot something that can clarify why the Netty BouncyCastle class loading related update caused the failure, then please comment

@jponge
Copy link
Member Author

jponge commented Sep 5, 2025

@holly-cummins We're all good, this has been confirmed as a Netty bug 👍

@geoand
Copy link
Contributor

geoand commented Sep 5, 2025

Nice work everyone!

@sberyozkin
Copy link
Member

Thanks @jponge for independently confirming the regression with the local Netty build and working with Norman to verify his fix

@jponge
Copy link
Member Author

jponge commented Sep 5, 2025

My pleasure 😄 This is the magic of OSS (+ kudos Norman)

@jponge jponge changed the title Bump to Vert.x 4.5.21 and Netty 4.1.126.Final Bump to Vert.x 4.5.21 and Netty 4.1.127.Final Sep 8, 2025
jponge and others added 4 commits September 8, 2025 14:18
We override the authority here so we need to be extra careful.
Also fixes Vertx context being created in tests but never been cleared.

Co-authored-by: Clement Escoffier <[email protected]>
This fixes Netty/BouncyCastle issues.
@jponge
Copy link
Member Author

jponge commented Sep 8, 2025

@cescoffier see the last commit (and PR title already updated)

jponge added a commit to jponge/quarkus that referenced this pull request Sep 8, 2025
@jponge jponge requested a review from jmartisk September 8, 2025 15:26
@jponge jponge added the triage/waiting-for-ci Ready to merge when CI successfully finishes label Sep 8, 2025
Copy link

quarkus-bot bot commented Sep 8, 2025

Status for workflow Quarkus CI

This is the status report for running Quarkus CI on commit 8021e27.

✅ The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

You can consult the Develocity build scans.

Copy link
Contributor

@jmartisk jmartisk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, thanks a lot!

@jmartisk jmartisk merged commit a7ce614 into quarkusio:main Sep 8, 2025
57 checks passed
@quarkus-bot quarkus-bot bot added this to the 3.28 - main milestone Sep 8, 2025
@quarkus-bot quarkus-bot bot removed the triage/waiting-for-ci Ready to merge when CI successfully finishes label Sep 8, 2025
@jmartisk jmartisk modified the milestones: 3.28 - main, 3.26.3 Sep 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants