立即处理可能影响正在运行的系统已审查 build 2.4.17294 至 2.4.17324 的全部 27 个 non-merge commit:排除版本 bookkeeping 后新增 779 行、删除 316 行。另有 3 个 merge commit 被排除。已检查精确 upstream head。没有 superseded_by;顺序来自直接检查的 follow-up,不声明避开区间。
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 测试已禁用,需要单独关注。
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 风险;非阻塞广播也避免重复搜索。
建议升级
升级并在客户端 reset 或断开时压力测试 aTimeOut=0 与非零广播。
公开 API
TWebSocketAsyncServer.WebSocketBroadcastbehaviour-changed
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 而失败。
建议升级
在 Windows 11 上测试长期 TLS 1.3 传输及 peer 发起的 key update。
公开 API
TBuffer32Kadded
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 或加密输出时。
建议升级
重测 SChannel handshake、大型写入与服务器 shutdown 期间的客户端断开。
公开 API
NetErrorFromSystembehaviour-changed
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 与生命周期处理。
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 服务均受影响。
建议升级
在 worker 线程同时产生已处理异常,并确认每个异常在 TSynLog 中恰好出现一次。
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 客户端析构更安全。
建议升级
测试线程处于 WaitForHandshake 时调用 ClosePort,以及 callback 活动期间销毁 WebSocket 客户端。
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 转成异常。
建议升级
升级并测试大型 SChannel 请求或响应仍在发送时的 peer shutdown。
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 转发不再自锁。
建议升级
压力测试在 POST 命令转发期间断开的 RTSP-over-HTTP 客户端。
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 路由更一致。
建议升级
若启用 TSynLog 异常拦截,请升级并比较单线程与多线程异常计数。
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。
建议升级
若告警依赖每个异常一条记录,请比较升级前后的 Win32 异常日志计数。
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。
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
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 完成同步。
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.GetConnectionHandlesaddedTAsyncConnections.GetConnectionInstancesadded
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
CPUAVX512FEATURESaddedCPUAVX512X64V4addedIntelAvx512addedcpuAVX512added
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_updateaddedSSL_KEY_UPDATE_NOT_REQUESTEDaddedSSL_KEY_UPDATE_REQUESTEDadded
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
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 变量。
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 行为不变。
20
低
mTLS 测试跨多个 TLS record 发送大型请求体
test.net.proto 新增大型 POST 路由、分块客户端发送、CRC32C 校验,以及 SChannel/OpenSSL 服务器的 TLS 1.2 与 TLS 1.3 场景。
测试
test.net.proto
9a5d0e77+105-28
21
低
新增 reset peer 测试复现 WebSocket 广播死锁
TNetworkProtocols 新增服务器、广播 worker 与 50 个短连接客户端;客户端带未读 frame 以 RST 关闭,若下一个连接无法接受即可暴露服务器卡死。
测试
test.net.proto
c0f6defb+83-0
test: new TNetworkProtocols._TWebSocketAsyncServer regression test
影响
该测试覆盖 issue #629,不改变生产行为。
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 回归失败更易诊断,不改变应用运行时行为。
23
低
WebSocket 死锁回归测试加入多线程套件
issue #629 回归测试移入 SlowTests,改用 TLoggedThread,并在启用 /multithread 时与其他后台网络测试一起运行。
测试
test.net.proto
bb3be0ae+23-16
24
低
WebSocket 广播压力测试在首个客户端连接后才启动
广播回归线程在首个客户端成功连接后启动,交替使用 0 与 50 ms send,保存本地发送计数,并在 shutdown 卡死时避免解引用该计数。
测试
test.net.proto
9a417d31+21-15
test: fixed WS broadcast thread synchronization
影响
仅回归测试 harness 改变;生产 Delphi/FPC 代码与 API 不受影响。
25
低
广播回归测试交替执行阻塞与非阻塞 send
WebSocket 回归测试把发送计数移出 worker 对象,并在反复连接和 reset 客户端时让 aTimeOut 在 0 与 50 ms 间切换。
测试
test.net.proto
0eadadb7+22-7
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 场景的回归。
27
低
LDAP 与 WebSocket 注释得到澄清,运行时不变
CldapBroadcast、AVX-512 global 与 WebSocket client-ID 排序附近的注释得到修正或澄清;可执行语句不变。
文档
mormot.core.base+2
d3366efd+6-6
net: minor fixes
影响
对 Delphi/FPC 应用代码与运行时行为没有影响。