mORMot2 Daily每日上游提交速读

WebSocket 死锁得到修复,TLS 与异常日志趋于稳定

Async WebSocket 广播与 RTSP 转发不再持有连接 read lock 进行发送,从而修复写入失败并移除 peer 时的死锁。SChannel 现在把发送期间的正常关闭视为 closed connection,并补全 TLS 1.3 renegotiation 覆盖。异常拦截也修复了并发线程、Delphi Win32 与 Delphi POSIX 路径;AVX-512 检测则会确认 OS 确实保存 ZMM 状态。

要点

  • 应采用 build 2.4.17324 的 05e40cd692d391efb62ed97f78f264867477e8e5。
  • TWebSocketAsyncServer.WebSocketBroadcast 与 TPostConnection.OnRead 在失败 send 删除连接时不再死锁。
  • SChannel 在正常关闭时返回 nrClosed,接收路径也会处理 TLS 1.3 的 SEC_I_RENEGOTIATE。
  • 并发异常不再丢失,Delphi Win32 重复记录被抑制,Delphi POSIX 新增异常拦截。
  • IntelAvx512 现在是启动时计算并经 XCR0 过滤的变量;cpuAVX512 标识 OS 已启用的 x86-64-v4 支持。
  • issue #418 的 Windows http.sys WebSocket 回归测试因在 Windows 11 上仍不可靠而被禁用。

升级建议

请采用 build 2.4.17324。若生产环境使用 TWebSocketAsyncServer.WebSocketBroadcast、RTSP-over-HTTP 转发、Windows SChannel、TTunnelLocal,或依赖并发下完整异常日志,应尽快升级。请压力测试客户端 reset 时的广播、TLS 1.3 key update、peer 关闭,以及 WaitForHandshake 期间的 ClosePort。原始 payload 没有 superseded_by,因此不声明正式避开区间;请完整采用每组序列。issue #418 的 Windows http.sys WebSocket 测试已禁用,需要单独关注。

版本号2.4.17293 → 2.4.17324
提交30
行数+992 -386
阅读2 分钟

27 条中的 27 条 · 上游 30 次提交

主题
# 条目 类别 单元
1 高 WebSocket 广播在两种 timeout 模式下使用安全快照 GetConnectionHandles 与 GetConnectionInstances 直接遍历类引用数组。WebSocketBroadcast 仅在 timeout 为零时使用 instance 快照,阻塞发送使用 handle lookup,并在 SendDirect 前检查 ConnectionFind 是否为 nil。 修复 mormot.net.async+1 f253c603+53-40

net: properly fixed #629

影响

向并发关闭的 peer 广播不再有死锁或 nil dereference 风险;非阻塞广播也避免重复搜索。

公开 API

  • TWebSocketAsyncServer.WebSocketBroadcastbehaviour-changed

Arnaud Bouchez · 14:12 UTC · PR #629 · 在 GitHub 上查看该提交 →

2 高 SChannel 在 TLS 1.3 key update 时继续 handshake TSChannelNetTls.Receive 识别 SEC_I_RENEGOTIATE,并把剩余输入重新交给 HandshakeStep。测试客户端可在传输中请求 SSL_key_update,同时新增 TBuffer32K。 修复 mormot.core.base+3 8e6133ef+56-26

net: SChannel fixes and new tests about TLS 1.3 renegotiation

影响

长期 SChannel TLS 1.3 连接可在 peer key update 后继续工作,不再因 DecryptMessage 请求 renegotiation 而失败。

公开 API

  • TBuffer32Kadded

Arnaud Bouchez · 16:27 UTC · 在 GitHub 上查看该提交 →

3 高 SChannel socket 关闭不再产生 shutdown 异常 NetErrorFromSystem 将 WSAENOTCONN 与 WSAESHUTDOWN 映射为 nrClosed。TSChannelNetTls.SendRawAll 返回 TNetResult,socket 关闭时调用方停止,receive 错误包含标准化结果与 Windows 信息。 修复 mormot.net.sock+1 2d800eaa+46-26

