{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":772418261,"defaultBranch":"main","name":"armeria","ownerLogin":"javamodules","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2024-03-15T06:38:17.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/162654906?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1710484706.8459609","currentOid":""},"activityList":{"items":[{"before":"4bfa172606e8059194ccdb2e9fd36c6d22ada786","after":"bc2454ac5d1d075af1bf8245d90da404905a9c3d","ref":"refs/heads/main","pushedAt":"2024-03-20T21:40:01.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"sgammon","name":"Sam Gammon","path":"/sgammon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/171897?s=80&v=4"},"commit":{"message":"Fix a possible `IllegalReferenceCountException` in WebSocket handshake (#5495)\n\nMotivation:\r\n\r\nThe following `IllegalReferenceCountException` could be raised during a\r\nHTTP/1 Websocket handshake.\r\n```java\r\n01:54:00.031 [armeria-common-worker-kqueue-2-2] WARN c.l.a.i.client.PendingExceptionUtil - [id: 0xd2fa853c, L:/10.31.29.254:65140 - R:vks-api-prod.linecorp-dev.com/10.120.97.166:443] Unexpected suppressed exception:\r\ncom.linecorp.armeria.common.ClosedSessionException: null\r\nCaused by: io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1\r\n\tat io.netty.util.internal.ReferenceCountUpdater.toLiveRealRefCnt(ReferenceCountUpdater.java:83)\r\n\tat io.netty.util.internal.ReferenceCountUpdater.release(ReferenceCountUpdater.java:148)\r\n\tat io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:101)\r\n\tat io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:90)\r\n\tat com.linecorp.armeria.client.WebSocketHttp1ClientChannelHandler.channelRead(WebSocketHttp1ClientChannelHandler.java:246)\r\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)\r\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)\r\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)\r\n\tat io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)\r\n\tat io.netty.handler.codec.ByteToMessageDecoder.handlerRemoved(ByteToMessageDecoder.java:266)\r\n\tat io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.remove0(CombinedChannelDuplexHandler.java:608)\r\n\tat io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.remove(CombinedChannelDuplexHandler.java:593)\r\n\tat io.netty.channel.CombinedChannelDuplexHandler.handlerRemoved(CombinedChannelDuplexHandler.java:181)\r\n\tat io.netty.channel.AbstractChannelHandlerContext.callHandlerRemoved(AbstractChannelHandlerContext.java:1138)\r\n\tat io.netty.channel.DefaultChannelPipeline.callHandlerRemoved0(DefaultChannelPipeline.java:637)\r\n\tat io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:477)\r\n\tat io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:429)\r\n\tat com.linecorp.armeria.client.WebSocketHttp1ClientChannelHandler.channelRead(WebSocketHttp1ClientChannelHandler.java:209)\r\n```\r\n\r\n- When 101 Switching Protocols response is received,\r\n`WebSocketHttp1ClientChannelHandler` immediately removes\r\n`HttpClientCodec` from the channel pipeline.\r\nhttps://github.com/line/armeria/blob/75d5af1be6770e5e42690e1b6181c40fed1bf568/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ClientChannelHandler.java#L195\r\n- The removal may emit remaining buffers via `channelRead()`.\r\nhttps://github.com/netty/netty/blob/06a7e12df9118e3ffbeae3cdc50e638a999d93ec/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java#L266-L267\r\n- WebSocket packets after the HTTP/1 WebSocket handshake are passed to\r\n`WebSocketHttp1ClientChannelHandler`, but the state is still\r\n`NEEDS_HANDSHAKE_RESPONSE`. As a result, the state machine becomes\r\nbroken and the `ByteBuf` could be double released.\r\nhttps://github.com/line/armeria/blob/75d5af1be6770e5e42690e1b6181c40fed1bf568/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ClientChannelHandler.java#L165-L167\r\n\r\nModifications:\r\n\r\n- Retain a message before passing the next `ChannelHandler` because it\r\nis always released.\r\n- Remove `HttpClientCodec` after `EMPTY_LAST_CONTENT` is received and\r\n`state` becomes `UPGRADE_COMPLTE` to handle pending messages in the\r\nbuffer correctly.\r\n\r\nResult:\r\n\r\n`IllegalReferenceCountException` no longer occurs during WebSocket\r\nhandshake.","shortMessageHtmlLink":"Fix a possible IllegalReferenceCountException in WebSocket handshake ("}}],"hasNextPage":false,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEGyHLOAA","startCursor":null,"endCursor":null}},"title":"Activity ยท javamodules/armeria"}