立即处理可能影响正在运行的系统已审查全部 30 个非 merge commit,并排除两个 merge。去除 mormot.commit.inc 与 mormot.commit-num.inc 后,共 1,955 行新增、1,162 行删除。已检查 1f7febd219f9cb54175a1f87620e6862e4e670b8 的最终源码。没有 commit 带 superseded_by。
AES-GCM 认证恢复,Tunnel 与队列生命周期重构
最紧急的修复为 AES-GCM 解密的 AVX 路径恢复 GMAC 校验;在符合条件的 x86-64 系统上,该路径此前可能接受伪造的 ciphertext、tag 或 associated data。Tunnel 的生命周期、handshake 与关闭流程被重构,使外部调用离开锁区,并由 owner 确定性管理 thread。队列和 thread pool 的等待路径加入 OS futex 与新 API,随后补齐 Delphi、Win8+ 和 Linux 所需修复。
要点
- 应采用 build 2.4.17356 的 1f7febd219f9cb54175a1f87620e6862e4e670b8。
- TAesGcmEngine.Decrypt 现在会在 AVX single-pass 路径后校验 GMAC;测试会拒绝伪造的 ciphertext、tag 与 AAD。
- TTunnelLocal 现在拥有并 join worker,显式转移 socket,并在 state lock 外执行 relay callback。
- TSynQueue 在可用时采用 OS futex,并新增 WaitPopReset 与 Waiters;带比较条件的等待仍使用 polling。
- TSynThreadTasks、PendingTasks 与 WaitFor 增加托管任务执行和完成等待;最终修复覆盖 Delphi、Win8+ 与 Linux。
- 内存 ZIP data descriptor、REST WebSocket callback 清理和 THttpApiServer 启动均获得生产修复。
升级建议
采用完整的 build 2.4.17356。若 AES-GCM 可能使用 x86-64 AVX 路径、Tunnel 或 REST WebSocket client 会并发关闭,或项目使用 THttpApiServer,应尽快升级。请复测伪造 AES-GCM 输入、Tunnel 反复 open/close、queue finalize/reset、thread-pool WaitFor timeout 与 HTTP.sys 启动。原始数据没有 superseded_by,因此不声明正式规避范围,也不要单独挑取中间 Tunnel 或 WaitFor commit。
30 条中的 30 条 · 上游 32 次提交
1
严重
AVX AES-GCM 解密不再接受未认证数据
TAesGcmEngine.Decrypt 将最终 tag comparison 移至所有 single-pass branch(包括 AvxProcess)之后。dual-pass 路径会标记已验证 tag,避免重复检查。
安全
mormot.crypt.core
3c395af5+13-11
crypt: fixed missing GMAC check in TAesGcmEngine.Decrypt() AVX path
影响
在使用 AVX AES-GCM 路径的符合条件 x86-64 系统上,伪造的 ciphertext、authentication tag 或 AAD 此前可能返回成功。scalar 与 dual-pass 路径原本已认证。
建议升级
若 TAesGcmEngine 可能 dispatch 到 AVX,请立即升级,并添加修改 ciphertext、tag 与 AAD 的负向测试。
公开 API
TAesGcmEngine.Decryptbehaviour-changed
2
高
Tunnel socket 转移与延迟 frame 变得 race-safe
OpenInternal 以 var 接收 socket,转移给 thread 后清空它,在 state lock 下检查关闭,并通过 RelayFrame 在锁外排空 queued handshake frame。
修复
mormot.core.threads+1
1f37f3a4+111-82
net: fixed several races in mormot.net.tunnel
影响
Open 与 OpenSocket 避免重复关闭已转移 socket,延迟 frame 引发的 callback 也不会在持有 parent state lock 时重入。后续 Tunnel 修复完成该序列。
公开 API
TTunnelLocal.OpenSocketbehaviour-changed
3
高
Tunnel handshake 等待与关闭路径形成稳定锁模型
TTunnelLocal 用 TOSLightLock 替换 reentrant lock,显式初始化与完成它,集中 WaitForHandshake 状态获取,并通过 ClosePort 关闭 thread 创建后的失败 handshake。
修复
mormot.net.tunnel+1
0900c1f2+75-68
net: still some fixes to mormot Tunnel
影响
并发 handshake 到达、timeout、关闭与销毁不再依赖递归锁或 nullable event check。最终代码适用于所有 Tunnel 支持平台的 Delphi 与 FPC。
建议升级
采用直至 0900c1f2 的完整 Tunnel 序列,并压力测试 early frame、remote close、timeout 与 handshake 中销毁。
公开 API
TTunnelLocal.WaitForHandshakebehaviour-changedTTunnelLocal.ClosePortbehaviour-changed
4
高
Tunnel transport 调用移出 parent state lock
parent lock 更名为 fStateSafe;SendFrame 在锁下捕获计数与 closed state,TTunnelLocalThread 经由 parent helper 后在锁外调用 ITunnelTransmit.TunnelSend。
修复
mormot.net.tunnel
7d9ec6c6+62-45
net: fixed TunnelSend() call
影响
transport 实现可阻塞或重入而不死锁 Tunnel state transition。此中间形式随后被最终 TOSLightLock 设计取代。
5
高
内存 ZIP reader 可提取最后一个 data-descriptor entry
TZipRead.Create 让最后一个内存 local entry 指向后续 central directory。SearchFromDataDescriptor 因而可向后搜索,不会落入 disk branch 并解引用 nil fSource。
修复
mormot.core.zip+1
444fc47e+98-0
core: TZipRead in-memory access to a last entry with data descriptor
影响
完全从内存打开 ZIP 时,若最后 entry 使用 LibreOffice .xlsx/.ods 常见的 FLAG_DATADESCRIPTOR,不再触发 EAccessViolation。
建议升级
若 ZIP、XLSX 或 ODS 内容会载入内存,请升级并测试最后一个 archive entry 的提取。
公开 API
TZipRead.Createbehaviour-changed
6
高
Tunnel worker 由 parent 拥有并 join
TTunnelLocalThread 不再使用 FreeOnTerminate 与强 transmit 引用。TTunnelLocal 发布 suspended worker、显式启动,在 ClosePort 中终止,并由 parent destructor 于 inherited join 后释放。
修复
mormot.net.tunnel
be0c7136+42-35
net: fixed TTunnelLocalThread lifetime
影响
worker 生命周期不再与 parent destruction 竞争,也不会从 worker 清除 owner 的 thread reference。仍需后续 commit 完成外部调用与 handshake locking。
7
高
Tunnel forwarding 不再于外部工作期间持有 state lock
TunnelSend 仅在 handshake 与 flag 转换时持锁,常规 frame 在锁外转发。ClosePort 在中止 socket 与调用 transport 前于锁下捕获 notification state。
修复
mormot.net.tunnel
bd4626d4+34-36
net: fixed Tunnel process thread safety
影响
transport callback、socket shutdown 与 frame delivery 不会在 TTunnelLocal 持有 state lock 时重入并造成 deadlock。后续 commit 进一步完善关闭 ownership。
8
高
WaitFor 现在会在 Win8+ 与 Linux 任务完成时唤醒
TSynThreadPool 在 futex wait 周围加入 fWaiters,最后一个 pending task 完成时 TaskAllDone 调用 OsWakeAllOnValue。
修复
mormot.core.threads
b7a92cc1+29-18
core: fixed TSynThreadPool.WaitFor on Win8+ and Linux
影响
在 futex 平台上,新 WaitFor 不再于 pending count 归零后依赖 timeout 到期。后续 commit 进一步精确计数器生命周期。
公开 API
TSynThreadPool.WaitForbehaviour-changed
9
高
thread pool completion waiter 现在匹配 futex 生命周期
TSynThreadPool.WaitFor 在计算 deadline 前递增 fWaiters,并让计数器精确覆盖 wait loop。TaskAllDone 据此决定是否调用 OsWakeAllOnValue。
修复
mormot.core.threads
fc943be2+8-8
core: tied up TSynThreadPool.WaitFor futex
影响
Win8+ 与 Linux 上等待全部工作完成的调用方避免 missed wake-up window。其他平台继续使用一毫秒 fallback loop。
建议升级
使用 2.4.17356 的最终 WaitFor 实现,并在并发完成下测试有限与 INFINITE 等待。
公开 API
TSynThreadPool.WaitForbehaviour-changed
10
高
HTTP.sys server 恢复 construction 后自动启动
THttpApiServer.Create 在调用 THttpServerGeneric.Create 前不再加入 hsoCreateSuspended。base class 因而可设置 fStartAfterConstruction,并在 constructor chain 完成后启动 server thread。
修复
mormot.net.server
1f7febd2+5-6
net: fixed THttpApiServer.Create startup
影响
使用默认 option 创建的 Windows HTTP.sys backend 不再于初始化后保持 suspended。Delphi 与 FPC 的 socket-based server 不走此路径。
建议升级
升级至 2.4.17356,并确认每个 THttpApiServer 在 construction 后立即接受请求。
公开 API
THttpApiServer.Createbehaviour-changed
11
高
REST WebSocket callback 在 owner 消失前释放
TRestClientUri.Destroy 将 FreeAndNilSafe(fFakeCallbacks) 移到 InternalClose 后的内部 finally,并置于释放 REST model 与 service 的 inherited Destroy 之前。
修复
mormot.rest.client
376e6934+5-5
rest: fixed TRestClientUri WebSockets callbacks finalization
影响
并发 WebSocket shutdown 不再让 callback storage 引用正在销毁的 owner。修复适用于使用 WebSocket callback 的 Delphi 与 FPC REST client。
建议升级
升级后并发压力测试反复 connect、callback registration、disconnect 与 TRestClientUri destruction。
公开 API
TRestClientUri.Destroybehaviour-changed
12
中
队列 futex 仅用于真正的无过滤消费者
TSynQueue 不对 PopEquals 与 WaitPeekLocked 使用 futex wait,保留其 polling 语义,避免 sequence overflow 后变为零,并在 binary load 后重置 sequence。
修复
mormot.core.threads
53ff22a2+32-21
core: some TSynQueue fixes and enhancements
影响
当队首 item 不匹配时,filtered wait 不会无限睡眠;普通 WaitPop 仍保留高效 OS blocking。
公开 API
TSynQueue.WaitPopbehaviour-changedTSynQueue.WaitPeekLockedbehaviour-changed
13
中
新增拥有任务对象的简单 task pool
TSynThreadTask 定义 DoExecute,TSynThreadTasks 通过 TSynThreadPool 执行这些对象。Add 始终接管 ownership,释放被拒任务,并在 shutdown 时通过 TaskAbort 清理 queued work。
新功能
mormot.core.threads+1
27d2e21b+77-5
core: new TSynThreadTasks simple thread-pool class
影响
Delphi 与 FPC 应用可提交 heap-owned task object,无需编写 worker-thread plumbing。将 task 传给 Add 后,即使返回 false,调用方也不得释放它。
值得一看
采用 TSynThreadTasks 时,移除 Add 后调用方的 Free,并实现不假设 task 可重用的 DoExecute。
公开 API
TSynThreadTaskaddedTSynThreadTasksadded
14
中
thread pool 公开总工作量与最终任务 hook
TSynThreadPool 用 fPendingTasks 跟踪 queued 与 executing work,公开 PendingTasks,并在执行或 abort 后计数归零时调用 protected virtual TaskAllDone。
新功能
mormot.core.threads
f54b3fa0+47-20
core: new TSynThreadPool.PendingTask property
影响
监控可区分 queued context 与全部 outstanding work,descendant 可在 pool 变为 idle 时响应。计数维护覆盖 IOCP 与 POSIX 路径。
值得一看
检查需要 idle notification 的自定义 TSynThreadPool descendant,并采用 2.4.17356 的最终计数语义。
公开 API
TSynThreadPool.PendingTasksaddedTSynThreadPool.TaskAllDoneadded
15
中
crypto 加速检查成为可复用 runtime API
TX64CpuFeatures 新增由 CLMUL、SSE4.1 与 AES-NI 计算的 cpuAESGCM。HasAesGcmAvx 与 HasKeccakAvx2 在报告加速实现前也会考虑 DisabledAsm。
新功能
mormot.core.base+1
7ee3b216+34-12
core: introducing cpuAESGCM and other crypto HW test functions
影响
Delphi 与 FPC x86-64 代码可查询 crypto engine 使用的同一最终 dispatch 决策,无需重复 CPU test。
值得一看
当诊断或测试必须遵循实际 runtime dispatch 时,请使用 HasAesGcmAvx 或 HasKeccakAvx2。
公开 API
cpuAESGCMaddedHasAesGcmAvxaddedHasKeccakAvx2added
16
中
finalized queue 可重新启用并报告等待消费者
TSynQueue.WaitPopReset 仅在所有先前 WaitPop 调用注销后清除 destroying flag。TSynQueue.Waiters 返回受保护的 waiter count。
新功能
mormot.core.threads
808c57b2+35-3
core: new TSynQueue.WaitPopReset/Waiters methods
影响
通过 WaitPopFinalize 停止的队列可在 reset 成功后复用,且无需重新分配存储 item。监控可安全观察 active consumer。
值得一看
仅在 WaitPopFinalize 返回后调用 WaitPopReset;若旧 waiter 仍在终止,请处理 false。
公开 API
TSynQueue.WaitPopResetaddedTSynQueue.Waitersadded
17
中
thread pool 可等待所有已接受任务完成
TSynThreadPool.WaitFor 监视 PendingTasks 直至归零;可用时使用 OsWaitOnValue,否则使用短 sleep。它支持有限 timeout 与 INFINITE。
新功能
mormot.core.threads
c7512a04+34-2
core: new TSynThreadPool.WaitFor method
影响
应用获得已接受 pool work 的完成屏障。此初始实现需要后续三个平台与 wake-up 修复,不应单独挑取。
公开 API
TSynThreadPool.WaitForadded
18
中
队列消费者阻塞于原生 OS wait primitive
TSynQueue 增加 sequence counter,并在 Win8+ 与 Linux 上使用 OsWaitOnValue、OsWakeOnValue 和 OsWakeAllOnValue。Push 唤醒一个已注册 consumer;finalization 与 binary load 唤醒全部。
性能
mormot.core.threads+1
ac7c87e4+71-27
core: rewritten TSynQueue to use the OS futex if possible
影响
支持系统上的普通 WaitPop 在 idle 时不再 spin,降低 CPU 占用与 wake latency。不支持平台保留 SleepStep fallback。
公开 API
TSynQueue.WaitPopbehaviour-changed
19
中
WaitFor 对 Delphi IOCP build 可见
TSynThreadPool.WaitFor 声明移出 non-IOCP 条件区,与实现一致,使 Delphi Windows build 可编译。
编译器与平台
mormot.core.threads+1
5541a4f1+5-6
core: fixed Delphi compilation
影响
带新方法的中间 build 可能无法为 Windows IOCP 配置编译。FPC 与 non-IOCP 声明原本已可见。
20
中
Tunnel 关闭状态合并至单一受保护 flag set
独立 fClosed boolean 合并到 TTunnelLocalFlags,frame 处理拆分为 handshake state 捕获与 RelayFrame 处理。CallbackReleased 直接映射至 ClosePort(FromNotify=true)。
内部重构
mormot.net.tunnel
d60cc6e8+46-48
net: internal Tunnel flags refactoring
影响
关闭状态与其他受保护 flag 保持原子一致,remote notification 变为幂等。此为后续更多 race fix 前的中间重构。
21
低
测试失败新增 exception-aware 报告 helper
TSynTestCase.FailedRaised 通过 ObjectToJsonDebug 格式化 Exception 后调用 TestFailed。stack-symbol filter 也移除 mormot.core.log 与 mormot.core.test 的重定向 frame。
新功能
mormot.core.log+2
311e29ed+45-36
core: introducing TSynTestCase.FailedRaised method
影响
自定义 mORMot 测试套件可一致报告意外异常,并获得更干净的 caller location。生产 runtime 路径不变。
公开 API
TSynTestCase.FailedRaisedadded
22
低
内部原子递增统一使用 pointer-based helper
序列生成、thread-pool 计数、ECC 引用计数与测试中的四个 InterlockedIncrement 调用改为传入显式地址的 LockedInc32。
编译器与平台
mormot.core.base+3
883ee3ae+9-9
core: use LockedInc32() instead of InterlockedIncrement()
影响
行为不变;代码在 Delphi 与 FPC target 上统一使用 framework atomic wrapper。
23
低
队列并发测试采用新的 owned-task pool
test.core.threads 用由单个 TSynThreadTasks 执行的 TSynThreadTask descendant 取代专用 push/wait thread class,并保留 finalize、reset 与 multi-waiter 覆盖。
测试
test.core.threads
c18eb6c5+340-333
test: rewrite TSynQueue using TSynThreadTasks
影响
应用行为不变。回归套件在验证 TSynQueue 并发时也覆盖新的 task-pool ownership model。
24
低
队列回归覆盖移至 thread 测试单元
完整的 TSynQueue 值、persistence 与 worker 测试从 test.core.base 移至 test.core.threads,靠近其覆盖的并发原语。
测试
test.core.base+2
d73f877c+200-233
test: moved TSynQueue tests to test.core.threads.pas
影响
应用行为不变;测试组织现在与实现领域一致。
25
低
队列 futex 路径新增并发 wake 与 shutdown 测试
test.core.threads 增加 delayed producer、八个并发 WaitPop consumer、WakeOne 分配、WaitPopFinalize 的 WakeAll 行为及 finalization 后拒绝检查。
测试
test.core.threads
db598d3b+257-4
test: completed TSynQueue coverage
影响
应用代码不变。Windows 与 Linux futex 行为现在由真实并发 waiter 覆盖。
26
低
队列 reset 获得重复 multi-waiter 回归覆盖
test.core.threads 增加含八个 waiting thread 的 finalize/reset cycle,验证 reset 后 wake-one 交付,并确认第二轮 finalization/reset 后队列仍可用。
测试
test.core.threads
3e909874+121-40
test: enhanced TSynQueue coverage
影响
应用行为不变。新的 WaitPopReset contract 在并发 sleeper 下得到验证,而非仅顺序调用。
27
低
回归测试以结构化详情报告意外异常
ZIP、network 与 ORM 测试用 TSynTestCase.FailedRaised 取代临时的 Check(false, E.Message) handler。ZIP data-descriptor fixture 改写为固定 temporary buffer。
测试
mormot.core.test+4
fc0d9757+80-75
test: some cleanup especially after #630
影响
应用行为不变。测试失败会保留 exception class 与结构化字段,更易诊断回归。
28
低
crypto 测试通过公开能力 helper 选择加速路径
TTestCoreCrypto 用 HasKeccakAvx2 与 HasAesGcmAvx 取代编译期 AVX 假设,扩展伪造 AES-GCM case,并验证未认证 plaintext 不会被误认为有效。
测试
test.core.crypt
f9ad68c8+43-25
test: refined TTestCoreCrypto content
影响
应用行为不变。测试现在仅运行硬件、OS state 与 DisabledAsm 共同支持的加速。
29
低
AES-GCM 测试拒绝篡改的 ciphertext、tag 与 associated data
_AES_GCM 在 scalar 与可用 AVX 模式下加密并验证长度 1 至 64,随后分别修改 ciphertext、authentication tag 与 AAD,并要求每次校验失败。
测试
test.core.crypt
5f464423+24-1
test: cover forged AES-GCM ciphertext, tag and AAD in _AES_GCM
影响
应用行为不变。该回归直接覆盖前一 commit 修复的 authentication bypass。
30
低
Tunnel 锁与所有权规则记录于代码旁
mormot.net.tunnel 记录实现采用的并发规则:短 state lock、锁内不做外部调用、worker 由 owner 管理及两阶段 shutdown。TTunnelLocalThread.Abort 也允许 self=nil。
文档
mormot.net.tunnel
2ad1823e+27-2
net: add some comments about Tunnel internal algorithms & patterns
影响
注释不改变应用行为。nil guard 让内部 shutdown 调用更具防御性。