mORMot2 Daily每日上游提交速读

DNS 会重试截断响应,Win64 内存分配遵循 ABI

DNS 客户端现在会通过 TCP 重试所有截断的 UDP 响应,并更安全地拒绝畸形压缩名称;TXT 与 HINFO 记录文本也按长度前缀的线上格式解码。FPC Win64 用户获得两项连续修复:mormot.core.fpcx64mm 不再在调用周围直接操作 stack pointer,并替换了可能在 Windows ARM 模拟环境下发生 fault 的锁例程。新的 TCachedValues wrapper 尚不适合使用,因为此修订中 Exists 的比较分支写反了。

要点

  • DnsQuery 现在会通过 TCP 重试 TC=1 响应,即使 UDP 包没有 answer 或带有错误码。
  • DnsParseString 会拒绝向前、自指及保留的压缩指针;TXT 与 HINFO 现在遵循 RFC 的长度前缀编码。
  • FPC Win64 的 mormot.core.fpcx64mm 不再在 ABI 敏感调用周围使用 push/pop;应采用 build 2.4.16790,不要停在 2.4.16784。
  • TCachedValues 新增为公开类型,但此修订中的 TCachedValues.Exists 使用默认比较器时始终 miss,并会忽略传入的 CustomCompare。

升级建议

使用 FPC_X64MM 的 FPC Win64 用户及依赖 mormot.net.dns 的应用应采用 build 2.4.16790。不要停在尚未转换剩余 Win64 push/pop 位置的 build 2.4.16784,也不要停在 TC=1 fallback 尚未接受带错误码截断包的 build 2.4.16786。在比较器选择修正前,不要采用 TCachedValues.Exists。

版本号2.4.16776 → 2.4.16790
提交10
行数+445 -176
阅读1 分钟

9 条中的 9 条 · 上游 10 次提交

主题
# 条目 类别 单元
1 高 Win64 allocator 汇编改用 FPC 管理的局部变量保存状态 mormot.core.fpcx64mm 改写 _GetMem、_ReallocMem 与 _AllocMem 的 MSWINDOWS 路径,将非易失寄存器及临时值保存在已声明的局部变量中,不再在调用周围使用 push/pop。mormot.core.os 也移除专用 x86-64 TRWLock.ReadOnlyLock 汇编;旧路径在 Windows ARM PRISM 下观察到 GPF 后,改用 Pascal 的 LockedExc/SpinAndWait 实现。 修复 mormot.core.fpcx64mm+1 3aca6e26+109-66

core: fixed fpcx64mm on Win64 ABI

影响

使用 FPC_X64MM 的 FPC Win64 代码在主要分配路径的 ABI 敏感嵌套调用中不再扰动 rsp,从而降低崩溃或内存损坏风险。通过 PRISM 运行 x86-64 的 Windows ARM 系统可避开已观察到的 TRWLock general-protection fault;其他平台保持原路径。

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

2 高 其余 Win64 allocator 调用不再用 push/pop 保存寄存器 mormot.core.fpcx64mm 为 PrefetchMediumBlock、FreeMediumBlock 与 _FreeMem 添加 MSWINDOWS 局部保存槽。非易失寄存器、medium block 大小及返回值存入编译器管理的 frame,不再在嵌套调用周围修改 rsp;System V 路径仍保留 push/pop。 修复 mormot.core.fpcx64mm 4af05f7b+48-12

core: (hopefully) one last fpcx64mm pass for Win64 ABI fixes

影响

这补全了分配与释放路径的 Win64 ABI 修复,其中 stack alignment 与 shadow space 由 FPC 控制。Win64 上使用 FPC_X64MM 的服务可避开剩余调用点风险;POSIX/Linux 汇编仍使用更快的无 frame 路径。

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

3 高 压缩 DNS 名称会拒绝循环、向前指针及保留 label mormot.net.dns 的 DnsParseString 会单独计算每个 14-bit compression offset,并拒绝等于或超过指针位置或响应边界的 offset。它只记录第一个返回位置,并在复制字节前拒绝保留的 %01xxxxxx 与 %10xxxxxx label 形式。 修复 mormot.net.dns ddb63463+15-10

net: fixed DnsParseString() decoding against RFC 1035

影响

畸形或恶意 DNS 响应无法再让 parser 无限跟随自指或向前 compression chain,越界指针也会在访问前失败。有效的 RFC 1035 向后压缩仍可正常解码。

公开 API

  • DnsParseStringbehaviour-changed — 无效的向前、自指、保留及越界压缩编码现在返回零。

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

