Skip to content

Commit ec3ffad

Browse files
committed
on allowed mask mismatch, ensure all inbound frames have same masking status
1 parent 8192071 commit ec3ffad

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

netty-websocket-http1/src/main/java/com/jauntsdn/netty/handler/codec/http/websocketx/WebSocketCallbacksFrameDecoder.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,7 @@ void frameListener(
2828

2929
static WebSocketCallbacksFrameDecoder frameDecoder(
3030
int maxFramePayloadLength, boolean expectMaskedFrames, boolean allowMaskMismatch) {
31-
32-
Boolean strictExpectMaskedFrames = null;
33-
if (!allowMaskMismatch) {
34-
strictExpectMaskedFrames = expectMaskedFrames;
35-
}
36-
return new WebSocketMaskedDecoder(maxFramePayloadLength, strictExpectMaskedFrames);
31+
Boolean lenientExpectMaskedFrames = allowMaskMismatch ? null : expectMaskedFrames;
32+
return new WebSocketMaskedDecoder(maxFramePayloadLength, lenientExpectMaskedFrames);
3733
}
3834
}

netty-websocket-http1/src/main/java/com/jauntsdn/netty/handler/codec/http/websocketx/WebSocketMaskedDecoder.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
import io.netty.buffer.Unpooled;
2121
import io.netty.channel.ChannelHandlerContext;
2222
import io.netty.handler.codec.http.websocketx.WebSocketCloseStatus;
23+
import javax.annotation.Nullable;
2324

2425
final class WebSocketMaskedDecoder extends WebSocketDecoder {
25-
/*if null, mask mismatch is allowed*/
26-
Boolean expectMaskedFrames;
2726
final int maxFramePayloadLength;
27+
Boolean expectMaskedFrames;
2828

2929
WebSocketFrameFactory frameFactory;
3030

@@ -43,7 +43,7 @@ final class WebSocketMaskedDecoder extends WebSocketDecoder {
4343
/* non-negative value means fragmentation is in progress*/
4444
int fragmentedTotalLength = WebSocketProtocol.VALIDATION_RESULT_NON_FRAGMENTING;
4545

46-
WebSocketMaskedDecoder(int maxFramePayloadLength, Boolean expectMaskedFrames) {
46+
WebSocketMaskedDecoder(int maxFramePayloadLength, @Nullable Boolean expectMaskedFrames) {
4747
this.maxFramePayloadLength = maxFramePayloadLength;
4848
this.expectMaskedFrames = expectMaskedFrames;
4949
}
@@ -96,7 +96,9 @@ void decode(ChannelHandlerContext ctx, ByteBuf in) {
9696
int code = (prefix >> 24) & 0xF;
9797

9898
Boolean expectMasked = expectMaskedFrames;
99-
if (expectMasked != null && maskFlag != expectMasked) {
99+
if (expectMasked == null) {
100+
expectMaskedFrames = maskFlag;
101+
} else if (maskFlag != expectMasked) {
100102
WebSocketProtocol.close(
101103
ctx,
102104
this,
@@ -183,7 +185,9 @@ void decode(ChannelHandlerContext ctx, ByteBuf in) {
183185
boolean maskFlag = masking = (prefix & 0x80) == 0x80;
184186

185187
Boolean expectMasked = expectMaskedFrames;
186-
if (expectMasked != null && maskFlag != expectMasked) {
188+
if (expectMasked == null) {
189+
expectMaskedFrames = maskFlag;
190+
} else if (maskFlag != expectMasked) {
187191
WebSocketProtocol.close(
188192
ctx,
189193
this,
@@ -319,7 +323,9 @@ void decode(ChannelHandlerContext ctx, ByteBuf in) {
319323
boolean maskFlag = masking = (prefix & 0x80) == 0x80;
320324

321325
Boolean expectMasked = expectMaskedFrames;
322-
if (expectMasked != null && maskFlag != expectMasked) {
326+
if (expectMasked == null) {
327+
expectMaskedFrames = maskFlag;
328+
} else if (maskFlag != expectMasked) {
323329
WebSocketProtocol.close(
324330
ctx,
325331
this,

0 commit comments

Comments
 (0)