立即处理可能影响正在运行的系统原始 payload 不含 superseded_by 标记。两个应避开的版本窗口来自连续 diff,后者明确补全前一项 Win64 ABI 与 DNS TC=1 变更。在此修订中,TCachedValues 除声明与实现外没有其他引用,因此 Exists 缺陷仅影响新的采用者。
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。
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;其他平台保持原路径。
建议升级
FPC_X64MM Win64 部署应将此提交与 4af05f7 一并采用,并从 build 2.4.16785 或更高版本重建,不要停在 2.4.16784。
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 路径。
建议升级
Win64 上的 FPC_X64MM 应使用 build 2.4.16785 或更高版本,并重建后对分配、重分配与释放进行压力测试。
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 向后压缩仍可正常解码。
建议升级
解析外部 resolver DNS 响应的服务应升级,并在协议测试中加入畸形 compression pointer 用例。
公开 API
DnsParseStringbehaviour-changed — 无效的向前、自指、保留及越界压缩编码现在返回零。
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 获取完整响应。
建议升级
若 mormot.net.dns 用户遇到 Samba 或其他 resolver 缺失响应,应升级到 build 2.4.16790,以包含后续 TC 检查。
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 对,畸形长度会失败而不会读入下一条记录。
建议升级
通过 DnsParseData 使用 TXT 或 HINFO 的代码应升级,并检查下游是否存在补偿旧错误文本的 parser。
公开 API
DnsParseDatabehaviour-changed — TXT 与 HINFO RDATA 现在使用 DNS character-string 解码。
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 检查现在读取正确字节。
建议升级
TC=1 处理至少应采用 build 2.4.16787,最好采用包含后续 parser 修复的本期最终版本。
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 有缺陷。
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 中观察到其他测试的临时文件。框架运行时与应用文件位置不变。
9
低
PDF 字体测试接受更多 Windows 环境的已知输出 hash
TTestUiPdf.FontEmbeddingAndHashValidation 将两个依赖 OS 版本的 hash 表替换为由 IntegerScanExists 检查的五个可接受 hash。测试还改用显式 TPdfDocument 变量,以字体名称和十六进制 hash 报告结果,并仅在 ANSI_CHARSET 替换可用时执行第二轮。
测试
5ee01b27+28-29
test: refined TTestUiPdf.FontEmbeddingAndHashValidation
影响
PDF 回归测试现在容忍由系统安装字体造成、而非框架缺陷导致的已知嵌入差异。PDF 生成代码及应用输出不变。