4 高 空的截断 UDP 响应现在仍会触发 DNS TCP 重试 mormot.net.dns 的 DnsQuery 先在 header、来源、transaction ID 与响应 flag 有效时接受 UDP 响应,再检查 Truncation,之后才要求 body 大于请求且 AnswerCount 非零。因此即使无 answer,TC=1 header 也会转入现有 TCP 路径。 修复 mormot.net.dns 7c79f344+12-9

net: fixed DNS responses with TC=1

影响

当前 Samba 等仅通过 UDP 返回截断 header 的 resolver 不再造成错误 DNS 失败。客户端遵循 RFC 2181,经 TCP 获取完整响应。

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

5 中 TXT 与 HINFO 记录现在正确解码 character-string 字段 mormot.net.dns 新增有边界检查的 DnsParseCharString helper。DnsParseData 会连接 TXT RDATA 中所有长度前缀字符串,将 HINFO 精确解码为 CPU 与 OS 两个字符串,并在组件越过记录边界时清空 Text。其他受影响单元仅修正注释或 LDAP 错误字符串的拼写。 修复 mormot.core.text+2 55352bf1+51-7

net: properly decode TXT/HINFO DNS fields content

影响

TXT 响应不再把线上长度字节暴露为文本,也不再被当作压缩域名处理。HINFO 会返回预期的 CPU 与 OS 对,畸形长度会失败而不会读入下一条记录。

公开 API

  • DnsParseDatabehaviour-changed — TXT 与 HINFO RDATA 现在使用 DNS character-string 解码。

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

6 中 DNS header flag 与 TCP fallback 现在接受合法服务器行为 TDnsHeader.GetZ 现在读取 Z bit 所在的 Flags2。DnsQuery 会先检查 TC,再因非成功响应码拒绝数据,因此任何截断 UDP 响应都可触发 TCP;最终 TCP 响应也不再强制要求 RecursionAvailable。 修复 mormot.net.dns f2d633a0+7-8

net: some other fixes to our DNS parser

影响

权威或非递归 DNS 服务器可在未设置 RA 时通过 TCP 返回结果;带错误码的截断 UDP 包仍会获得必要的 TCP 重试。header Z 检查现在读取正确字节。

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

7 中 新的线程安全值缓存尚无法正确查找条目 mormot.core.unicode 新增公开 record/object TCachedValues,包含 TLightLock 保护、排序的 TRawUtf8DynArray、通过 GetTickSec shr TixShr 实现的时间窗口重置,以及 Reset、Exists 与 Add 方法。在 Exists 中,Assigned(CustomCompare) 分支调用默认比较 overload,而 nil 分支把 nil 传给自定义比较 overload。 新功能 mormot.core.unicode 047555ca+64-2

core: new TCachedValues thread-safe wrapper

影响

默认 CustomCompare=nil 时,TCachedValues.Exists 调用的 overload 会因未分配比较器而立即返回未找到。提供自定义比较器时,Add 按该比较器排序,但 Exists 使用默认区分大小写比较器搜索。因此新调用方不能依赖 build 2.4.16790 中的 Exists。

值得一看

此修订中不要采用 TCachedValues.Exists;请等待修复,或在本地调换其比较器分支,并为默认及自定义比较添加测试。

公开 API

  • TCachedValuesadded — 公开的时间窗口排序 RawUtf8 缓存,提供 Reset、Exists 与 Add;此修订中的 Exists 有缺陷。

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

8 低 网络回归文件改为存放在测试可执行文件旁 TNetworkProtocols.Setup 在可执行文件旁创建 temp 目录,OpenAPI、Kerberos keytab、DHCP lease 与 HTTP body-download 测试改用该目录,而非系统临时目录或 WorkDir。序列后缀还可防止 body-download 文件名冲突。 测试 73b7ed6a+57-27

tests: network protocols won't use system temp folder

影响

测试运行可避开系统临时目录权限问题,后台测试也不会再于 WorkDir 中观察到其他测试的临时文件。框架运行时与应用文件位置不变。

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

9 低 PDF 字体测试接受更多 Windows 环境的已知输出 hash TTestUiPdf.FontEmbeddingAndHashValidation 将两个依赖 OS 版本的 hash 表替换为由 IntegerScanExists 检查的五个可接受 hash。测试还改用显式 TPdfDocument 变量,以字体名称和十六进制 hash 报告结果,并仅在 ANSI_CHARSET 替换可用时执行第二轮。 测试 5ee01b27+28-29

test: refined TTestUiPdf.FontEmbeddingAndHashValidation

影响

PDF 回归测试现在容忍由系统安装字体造成、而非框架缺陷导致的已知嵌入差异。PDF 生成代码及应用输出不变。

Arnaud Bouchez · 08:39 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