WebSocket 处理器上下文是自引用的,导致无法恢复的栈溢出
作者: om7057创建于 2026年9月8日更新于 2026年9月8日
□ 什麽
“App.WebSocket'的处理器将上下文交给这样的处理器:
开始 ctx (英语). 上下文=上下文 (中文(简体) ). 与Value(ctx)相通,为网锁. WSConnectionKey, conn)). 克克克·克克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克.
`ctx'是`gofr.Context',它嵌入`context'。 A. 背景情况 将`ctx'本身(而不是`ctx.context')作为`context'的父母。 由于Value " 使由此产生的价值-文字自我优惠:其母体是 " ctx " , " ctx.context " 就是正在构建的背景。
□ 影响
任何按上下文排列母链的电话,例如`.Done()'或`.Value()'寻找“websocket”以外的钥匙。 WSConnectionKey ' ,自相残杀:
运行时间: goroutine 堆栈超过 1000000字节限制 致命错误:堆栈溢出
堆积溢出是 " 致命错误 " ,而不是 " 泛指 " ,因此,`恢复() ' 无法抓住,整个过程会结束。 一个 WebSocket 处理器,它读取除 WS 密钥以外的任何上下文值(跟踪、 认证或任何 SDK 取出“背景” ) 。 (c) 报告的内容。
它目前无人注意,因为`Contaner.GetConnection FromContext ' 检查了重现前返回的钥匙。
# 何处 #
`pkg/gofr/websocket.go',载于`App.WebSocket'注册处理器:
开始
ctx (英语). 上下文=上下文 (中文(简体) ). 与Value(ctx)相通,为网锁. WSConnectionKey, conn)). 克克克·克克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克.□ 建议修正
使用嵌入上下文作为父上下文,而不是“ ctx” 本身:
开始 ctx (英语). 上下文=上下文 (中文(简体) ). 与Value( ctx. ) (中文(简体) ). 上下文 网锁. WSConnectionKey, conn)). 克克克·克克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克.
□ 注释
- 独立于第4111号确定的数据种族( " ServeWithGoroutine " 读作 " C.Context " ,同一行重新指定)。 这种方法阻止了 " 父母* " 的呼唤,不再在 " .DONE() " 的中毒上下文上呼唤 " .DONE() " ,它关闭了一条坠毁路径,但将 " C.Context " 本身留给了处理者及其下游的一切。
- 在审查4111号时浮出水面.内容来源: gofr-dev/gofr