diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java index 87d20ebca1b..ef7b66aca72 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java @@ -28,7 +28,7 @@ import apache.rocketmq.v2.MessageType; import apache.rocketmq.v2.Resource; import apache.rocketmq.v2.SystemProperties; -import com.google.protobuf.ByteString; +import com.google.protobuf.UnsafeByteOperations; import com.google.protobuf.util.Timestamps; import java.net.SocketAddress; import java.util.Arrays; @@ -99,11 +99,15 @@ public Message buildMessage(MessageExt messageExt) { Resource topic = buildResource(messageExt.getTopic()); return Message.newBuilder() - .setTopic(topic) - .putAllUserProperties(userProperties) - .setSystemProperties(systemProperties) - .setBody(ByteString.copyFrom(messageExt.getBody())) - .build(); + .setTopic(topic) + .putAllUserProperties(userProperties) + .setSystemProperties(systemProperties) + // Safety: unsafeWrap() aliases the decoded body byte[]. + // The decoded body array must not be mutated or reused while the + // returned protobuf Message (or any serialized form of it) may still + // be referenced. + .setBody(UnsafeByteOperations.unsafeWrap(messageExt.getBody())) + .build(); } protected Map buildUserAttributes(MessageExt messageExt) {