From c6e0458159f69eac87bdcd708cb2efd237145979 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 16 May 2026 14:19:07 -0700 Subject: [PATCH] Limit for custom frame decoders --- src/main/java/org/traccar/BaseFrameDecoder.java | 13 +++++++++++++ .../java/org/traccar/protocol/AdmFrameDecoder.java | 5 +++++ .../org/traccar/protocol/AtrackFrameDecoder.java | 5 +++++ .../org/traccar/protocol/DualcamFrameDecoder.java | 5 +++++ .../org/traccar/protocol/FifotrackFrameDecoder.java | 5 +++++ .../org/traccar/protocol/GalileoFrameDecoder.java | 5 +++++ .../java/org/traccar/protocol/Gt06FrameDecoder.java | 5 +++++ .../org/traccar/protocol/Jt1078FrameDecoder.java | 5 +++++ .../org/traccar/protocol/Jt808FrameDecoder.java | 5 +++++ .../org/traccar/protocol/MeiligaoFrameDecoder.java | 5 +++++ .../org/traccar/protocol/MeitrackFrameDecoder.java | 5 +++++ .../org/traccar/protocol/Pt502FrameDecoder.java | 5 +++++ .../org/traccar/protocol/TeltonikaFrameDecoder.java | 5 +++++ .../org/traccar/protocol/WatchFrameDecoder.java | 5 +++++ 14 files changed, 78 insertions(+) diff --git a/src/main/java/org/traccar/BaseFrameDecoder.java b/src/main/java/org/traccar/BaseFrameDecoder.java index f90f90e4b..f9f3e5e76 100644 --- a/src/main/java/org/traccar/BaseFrameDecoder.java +++ b/src/main/java/org/traccar/BaseFrameDecoder.java @@ -19,16 +19,29 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.TooLongFrameException; import java.util.List; public abstract class BaseFrameDecoder extends ByteToMessageDecoder { + private final int maxFrameLength; + + protected BaseFrameDecoder() { + this(BaseProtocol.MAX_FRAME_LENGTH); + } + + protected BaseFrameDecoder(int maxFrameLength) { + this.maxFrameLength = maxFrameLength; + } + @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { Object decoded = decode(ctx, ctx != null ? ctx.channel() : null, in); if (decoded != null) { out.add(decoded); + } else if (in.readableBytes() > maxFrameLength) { + throw new TooLongFrameException("Frame exceeds " + maxFrameLength + " bytes"); } } diff --git a/src/main/java/org/traccar/protocol/AdmFrameDecoder.java b/src/main/java/org/traccar/protocol/AdmFrameDecoder.java index 7ee9b6874..5a81d8e8a 100644 --- a/src/main/java/org/traccar/protocol/AdmFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/AdmFrameDecoder.java @@ -19,9 +19,14 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class AdmFrameDecoder extends BaseFrameDecoder { + public AdmFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/AtrackFrameDecoder.java b/src/main/java/org/traccar/protocol/AtrackFrameDecoder.java index 8ed1fc8e8..1b5e87d07 100644 --- a/src/main/java/org/traccar/protocol/AtrackFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/AtrackFrameDecoder.java @@ -19,6 +19,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; import org.traccar.helper.BufferUtil; import java.nio.charset.StandardCharsets; @@ -27,6 +28,10 @@ public class AtrackFrameDecoder extends BaseFrameDecoder { private static final int KEEPALIVE_LENGTH = 12; + public AtrackFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/DualcamFrameDecoder.java b/src/main/java/org/traccar/protocol/DualcamFrameDecoder.java index 312d43f19..fdb9bd25f 100644 --- a/src/main/java/org/traccar/protocol/DualcamFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/DualcamFrameDecoder.java @@ -19,11 +19,16 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class DualcamFrameDecoder extends BaseFrameDecoder { private static final int MESSAGE_MINIMUM_LENGTH = 4; + public DualcamFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/FifotrackFrameDecoder.java b/src/main/java/org/traccar/protocol/FifotrackFrameDecoder.java index 967b17a64..0aae69932 100644 --- a/src/main/java/org/traccar/protocol/FifotrackFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/FifotrackFrameDecoder.java @@ -19,11 +19,16 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; import java.nio.charset.StandardCharsets; public class FifotrackFrameDecoder extends BaseFrameDecoder { + public FifotrackFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/GalileoFrameDecoder.java b/src/main/java/org/traccar/protocol/GalileoFrameDecoder.java index d90e48287..5d1ccc01e 100644 --- a/src/main/java/org/traccar/protocol/GalileoFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/GalileoFrameDecoder.java @@ -19,11 +19,16 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class GalileoFrameDecoder extends BaseFrameDecoder { private static final int MESSAGE_MINIMUM_LENGTH = 6; + public GalileoFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/Gt06FrameDecoder.java b/src/main/java/org/traccar/protocol/Gt06FrameDecoder.java index cc934be42..2b9ecf4a2 100644 --- a/src/main/java/org/traccar/protocol/Gt06FrameDecoder.java +++ b/src/main/java/org/traccar/protocol/Gt06FrameDecoder.java @@ -19,9 +19,14 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class Gt06FrameDecoder extends BaseFrameDecoder { + public Gt06FrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/Jt1078FrameDecoder.java b/src/main/java/org/traccar/protocol/Jt1078FrameDecoder.java index 973acb34b..9141b0e3c 100644 --- a/src/main/java/org/traccar/protocol/Jt1078FrameDecoder.java +++ b/src/main/java/org/traccar/protocol/Jt1078FrameDecoder.java @@ -19,10 +19,15 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; import org.traccar.helper.BitUtil; public class Jt1078FrameDecoder extends BaseFrameDecoder { + public Jt1078FrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/Jt808FrameDecoder.java b/src/main/java/org/traccar/protocol/Jt808FrameDecoder.java index d8e52375d..7743412eb 100644 --- a/src/main/java/org/traccar/protocol/Jt808FrameDecoder.java +++ b/src/main/java/org/traccar/protocol/Jt808FrameDecoder.java @@ -20,9 +20,14 @@ import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class Jt808FrameDecoder extends BaseFrameDecoder { + public Jt808FrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/MeiligaoFrameDecoder.java b/src/main/java/org/traccar/protocol/MeiligaoFrameDecoder.java index 52f9ae26d..48a4a06a5 100644 --- a/src/main/java/org/traccar/protocol/MeiligaoFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/MeiligaoFrameDecoder.java @@ -19,11 +19,16 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class MeiligaoFrameDecoder extends BaseFrameDecoder { private static final int MESSAGE_HEADER = 4; + public MeiligaoFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/MeitrackFrameDecoder.java b/src/main/java/org/traccar/protocol/MeitrackFrameDecoder.java index d122bca0c..b4f7c82e7 100644 --- a/src/main/java/org/traccar/protocol/MeitrackFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/MeitrackFrameDecoder.java @@ -19,11 +19,16 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; import java.nio.charset.StandardCharsets; public class MeitrackFrameDecoder extends BaseFrameDecoder { + public MeitrackFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/Pt502FrameDecoder.java b/src/main/java/org/traccar/protocol/Pt502FrameDecoder.java index 316cd987f..5243cbc98 100644 --- a/src/main/java/org/traccar/protocol/Pt502FrameDecoder.java +++ b/src/main/java/org/traccar/protocol/Pt502FrameDecoder.java @@ -19,6 +19,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; import java.nio.charset.StandardCharsets; @@ -26,6 +27,10 @@ public class Pt502FrameDecoder extends BaseFrameDecoder { private static final int BINARY_HEADER = 5; + public Pt502FrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/TeltonikaFrameDecoder.java b/src/main/java/org/traccar/protocol/TeltonikaFrameDecoder.java index aabc24887..831f9d06e 100644 --- a/src/main/java/org/traccar/protocol/TeltonikaFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/TeltonikaFrameDecoder.java @@ -16,6 +16,7 @@ package org.traccar.protocol; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; @@ -25,6 +26,10 @@ public class TeltonikaFrameDecoder extends BaseFrameDecoder { private static final int MESSAGE_MINIMUM_LENGTH = 12; + public TeltonikaFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { diff --git a/src/main/java/org/traccar/protocol/WatchFrameDecoder.java b/src/main/java/org/traccar/protocol/WatchFrameDecoder.java index 992cb02ab..87fbdbce5 100644 --- a/src/main/java/org/traccar/protocol/WatchFrameDecoder.java +++ b/src/main/java/org/traccar/protocol/WatchFrameDecoder.java @@ -20,9 +20,14 @@ import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import org.traccar.BaseFrameDecoder; +import org.traccar.BaseProtocol; public class WatchFrameDecoder extends BaseFrameDecoder { + public WatchFrameDecoder() { + super(BaseProtocol.MAX_FRAME_LENGTH_LARGE); + } + @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception {