You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by zh...@apache.org on 2022/09/19 02:11:21 UTC

[rocketmq] 02/07: [ISSUE #5097] fix illegal reflective access (#5098)

This is an automated email from the ASF dual-hosted git repository.

zhoubo pushed a commit to branch release-5.0.0
in repository https://gitbox.apache.org/repos/asf/rocketmq.git

commit afea709ac9ab660974d30cc6f10a53b665203e1f
Author: SSpirits <ad...@lv5.moe>
AuthorDate: Fri Sep 16 18:11:22 2022 +0800

    [ISSUE #5097] fix illegal reflective access (#5098)
---
 .../java/org/apache/rocketmq/common/UtilAll.java   | 32 ++++++++++++++--------
 pom.xml                                            |  2 +-
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java
index 565de7549..8c175e966 100644
--- a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java
+++ b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
@@ -42,11 +43,15 @@ import java.util.Map;
 import java.util.zip.CRC32;
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
+import org.apache.commons.lang3.JavaVersion;
+import org.apache.commons.lang3.SystemUtils;
 import org.apache.commons.validator.routines.InetAddressValidator;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
+import sun.misc.Unsafe;
+import sun.nio.ch.DirectBuffer;
 
 public class UtilAll {
     private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
@@ -670,7 +675,19 @@ public class UtilAll {
         if (buffer == null || !buffer.isDirect() || buffer.capacity() == 0) {
             return;
         }
-        invoke(invoke(viewed(buffer), "cleaner"), "clean");
+        if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_9)) {
+            try {
+                Field field = Unsafe.class.getDeclaredField("theUnsafe");
+                field.setAccessible(true);
+                Unsafe unsafe = (Unsafe) field.get(null);
+                Method cleaner = method(unsafe, "invokeCleaner", new Class[] {ByteBuffer.class});
+                cleaner.invoke(unsafe, viewed(buffer));
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        } else {
+            invoke(invoke(viewed(buffer), "cleaner"), "clean");
+        }
     }
 
     public static Object invoke(final Object target, final String methodName, final Class<?>... args) {
@@ -697,17 +714,10 @@ public class UtilAll {
     }
 
     private static ByteBuffer viewed(ByteBuffer buffer) {
-        String methodName = "viewedBuffer";
-
-        Method[] methods = buffer.getClass().getMethods();
-        for (Method method : methods) {
-            if (method.getName().equals("attachment")) {
-                methodName = "attachment";
-                break;
-            }
+        if (!buffer.isDirect()) {
+            throw new IllegalArgumentException("buffer is non-direct");
         }
-
-        ByteBuffer viewedBuffer = (ByteBuffer) invoke(buffer, methodName);
+        ByteBuffer viewedBuffer = (ByteBuffer) ((DirectBuffer) buffer).attachment();
         if (viewedBuffer == null) {
             return buffer;
         } else {
diff --git a/pom.xml b/pom.xml
index 6b0e20ca8..feeb8d3ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -108,7 +108,7 @@
         <fastjson.version>1.2.69_noneautotype</fastjson.version>
         <javassist.version>3.20.0-GA</javassist.version>
         <jna.version>4.2.2</jna.version>
-        <commons-lang3.version>3.4</commons-lang3.version>
+        <commons-lang3.version>3.12.0</commons-lang3.version>
         <commons-io.version>2.7</commons-io.version>
         <guava.version>31.0.1-jre</guava.version>
         <openmessaging.version>0.3.1-alpha</openmessaging.version>