net: several fixes to SChannel socket closure

影响

正常 Windows TLS teardown 不再表现为致命 ESChannel,包括发送 handshake token 或加密输出时。

公开 API

  • NetErrorFromSystembehaviour-changed

Arnaud Bouchez · 17:01 UTC · 在 GitHub 上查看该提交 →

4 高 WebSocket 广播在写入前释放连接 read lock WebSocketBroadcast 在 ConnectionLock.ReadOnlyLock 下复制目标 handle,释放锁后再编码并通过 ConnectionFind 发送;文档明确 Write 可能调用 ConnectionDelete,不得在 read lock 下执行。 修复 mormot.net.async+1 fd8b176f+25-15

net: fixed TWebSocketAsyncServer.WebSocketBroadcast deadlock when a send fails

影响

广播 send 失败后可删除连接,不再尝试升级 read lock 而死锁 async 服务器;后续提交完善 nil 与生命周期处理。

je · 09:21 UTC · 在 GitHub 上查看该提交 →

5 高 并发异常不再从 TSynLog 中消失 异常 handler 不再在每次日志操作时清空全局 _RawLogException callback;递归仍由每线程 PerThreadInfo.ExceptionIgnore 抑制,因此其他线程的 handler 保持有效。 修复 mormot.core.os+1 6b486e00+18-17

