6
0
forked from pool/netty

Compare commits

...

10 Commits

6 changed files with 150 additions and 778 deletions

View File

@@ -8,16 +8,12 @@ Subject: [PATCH 1/7] Remove optional dep Blockhound
.../java/io/netty/util/internal/Hidden.java | 200 ------
...ockhound.integration.BlockHoundIntegration | 14 -
pom.xml | 8 -
transport-blockhound-tests/pom.xml | 172 ------
.../NettyBlockHoundIntegrationTest.java | 569 ------------------
.../netty/util/internal/localhost_server.key | 28 -
.../netty/util/internal/localhost_server.pem | 17 -
.../io/netty/util/internal/mutual_auth_ca.pem | 19 -
9 files changed, 1032 deletions(-)
delete mode 100644 common/src/main/java/io/netty/util/internal/Hidden.java
delete mode 100644 common/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration
delete mode 100644 transport-blockhound-tests/pom.xml
delete mode 100644 transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java
delete mode 100644 transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key
delete mode 100644 transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.pem
delete mode 100644 transport-blockhound-tests/src/test/resources/io/netty/util/internal/mutual_auth_ca.pem
@@ -286,764 +282,11 @@ index 855fedf5e2..76f3dc1728 100644
- <dependency>
- <groupId>io.projectreactor.tools</groupId>
- <artifactId>blockhound</artifactId>
- <version>1.0.10.RELEASE</version>
- <version>1.0.13.RELEASE</version>
- </dependency>
</dependencies>
</dependencyManagement>
diff --git a/transport-blockhound-tests/pom.xml b/transport-blockhound-tests/pom.xml
deleted file mode 100644
index 89d0fc9ecc..0000000000
--- a/transport-blockhound-tests/pom.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright 2019 The Netty Project
- ~
- ~ The Netty Project licenses this file to you 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:
- ~
- ~ https://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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>io.netty</groupId>
- <artifactId>netty-parent</artifactId>
- <version>4.1.118.Final</version>
- </parent>
-
- <artifactId>netty-transport-blockhound-tests</artifactId>
- <packaging>jar</packaging>
- <description>
- Tests for the BlockHound integration.
- </description>
-
- <name>Netty/Transport/BlockHound/Tests</name>
-
- <profiles>
- <profile>
- <id>java13</id>
- <activation>
- <jdk>13</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java14</id>
- <activation>
- <jdk>14</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java15</id>
- <activation>
- <jdk>15</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java16</id>
- <activation>
- <jdk>16</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java17</id>
- <activation>
- <jdk>17</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java18</id>
- <activation>
- <jdk>18</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java19</id>
- <activation>
- <jdk>19</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java20</id>
- <activation>
- <jdk>20</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java21</id>
- <activation>
- <jdk>21</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- <profile>
- <id>java22</id>
- <activation>
- <jdk>22</jdk>
- </activation>
- <properties>
- <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
- </properties>
- </profile>
- </profiles>
-
- <properties>
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
- <!-- Needed for SelfSignedCertificate -->
- <argLine.java9.extras>--add-exports java.base/sun.security.x509=ALL-UNNAMED</argLine.java9.extras>
- <japicmp.skip>true</japicmp.skip>
- <!-- Do not deploy this module -->
- <skipDeploy>true</skipDeploy>
- <javaModuleName>io.netty.transport_blockhound_tests</javaModuleName>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>netty-transport</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>netty-handler</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>netty-resolver-dns</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>${tcnative.artifactId}</artifactId>
- <classifier>${tcnative.classifier}</classifier>
- <optional>true</optional>
- </dependency>
-
- <dependency>
- <groupId>org.bouncycastle</groupId>
- <artifactId>bcpkix-jdk15on</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>io.projectreactor.tools</groupId>
- <artifactId>blockhound</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java b/transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java
deleted file mode 100644
index 907fd864f3..0000000000
--- a/transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java
+++ /dev/null
@@ -1,569 +0,0 @@
-/*
- * Copyright 2019 The Netty Project
-
- * The Netty Project licenses this file to you 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:
-
- * https://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 io.netty.util.internal;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.PooledByteBufAllocator;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelFutureListener;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioDatagramChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.ssl.SslContext;
-import io.netty.handler.ssl.SslContextBuilder;
-import io.netty.handler.ssl.SslHandler;
-import io.netty.handler.ssl.SslHandshakeCompletionEvent;
-import io.netty.handler.ssl.SslProvider;
-import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
-import io.netty.handler.ssl.util.SelfSignedCertificate;
-import io.netty.resolver.dns.DnsNameResolverBuilder;
-import io.netty.resolver.dns.DnsServerAddressStreamProviders;
-import io.netty.util.HashedWheelTimer;
-import io.netty.util.ReferenceCountUtil;
-import io.netty.util.concurrent.DefaultThreadFactory;
-import io.netty.util.concurrent.EventExecutor;
-import io.netty.util.concurrent.FastThreadLocalThread;
-import io.netty.util.concurrent.GlobalEventExecutor;
-import io.netty.util.concurrent.ImmediateEventExecutor;
-import io.netty.util.concurrent.ImmediateExecutor;
-import io.netty.util.concurrent.ScheduledFuture;
-import io.netty.util.concurrent.SingleThreadEventExecutor;
-import io.netty.util.internal.Hidden.NettyBlockHoundIntegration;
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Timeout;
-import reactor.blockhound.BlockHound;
-import reactor.blockhound.BlockingOperationError;
-import reactor.blockhound.integration.BlockHoundIntegration;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Queue;
-import java.util.ServiceLoader;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static io.netty.buffer.Unpooled.wrappedBuffer;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
-
-public class NettyBlockHoundIntegrationTest {
-
- @BeforeAll
- public static void setUpClass() {
- BlockHound.install();
- }
-
- @Test
- public void testServiceLoader() {
- for (BlockHoundIntegration integration : ServiceLoader.load(BlockHoundIntegration.class)) {
- if (integration instanceof NettyBlockHoundIntegration) {
- return;
- }
- }
-
- fail("NettyBlockHoundIntegration cannot be loaded with ServiceLoader");
- }
-
- @Test
- public void testBlockingCallsInNettyThreads() throws Exception {
- final FutureTask<Void> future = new FutureTask<>(() -> {
- Thread.sleep(0);
- return null;
- });
- GlobalEventExecutor.INSTANCE.execute(future);
-
- try {
- future.get(5, TimeUnit.SECONDS);
- fail("Expected an exception due to a blocking call but none was thrown");
- } catch (ExecutionException e) {
- assertThat(e.getCause(), Matchers.instanceOf(BlockingOperationError.class));
- }
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testGlobalEventExecutorTakeTask() throws InterruptedException {
- testEventExecutorTakeTask(GlobalEventExecutor.INSTANCE);
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testSingleThreadEventExecutorTakeTask() throws InterruptedException {
- SingleThreadEventExecutor executor =
- new SingleThreadEventExecutor(null, new DefaultThreadFactory("test"), true) {
- @Override
- protected void run() {
- while (!confirmShutdown()) {
- Runnable task = takeTask();
- if (task != null) {
- task.run();
- }
- }
- }
- };
- testEventExecutorTakeTask(executor);
- }
-
- private static void testEventExecutorTakeTask(EventExecutor eventExecutor) throws InterruptedException {
- CountDownLatch latch = new CountDownLatch(1);
- ScheduledFuture<?> f = eventExecutor.schedule(latch::countDown, 10, TimeUnit.MILLISECONDS);
- f.sync();
- latch.await();
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testSingleThreadEventExecutorAddTask() throws Exception {
- TestLinkedBlockingQueue<Runnable> taskQueue = new TestLinkedBlockingQueue<>();
- SingleThreadEventExecutor executor =
- new SingleThreadEventExecutor(null, new DefaultThreadFactory("test"), true) {
- @Override
- protected Queue<Runnable> newTaskQueue(int maxPendingTasks) {
- return taskQueue;
- }
-
- @Override
- protected void run() {
- while (!confirmShutdown()) {
- Runnable task = takeTask();
- if (task != null) {
- task.run();
- }
- }
- }
- };
- taskQueue.emulateContention();
- CountDownLatch latch = new CountDownLatch(1);
- executor.submit(() -> {
- executor.execute(() -> { }); // calls addTask
- latch.countDown();
- });
- taskQueue.waitUntilContented();
- taskQueue.removeContention();
- latch.await();
- }
-
- @Test
- void permittingBlockingCallsInFastThreadLocalThreadSubclass() throws Exception {
- final FutureTask<Void> future = new FutureTask<>(() -> {
- Thread.sleep(0);
- return null;
- });
- FastThreadLocalThread thread = new FastThreadLocalThread(future) {
- @Override
- public boolean permitBlockingCalls() {
- return true; // The Thread.sleep(0) call should not be flagged because we allow blocking calls.
- }
- };
- thread.start();
- future.get(5, TimeUnit.SECONDS);
- thread.join();
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testHashedWheelTimerStartStop() throws Exception {
- HashedWheelTimer timer = new HashedWheelTimer();
- Future<?> futureStart = GlobalEventExecutor.INSTANCE.submit(timer::start);
- futureStart.get(5, TimeUnit.SECONDS);
- Future<?> futureStop = GlobalEventExecutor.INSTANCE.submit(timer::stop);
- futureStop.get(5, TimeUnit.SECONDS);
- }
-
- // Tests copied from io.netty.handler.ssl.SslHandlerTest
- @Test
- public void testHandshakeWithExecutorThatExecuteDirectory() throws Exception {
- testHandshakeWithExecutor(Runnable::run, "TLSv1.2");
- }
-
- @Test
- public void testHandshakeWithExecutorThatExecuteDirectoryTLSv13() throws Exception {
- assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
- testHandshakeWithExecutor(Runnable::run, "TLSv1.3");
- }
-
- @Test
- public void testHandshakeWithImmediateExecutor() throws Exception {
- testHandshakeWithExecutor(ImmediateExecutor.INSTANCE, "TLSv1.2");
- }
-
- @Test
- public void testHandshakeWithImmediateExecutorTLSv13() throws Exception {
- assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
- testHandshakeWithExecutor(ImmediateExecutor.INSTANCE, "TLSv1.3");
- }
-
- @Test
- public void testHandshakeWithImmediateEventExecutor() throws Exception {
- testHandshakeWithExecutor(ImmediateEventExecutor.INSTANCE, "TLSv1.2");
- }
-
- @Test
- public void testHandshakeWithImmediateEventExecutorTLSv13() throws Exception {
- assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
- testHandshakeWithExecutor(ImmediateEventExecutor.INSTANCE, "TLSv1.3");
- }
-
- @Test
- public void testHandshakeWithExecutor() throws Exception {
- ExecutorService executorService = Executors.newCachedThreadPool();
- try {
- testHandshakeWithExecutor(executorService, "TLSv1.2");
- } finally {
- executorService.shutdown();
- }
- }
-
- @Test
- public void testHandshakeWithExecutorTLSv13() throws Exception {
- assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
- ExecutorService executorService = Executors.newCachedThreadPool();
- try {
- testHandshakeWithExecutor(executorService, "TLSv1.3");
- } finally {
- executorService.shutdown();
- }
- }
-
- @Test
- public void testTrustManagerVerifyJDK() throws Exception {
- testTrustManagerVerify(SslProvider.JDK, "TLSv1.2");
- }
-
- @Test
- public void testTrustManagerVerifyTLSv13JDK() throws Exception {
- assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
- testTrustManagerVerify(SslProvider.JDK, "TLSv1.3");
- }
-
- @Test
- public void testTrustManagerVerifyOpenSSL() throws Exception {
- testTrustManagerVerify(SslProvider.OPENSSL, "TLSv1.2");
- }
-
- @Test
- public void testTrustManagerVerifyTLSv13OpenSSL() throws Exception {
- assumeTrue(SslProvider.isTlsv13Supported(SslProvider.OPENSSL));
- testTrustManagerVerify(SslProvider.OPENSSL, "TLSv1.3");
- }
-
- @Test
- public void testSslHandlerWrapAllowsBlockingCalls() throws Exception {
- final SslContext sslClientCtx =
- SslContextBuilder.forClient()
- .trustManager(InsecureTrustManagerFactory.INSTANCE)
- .sslProvider(SslProvider.JDK)
- .build();
- final SslHandler sslHandler = sslClientCtx.newHandler(UnpooledByteBufAllocator.DEFAULT);
- final EventLoopGroup group = new NioEventLoopGroup();
- final CountDownLatch activeLatch = new CountDownLatch(1);
- final AtomicReference<Throwable> error = new AtomicReference<>();
-
- Channel sc = null;
- Channel cc = null;
- try {
- sc = new ServerBootstrap()
- .group(group)
- .channel(NioServerSocketChannel.class)
- .childHandler(new ChannelInboundHandlerAdapter())
- .bind(new InetSocketAddress(0))
- .syncUninterruptibly()
- .channel();
-
- cc = new Bootstrap()
- .group(group)
- .channel(NioSocketChannel.class)
- .handler(new ChannelInitializer<Channel>() {
-
- @Override
- protected void initChannel(Channel ch) {
- ch.pipeline().addLast(sslHandler);
- ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) {
- activeLatch.countDown();
- }
-
- @Override
- public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
- if (evt instanceof SslHandshakeCompletionEvent &&
- ((SslHandshakeCompletionEvent) evt).cause() != null) {
- Throwable cause = ((SslHandshakeCompletionEvent) evt).cause();
- cause.printStackTrace();
- error.set(cause);
- }
- ctx.fireUserEventTriggered(evt);
- }
- });
- }
- })
- .connect(sc.localAddress())
- .addListener((ChannelFutureListener) future ->
- future.channel().writeAndFlush(wrappedBuffer(new byte [] { 1, 2, 3, 4 })))
- .syncUninterruptibly()
- .channel();
-
- assertTrue(activeLatch.await(5, TimeUnit.SECONDS));
- assertNull(error.get());
- } finally {
- if (cc != null) {
- cc.close().syncUninterruptibly();
- }
- if (sc != null) {
- sc.close().syncUninterruptibly();
- }
- group.shutdownGracefully();
- ReferenceCountUtil.release(sslClientCtx);
- }
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void pooledBufferAllocation() throws Exception {
- AtomicLong iterationCounter = new AtomicLong();
- PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
- FutureTask<Void> task = new FutureTask<>(() -> {
- List<ByteBuf> buffers = new ArrayList<>();
- long count;
- do {
- count = iterationCounter.get();
- } while (count == 0);
- for (int i = 0; i < 13; i++) {
- int size = 8 << i;
- buffers.add(allocator.ioBuffer(size, size));
- }
- for (ByteBuf buffer : buffers) {
- buffer.release();
- }
- return null;
- });
- FastThreadLocalThread thread = new FastThreadLocalThread(task);
- thread.start();
- do {
- allocator.dumpStats(); // This will take internal pool locks and we'll race with the thread.
- iterationCounter.set(1);
- } while (thread.isAlive());
- thread.join();
- task.get();
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testUnixResolverDnsServerAddressStreamProvider_Parse() throws InterruptedException {
- doTestParseResolverFilesAllowsBlockingCalls(DnsServerAddressStreamProviders::unixDefault);
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testHostsFileParser_Parse() throws InterruptedException {
- doTestParseResolverFilesAllowsBlockingCalls(DnsNameResolverBuilder::new);
- }
-
- @Test
- @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
- public void testUnixResolverDnsServerAddressStreamProvider_ParseEtcResolverSearchDomainsAndOptions()
- throws InterruptedException {
- NioEventLoopGroup group = new NioEventLoopGroup();
- try {
- DnsNameResolverBuilder builder = new DnsNameResolverBuilder(group.next())
- .datagramChannelFactory(NioDatagramChannel::new);
- doTestParseResolverFilesAllowsBlockingCalls(builder::build);
- } finally {
- group.shutdownGracefully();
- }
- }
-
- private static void doTestParseResolverFilesAllowsBlockingCalls(Callable<Object> callable)
- throws InterruptedException {
- SingleThreadEventExecutor executor =
- new SingleThreadEventExecutor(null, new DefaultThreadFactory("test"), true) {
- @Override
- protected void run() {
- while (!confirmShutdown()) {
- Runnable task = takeTask();
- if (task != null) {
- task.run();
- }
- }
- }
- };
- try {
- CountDownLatch latch = new CountDownLatch(1);
- List<Object> result = new ArrayList<>();
- List<Throwable> error = new ArrayList<>();
- executor.execute(() -> {
- try {
- result.add(callable.call());
- } catch (Throwable t) {
- error.add(t);
- }
- latch.countDown();
- });
- latch.await();
- assertEquals(0, error.size());
- assertEquals(1, result.size());
- } finally {
- executor.shutdownGracefully();
- }
- }
-
- private static void testTrustManagerVerify(SslProvider provider, String tlsVersion) throws Exception {
- final SslContext sslClientCtx =
- SslContextBuilder.forClient()
- .sslProvider(provider)
- .protocols(tlsVersion)
- .trustManager(ResourcesUtil.getFile(
- NettyBlockHoundIntegrationTest.class, "mutual_auth_ca.pem"))
- .build();
-
- final SslContext sslServerCtx =
- SslContextBuilder.forServer(ResourcesUtil.getFile(
- NettyBlockHoundIntegrationTest.class, "localhost_server.pem"),
- ResourcesUtil.getFile(
- NettyBlockHoundIntegrationTest.class, "localhost_server.key"),
- null)
- .sslProvider(provider)
- .protocols(tlsVersion)
- .build();
-
- final SslHandler clientSslHandler = sslClientCtx.newHandler(UnpooledByteBufAllocator.DEFAULT);
- final SslHandler serverSslHandler = sslServerCtx.newHandler(UnpooledByteBufAllocator.DEFAULT);
-
- testHandshake(sslClientCtx, clientSslHandler, serverSslHandler);
- }
-
- private static void testHandshakeWithExecutor(Executor executor, String tlsVersion) throws Exception {
- final SslContext sslClientCtx = SslContextBuilder.forClient()
- .trustManager(InsecureTrustManagerFactory.INSTANCE)
- .sslProvider(SslProvider.JDK).protocols(tlsVersion).build();
-
- final SelfSignedCertificate cert = new SelfSignedCertificate();
- final SslContext sslServerCtx = SslContextBuilder.forServer(cert.key(), cert.cert())
- .sslProvider(SslProvider.JDK).protocols(tlsVersion).build();
-
- final SslHandler clientSslHandler = sslClientCtx.newHandler(UnpooledByteBufAllocator.DEFAULT, executor);
- final SslHandler serverSslHandler = sslServerCtx.newHandler(UnpooledByteBufAllocator.DEFAULT, executor);
-
- testHandshake(sslClientCtx, clientSslHandler, serverSslHandler);
- }
-
- private static void testHandshake(SslContext sslClientCtx, SslHandler clientSslHandler,
- SslHandler serverSslHandler) throws Exception {
- EventLoopGroup group = new NioEventLoopGroup();
- Channel sc = null;
- Channel cc = null;
- try {
- sc = new ServerBootstrap()
- .group(group)
- .channel(NioServerSocketChannel.class)
- .childHandler(serverSslHandler)
- .bind(new InetSocketAddress(0)).syncUninterruptibly().channel();
-
- ChannelFuture future = new Bootstrap()
- .group(group)
- .channel(NioSocketChannel.class)
- .handler(new ChannelInitializer<Channel>() {
- @Override
- protected void initChannel(Channel ch) {
- ch.pipeline()
- .addLast(clientSslHandler)
- .addLast(new ChannelInboundHandlerAdapter() {
-
- @Override
- public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
- if (evt instanceof SslHandshakeCompletionEvent &&
- ((SslHandshakeCompletionEvent) evt).cause() != null) {
- ((SslHandshakeCompletionEvent) evt).cause().printStackTrace();
- }
- ctx.fireUserEventTriggered(evt);
- }
- });
- }
- }).connect(sc.localAddress());
- cc = future.syncUninterruptibly().channel();
-
- clientSslHandler.handshakeFuture().await().sync();
- serverSslHandler.handshakeFuture().await().sync();
- } finally {
- if (cc != null) {
- cc.close().syncUninterruptibly();
- }
- if (sc != null) {
- sc.close().syncUninterruptibly();
- }
- group.shutdownGracefully();
- ReferenceCountUtil.release(sslClientCtx);
- }
- }
-
- private static class TestLinkedBlockingQueue<T> extends LinkedBlockingQueue<T> {
-
- private final ReentrantLock lock = new ReentrantLock();
-
- @Override
- public boolean offer(T t) {
- lock.lock();
- try {
- return super.offer(t);
- } finally {
- lock.unlock();
- }
- }
-
- void emulateContention() {
- lock.lock();
- }
-
- void waitUntilContented() throws InterruptedException {
- // wait until the lock gets contended
- while (lock.getQueueLength() == 0) {
- Thread.sleep(10L);
- }
- }
-
- void removeContention() {
- lock.unlock();
- }
- }
-}
diff --git a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key b/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key
deleted file mode 100644
index 9aa6611400..0000000000

View File

@@ -220,7 +220,7 @@ diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDec
index 3b1134b038..c2f3150bfd 100644
--- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecompressor.java
+++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecompressor.java
@@ -15,22 +15,14 @@
@@ -15,23 +15,15 @@
*/
package io.netty.handler.codec.http;
@@ -231,6 +231,7 @@ index 3b1134b038..c2f3150bfd 100644
import static io.netty.handler.codec.http.HttpHeaderValues.X_GZIP;
-import static io.netty.handler.codec.http.HttpHeaderValues.SNAPPY;
-import static io.netty.handler.codec.http.HttpHeaderValues.ZSTD;
import static io.netty.util.internal.ObjectUtil.checkPositiveOrZero;
import io.netty.channel.embedded.EmbeddedChannel;
-import io.netty.handler.codec.compression.Brotli;
@@ -245,7 +246,7 @@ index 3b1134b038..c2f3150bfd 100644
* Decompresses an {@link HttpMessage} and an {@link HttpContent} compressed in
@@ -72,20 +64,6 @@ public class HttpContentDecompressor extends HttpContentDecoder {
return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper));
ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper, maxAllocation));
}
- if (Brotli.isAvailable() && BR.contentEqualsIgnoreCase(contentEncoding)) {
- return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
@@ -399,7 +400,7 @@ index 88245d1116..de44d6013b 100644
import static io.netty.util.internal.ObjectUtil.checkNotNull;
@@ -181,18 +173,6 @@ public class DelegatingDecompressorFrameListener extends Http2FrameListenerDecor
return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),
ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper));
ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper, maxAllocation));
}
- if (Brotli.isAvailable() && BR.contentEqualsIgnoreCase(contentEncoding)) {
- return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(),

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:641391ffdfce591392603eec9f396ded2d9eaf22c63eac5d8a28799fa17300a2
size 3193348

BIN
netty-4.1.124.Final.tar.gz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -1,3 +1,128 @@
-------------------------------------------------------------------
Fri Aug 22 05:25:09 UTC 2025 - Fridrich Strba <fstrba@suse.com>
- Upgrade to upstream version 4.1.124
* Fixes
+ MadeYouReset HTTP/2 DDoS vulnerability
(CVE-2025-55163, bsc#1247991)
+ Fix NPE and AssertionErrors when many tasks are scheduled and
cancelled
+ HTTP2: Http2ConnectionHandler should always use
Http2ConnectionEncoder
+ Epoll: Correctly handle UDP packets with source port of 0
+ Fix netty-common OSGi Import-Package header
+ MqttConnectPayload.toString() includes password
- Modified patches:
* 0001-Remove-optional-dep-Blockhound.patch
* 0002-Remove-optional-dep-conscrypt.patch
* 0003-Remove-optional-deps-jetty-alpn-and-npn.patch
* 0004-Disable-Brotli-and-ZStd-compression.patch
+ rediff
-------------------------------------------------------------------
Thu Jul 24 18:11:55 UTC 2025 - Fridrich Strba <fstrba@suse.com>
- Upgrade to upsteam version 4.1.123
* Fixes
+ Fix chunk reuse bug in adaptive allocator
+ More accurate adaptive memory usage accounting
+ Introduce size-classes for the adaptive allocator
+ Reduce magazine proliferation eagerness
+ Fix concurrent ByteBuffer access issue in
AdaptiveByteBuf.getBytes
+ Fix possible buffer corruption caused by incorrect
setCharSequence(...) implementation
+ AdaptiveByteBuf: Fix AdaptiveByteBuf.maxFastWritableBytes()
to take writerIndex() into account
+ Optimize capacity bumping for adaptive ByteBufs
+ AbstractDnsRecord: equals() and hashCode() to ignore name
field's case
+ Backport Unsafe guards
+ Guard recomputed offset access with hasUnsafe
+ HTTP2: Always produce a RST frame on stream exception
+ Correct what artifacts included in netty-bom
- Modified patches:
* 0001-Remove-optional-dep-Blockhound.patch
* 0002-Remove-optional-dep-conscrypt.patch
* 0003-Remove-optional-deps-jetty-alpn-and-npn.patch
* 0004-Disable-Brotli-and-ZStd-compression.patch
+ rediff
-------------------------------------------------------------------
Mon Jun 9 10:45:10 UTC 2025 - Fridrich Strba <fstrba@suse.com>
- Upgrade to upstream version 4.1.122
* Fixes of 4.1.122
+ DirContextUtils.addNameServer(...) should just catch Exception
internally
+ Make public API specify explicit maxAllocation to prevent OOM
+ Fix concurrent ByteBuf write access bug in adaptive allocator
+ Fix transport-native-kqueue Bundle-SymbolicNames
+ Fix resolver-dns-native-macos Bundle-SymbolicNames
+ Always correctly calculate the memory address of the ByteBuf
even if sun.misc.Unsafe is not usable
+ Upgrade lz4 dependencies as the old version did not correctly
handle ByteBuffer that have an arrayOffset > 0
+ Optimize ByteBuf.setCharSequence for adaptive allocator
+ Kqueue: Fix registration failure when fd is reused
+ Make JdkZlibEncoder accept Deflater.DEFAULT_COMPRESSION as
level
+ Ensure OpenSsl.availableJavaCipherSuites does not contain null
values
+ Always prefer direct buffers for pooled allocators if not
explicit disabled
+ Update to netty-tcnative 2.0.72.Final
+ Re-enable sun.misc.Unsafe by default on Java 24+
+ Kqueue: Delay removal from registration map to fix noisy
warnings
* Fixes of 4.1.121
+ Epoll.isAvailable() returns false on Ubuntu 20.04/22.04 arch
amd64
+ Fix transport-native-epoll Bundle-SymbolicNames
* Fixes of 4.1.120
+ Fix flawed termination condition check in
HttpPostRequestEncoder#encodeNextChunkUrlEncoded(int) for
current InterfaceHttpData
+ Exposed decoderEnforceMaxConsecutiveEmptyDataFrames and
decoderEnforceMaxRstFramesPerWindow
+ ThreadExecutorMap must restore old EventExecutor
+ Make Recycler virtual thread friendly
+ Disable sun.misc.Unsafe by default on Java 24+
+ Adaptive: Correctly enforce leak detection when using
AdaptiveByteBufAllocator
+ Add suppressed exception to original cause when calling
Future.sync*
+ Add SETTINGS_ENABLE_CONNECT_PROTOCOL to the default HTTP/2
settings
+ Correct computation for suboptimal chunk retirement
probability
+ Fix bug in method
AdaptivePoolingAllocator.allocateWithoutLock(...)
+ Fix a Bytebuf leak in TcpDnsQueryDecoder
+ SSL: Clear native error if named group is not supported
+ WebSocketClientCompressionHandler shouldn't claim window bits
support when jzlib is not available
+ Fix the assignment error of maxQoS parameter in ConnAck
Properties
* Fixes of 4.1.119
+ Replace SSL assertion with explicit record length check
+ Fix NPE when upgrade message fails to aggregate
+ SslHandler: Fix possible NPE when executor is used for
delegating
+ Consistently add channel info in HTTP/2 logs
+ Add QueryStringDecoder option to leave '+' alone
+ Use initialized BouncyCastle providers when available
- Modified patches:
* 0001-Remove-optional-dep-Blockhound.patch
* 0002-Remove-optional-dep-conscrypt.patch
* 0004-Disable-Brotli-and-ZStd-compression.patch
+ rediff
-------------------------------------------------------------------
Thu Mar 27 22:03:11 UTC 2025 - Fridrich Strba <fstrba@suse.com>
- Fix pom.xml errors that will be fatal with Maven 4
-------------------------------------------------------------------
Tue Feb 11 14:38:06 UTC 2025 - Fridrich Strba <fstrba@suse.com>

View File

@@ -1,7 +1,7 @@
#
# spec file for package netty
#
# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2025 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
%global namedreltag .Final
%global namedversion %{version}%{?namedreltag}
Name: netty
Version: 4.1.118
Version: 4.1.124
Release: 0
Summary: An asynchronous event-driven network application framework and tools for Java
License: Apache-2.0
@@ -120,21 +120,12 @@ BuildArch: noarch
%{java_remove_annotations} common -p "org.jetbrains.annotations"
# remove unnecessary dependency on parent POM
%pom_remove_parent . bom dev-tools
%pom_remove_parent . bom
# Not needed for RPM builds
%pom_disable_module "example"
%pom_disable_module "microbench"
%pom_xpath_inject 'pom:plugin[pom:artifactId="maven-remote-resources-plugin"]' '
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-dev-tools</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>'
%pom_remove_plugin :maven-antrun-plugin
%pom_remove_plugin :maven-dependency-plugin
%pom_remove_plugin :xml-maven-plugin
@@ -152,6 +143,8 @@ BuildArch: noarch
%pom_remove_plugin -r :forbiddenapis
%pom_remove_plugin -r :revapi-maven-plugin
%pom_remove_plugin -r :bom-helper-maven-plugin
%pom_remove_plugin -r :central-publishing-maven-plugin
%pom_remove_plugin -r :nexus-staging-maven-plugin
%pom_remove_plugin :duplicate-finder-maven-plugin all
cp %{SOURCE1} common/codegen.bash
@@ -191,7 +184,7 @@ rm codec/src/main/java/io/netty/handler/codec/marshalling/*
rm codec/src/*/java/io/netty/handler/codec/compression/Lzma*.java
%pom_remove_dep -r com.ning:compress-lzf
rm codec/src/*/java/io/netty/handler/codec/compression/Lzf*.java
%pom_remove_dep -r net.jpountz.lz4:lz4
%pom_remove_dep -r org.lz4:lz4-java
rm codec/src/*/java/io/netty/handler/codec/compression/Lz4*.java
%pom_remove_dep -r com.aayushatharva.brotli4j:
rm codec/src/*/java/io/netty/handler/codec/compression/Brotli*.java
@@ -204,6 +197,9 @@ rm codec/src/*/java/io/netty/handler/codec/compression/Zstd*.java
%pom_disable_module transport-udt
%pom_remove_dep -r :netty-transport-udt
%pom_remove_dep -r :netty-build-common
%pom_remove_dep :netty-dev-tools
# Disable macos native bit
%pom_disable_module resolver-dns-native-macos
%pom_remove_dep -r :netty-resolver-dns-native-macos
@@ -228,8 +224,16 @@ unzip %{SOURCE2} -d transport-native-unix-common/target/netty-jni-util
# Upstream has jctools bundled.
%pom_xpath_remove "pom:build/pom:plugins/pom:plugin[pom:artifactId = 'maven-bundle-plugin']/pom:executions/pom:execution[pom:id = 'generate-manifest']/pom:configuration/pom:instructions/pom:Import-Package" common/pom.xml
%pom_xpath_inject "pom:project" '
<properties><javaModuleName>io.netty.dev.tools</javaModuleName></properties>
' dev-tools
%pom_remove_dep -r :annotations-java5
%pom_xpath_remove "pom:profiles/pom:profile[pom:id = 'staging']" all
%pom_xpath_remove "pom:plugins/pom:plugin/pom:configuration/pom:flattenDependencyMode" all
# Tell xmvn to install attached artifact, which it does not
# do by default. In this case install all attached artifacts with
# the linux classifier.
@@ -243,7 +247,6 @@ unzip %{SOURCE2} -d transport-native-unix-common/target/netty-jni-util
%build
%{mvn_build} -f -- \
-Dproject.build.outputTimestamp=$(date -u -d @${SOURCE_DATE_EPOCH:-$(date +%%s)} +%%Y-%%m-%%dT%%H:%%M:%%SZ) \
-Dsource=8
%install