Merge branch 'patch-netty-memory-leak' into 'dev'

Fix #915 : netty memory leak

See merge request morningstar/Arcturus-Community!338
This commit is contained in:
skeletor 2020-11-29 16:03:50 -05:00
commit 1bb8719cab
2 changed files with 12 additions and 15 deletions

View File

@ -17,13 +17,13 @@ public class GameByteDecryption extends ByteToMessageDecoder {
@Override @Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
// Read all available bytes. // Read all available bytes.
byte[] data = in.readBytes(in.readableBytes()).array(); ByteBuf data = in.readBytes(in.readableBytes());
// Decrypt. // Decrypt.
ctx.channel().attr(GameServerAttributes.CRYPTO_CLIENT).get().parse(data); ctx.channel().attr(GameServerAttributes.CRYPTO_CLIENT).get().parse(data.array());
// Continue in the pipeline. // Continue in the pipeline.
out.add(Unpooled.wrappedBuffer(data)); out.add(data);
} }
} }

View File

@ -6,28 +6,25 @@ import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise; import io.netty.channel.ChannelPromise;
import io.netty.util.ReferenceCountUtil;
public class GameByteEncryption extends ChannelOutboundHandlerAdapter { public class GameByteEncryption extends ChannelOutboundHandlerAdapter {
@Override @Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
// Convert msg to ByteBuf. // convert to Bytebuf
ByteBuf out = (ByteBuf) msg; ByteBuf in = (ByteBuf) msg;
// Read all available bytes. // read available bytes
byte[] data; ByteBuf data = (in).readBytes(in.readableBytes());
if (out.hasArray()) { //release old object
data = out.array(); ReferenceCountUtil.release(in);
} else {
data = out.readBytes(out.readableBytes()).array();
}
// Encrypt. // Encrypt.
ctx.channel().attr(GameServerAttributes.CRYPTO_SERVER).get().parse(data); ctx.channel().attr(GameServerAttributes.CRYPTO_SERVER).get().parse(data.array());
// Continue in the pipeline. // Continue in the pipeline.
ctx.write(Unpooled.wrappedBuffer(data)); ctx.write(data, promise);
} }
} }