core: fixed Exception diseappearing in logs on multi-thread process :(

影响

不同线程同时抛出的异常不再静默漏记;并发 Delphi/FPC 服务均受影响。

Arnaud Bouchez · 10:05 UTC · 在 GitHub 上查看该提交 →

6 高 WebSocket 客户端与本地 tunnel 安全发布 shutdown 状态 TTunnelLocal.ClosePort 在 fSendSafe 仍锁定时设置 fClosed;THttpClientWebSockets.Destroy 改用 FreeAndNilSafe;callback 请求直接使用 fProtocol.ConnectionFlags。 修复 mormot.net.tunnel+1 b60779e1+5-5

net: hardened THttpClientWebSockets shutdown

影响

Tunnel sender 与 WaitForHandshake observer 以一致顺序看到关闭;并发 callback 下 WebSocket 客户端析构更安全。

Arnaud Bouchez · 08:56 UTC · 在 GitHub 上查看该提交 →

7 高 SChannel 发送侧正常关闭现在返回 nrClosed TSChannelNetTls.SendRawAll 在检查零字节 send 前把结果设为 nrClosed,使 peer 正常关闭时直接退出而不抛出 ESChannel。 修复 mormot.net.sock.windows 1a03af2e+5-4

net: fixed graceful disconnection during SChannel sending

影响

Windows TLS 客户端与服务器可在 send 挂起时关闭,而不会把正常 shutdown 转成异常。

Arnaud Bouchez · 17:52 UTC · 在 GitHub 上查看该提交 →

8 高 RTSP-over-HTTP 转发不再在 ConnectionLock 下写入 TPostConnection.OnRead 在 WriteString 前用 ConnectionFind 替代 ConnectionFindAndLock(cReadOnly),因为写入失败可能调用 ConnectionDelete 并请求同一锁的 write mode。 修复 mormot.net.rtsphttp a1c8844a+3-4

net: fixed TPostConnection.OnRead holding ConnectionLock during WriteString()

影响

配对 RTSP 连接在写入期间消失时,RTSP-over-HTTP POST 转发不再自锁。

je · 09:21 UTC · 在 GitHub 上查看该提交 →

9 中 现代 Delphi 使用单一异常 hook,避免重复记录 SynRaiseProc 泛化以支持 RaiseExceptObjProc;Windows vectored 与 unwind handler 跳过已处理的 Delphi 异常,过滤伪 RTL 异常码,并保留原 handler 链。 修复 mormot.core.os b6de95bf+56-40

core: refined Delphi exception logging

影响

Delphi 异常只记录一次,同时第三方与 RTL hook 继续运行;Windows 与 POSIX 路由更一致。

Arnaud Bouchez · 12:08 UTC · 在 GitHub 上查看该提交 →

10 中 Delphi Win32 异常不再重复记录 Delphi 2009+ Win32 使用 RaiseExceptObjProc 处理语言异常,并让 RTLUnwindProc 跳过已由该 hook 处理的 cRtlException 记录。 修复 mormot.core.os 0a512f58+51-23

core: fixed duplicate Exception logging on Delphi Win32

影响

TSynLog 不再为普通 Delphi Win32 异常输出重复记录;旧 Delphi 与 FPC 保持原有 hook。

Arnaud Bouchez · 09:24 UTC · 在 GitHub 上查看该提交 →

11 中 异常日志可处理未知指令地址 当 TSynLogExceptionContext.EAddr 为零时,SynLogException 省略“at”指针字段,并在追加可用 stack frame 前使用安全 writer 调用。 修复 mormot.core.log 128e7134+11-6

core: fixed SynLogException() with Ctxt.EAddr = 0

影响

没有可靠地址的 Delphi LLVM 异常记录仍保持正确格式,并保留可用 stack trace。

Arnaud Bouchez · 12:06 UTC · 在 GitHub 上查看该提交 →

12 中 默认 RSA 生成 timeout 随密钥长度扩展 TRsa.Generate 对 3072-bit 密钥将 RSA_DEFAULT_GENERATION_TIMEOUTMS 乘 4,4096-bit 乘 16,7680/8192-bit 乘 64,同时保留显式自定义 timeout。 修复 mormot.crypt.rsa ad2f17e3+10-3

crypt: RSA generation timeout auto adaptation

影响

弱 CPU 使用默认值生成大型 RSA 密钥时更不易返回 rgrTimeout;显式提供 TimeOutMS 的调用保持原限制。

值得一看

审查 3072-bit 及以上密钥生成的延迟预算;若更长默认值不合适,请显式设置 TimeOutMS。

公开 API

  • TRsa.Generatebehaviour-changed

Arnaud Bouchez · 06:41 UTC · 在 GitHub 上查看该提交 →

13 中 TTunnelLocal 在唤醒 handshake waiter 前标记关闭 TTunnelLocal.ClosePort 与 remote-close frame 路径在触发 fHandshakeEvent 前设置 fClosed,避免 WaitForHandshake 醒来后仍看到旧 open 状态。 修复 mormot.net.tunnel e7c2a1fb+6-6

net: hardened TTunnelLocal.ClosePort

影响

Handshake waiter 会看到一致的 closed 状态;下一提交把赋值移入 send lock 完成同步。

Arnaud Bouchez · 08:49 UTC · 在 GitHub 上查看该提交 →

14 中 Async 连接 owner 可取得活动 handle 或 instance 快照 TAsyncConnections 新增公开 GetConnectionHandles 与 GetConnectionInstances,在持有 ConnectionLock.ReadOnlyLock 时复制未关闭连接。 新功能 mormot.net.async 40766691+61-2

net: new TAsyncConnections.GetConnectionInstances/GetConnectionHandles methods

影响

自定义 async 代码获得更安全的快照 API;instance 快照仅在 KeepConnectionInstanceMS 内避免回收,不应执行阻塞操作。

值得一看

延迟或阻塞工作应优先使用 handle;instance 快照仅用于立即完成的非阻塞操作。

公开 API

  • TAsyncConnections.GetConnectionHandlesadded
  • TAsyncConnections.GetConnectionInstancesadded

Arnaud Bouchez · 13:50 UTC · 在 GitHub 上查看该提交 →

15 中 AVX-512 检测现在验证 OS 管理的 ZMM 状态 mormot.core.base 新增 IsZmmOSEnabled 汇编、AVX-512 feature-set 常量、经 XCR0 过滤的 IntelAvx512,以及 TX64CpuFeatures 中标识 x86-64-v4 子集的 cpuAVX512。 新功能 mormot.core.base+1 6941a143+56-2

core: introducing IntelAvx512 to detect AVX-512 support enabled by the OS

影响

当 CPUID 宣告 AVX-512 但旧 OS 或 VM 不保存 opmask/ZMM 寄存器时,CPU 调度可避开 AVX-512 指令,防止 #UD fault。

值得一看

自定义 EVEX 调度前应使用 IntelAvx512 或 cpuAVX512,而不是原始 CpuFeatures,尤其在 VM 中。

公开 API

  • CPUAVX512FEATURESadded
  • CPUAVX512X64V4added
  • IntelAvx512added
  • cpuAVX512added

Dimitris Kounalakis · 04:03 UTC · 在 GitHub 上查看该提交 →

16 中 OpenSSL wrapper 公开 TLS 1.3 key update mormot.lib.openssl11 在动态与静态 OpenSSL binding 中新增 SSL_KEY_UPDATE_NOT_REQUESTED、SSL_KEY_UPDATE_REQUESTED 与可选 SSL_key_update 函数。 新功能 mormot.lib.openssl11 8f4fd5a1+28-14

lib: new SSL_key_update() OpenSSL function wrapper

影响

低层 OpenSSL 使用方可请求 TLS 1.3 traffic-key 轮换;旧版 OpenSSL 因该符号为可选仍可加载。

公开 API

  • SSL_key_updateadded
  • SSL_KEY_UPDATE_NOT_REQUESTEDadded
  • SSL_KEY_UPDATE_REQUESTEDadded

Arnaud Bouchez · 15:09 UTC · 在 GitHub 上查看该提交 →

17 中 Delphi POSIX 新增初步自动异常日志 mormot.defines.inc 在 Delphi POSIX 启用异常拦截,mormot.core.os.posix 选择 RaiseExceptObjProc 而不是 FPC 的 RaiseProc hook。 新功能 mormot.core.os+1 e2798199+11-6

core: preliminary exception logging on Delphi POSIX

影响

Delphi Linux 与移动 POSIX 构建现在可自动输出 TSynLog 异常记录,此前没有 interceptor;FPC 行为不变。

值得一看

上线前在每个 Delphi POSIX 目标检查日志量与异常 stack 格式。

公开 API

  • RawExceptionInterceptbehaviour-changed

Arnaud Bouchez · 12:16 UTC · 在 GitHub 上查看该提交 →

18 低 AVX-512 可用性在 CPU 启动检测时一次计算 公开无参数函数 IntelAvx512 改为由 TestCpuFeatures 填充的 TIntelCpuFeatures global,避免重复 XGETBV,同时保留 XCR0 过滤。 性能 mormot.core.base fb734823+14-18

core: IntelAvx512 is now a global variable pre-computed at startup

影响

特性检查变为读取变量;普通 Pascal 表达式仍可自然使用 IntelAvx512,但显式获取函数地址的代码必须修改。

值得一看

仅检查存储或传递 IntelAvx512 函数指针的低层代码;普通值检查无需迁移。

公开 API

  • IntelAvx512signature-changed — 同一期引入的函数最终改为预计算 global 变量。

Dimitris Kounalakis · 13:41 UTC · 在 GitHub 上查看该提交 →

19 低 Delphi 异常拦截按 RTL 实际可用性启用 POSIX include 仅在 HASRAISEEXCEPTOBJPROC 可用时定义 WITH_RAISEEXCEPTOBJPROC;其余修改澄清 stack filter 与注释。 编译器与平台 mormot.core.log+3 3327833c+17-15

core: some minor fixes

影响

旧 Delphi 目标不会编译不存在的拦截 hook;FPC 与受支持现代 Delphi 行为不变。

Arnaud Bouchez · 13:00 UTC · 在 GitHub 上查看该提交 →

20 低 mTLS 测试跨多个 TLS record 发送大型请求体 test.net.proto 新增大型 POST 路由、分块客户端发送、CRC32C 校验,以及 SChannel/OpenSSL 服务器的 TLS 1.2 与 TLS 1.3 场景。 测试 test.net.proto 9a5d0e77+105-28

test: cover huge content with mTLS

影响

回归覆盖现包含跨 record 边界与大型 mTLS payload;应用 API 不变。

Arnaud Bouchez · 15:48 UTC · 在 GitHub 上查看该提交 →

21 低 新增 reset peer 测试复现 WebSocket 广播死锁 TNetworkProtocols 新增服务器、广播 worker 与 50 个短连接客户端;客户端带未读 frame 以 RST 关闭,若下一个连接无法接受即可暴露服务器卡死。 测试 test.net.proto c0f6defb+83-0

test: new TNetworkProtocols._TWebSocketAsyncServer regression test

影响

该测试覆盖 issue #629,不改变生产行为。

je · 09:21 UTC · 在 GitHub 上查看该提交 →

22 低 mTLS 测试 worker 可靠捕获并分类网络异常 SChannel/OpenSSL 测试 runner 包裹每个 worker 执行,记录异常类,把 ENetSock 视为预期网络失败,并给每个 async 服务器设置独立日志名称。 测试 mormot.core.log+1 cc95a9eb+28-14

test: hardened error catching for SChannel/OpenSSL mTLS

影响

TLS 回归失败更易诊断,不改变应用运行时行为。

Arnaud Bouchez · 08:08 UTC · 在 GitHub 上查看该提交 →

23 低 WebSocket 死锁回归测试加入多线程套件 issue #629 回归测试移入 SlowTests,改用 TLoggedThread,并在启用 /multithread 时与其他后台网络测试一起运行。 测试 test.net.proto bb3be0ae+23-16

tests: fixed #629 coverage

影响

仅测试调度与诊断改变;生产代码不受影响。

Arnaud Bouchez · 14:13 UTC · PR #629 · 在 GitHub 上查看该提交 →

24 低 WebSocket 广播压力测试在首个客户端连接后才启动 广播回归线程在首个客户端成功连接后启动,交替使用 0 与 50 ms send,保存本地发送计数,并在 shutdown 卡死时避免解引用该计数。 测试 test.net.proto 9a417d31+21-15

test: fixed WS broadcast thread synchronization

影响

仅回归测试 harness 改变;生产 Delphi/FPC 代码与 API 不受影响。

Arnaud Bouchez · 17:52 UTC · 在 GitHub 上查看该提交 →

25 低 广播回归测试交替执行阻塞与非阻塞 send WebSocket 回归测试把发送计数移出 worker 对象,并在反复连接和 reset 客户端时让 aTimeOut 在 0 与 50 ms 间切换。 测试 test.net.proto 0eadadb7+22-7

test: enhanced WS broadcast process

影响

测试现在覆盖 WebSocketBroadcast 的两条连接快照路径;应用行为不变。

Arnaud Bouchez · 17:13 UTC · 在 GitHub 上查看该提交 →

26 低 Windows http.sys WebSocket 回归测试暂时禁用 TNetworkProtocols._HttpApiWebSocketServer 现在立即退出,禁用 issue #418 覆盖,因为该测试据称不可靠,尤其在 Windows 11 上。 测试 test.net.proto 05e40cd6+3-2

tests: disable issue #418 coverage

影响

应用行为不变,但 CI 不再检测此 Windows http.sys WebSocket 场景的回归。

Arnaud Bouchez · 18:10 UTC · PR #418 · 在 GitHub 上查看该提交 →

27 低 LDAP 与 WebSocket 注释得到澄清,运行时不变 CldapBroadcast、AVX-512 global 与 WebSocket client-ID 排序附近的注释得到修正或澄清;可执行语句不变。 文档 mormot.core.base+2 d3366efd+6-6

net: minor fixes

影响

对 Delphi/FPC 应用代码与运行时行为没有影响。

Arnaud Bouchez · 15:09 UTC · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13