立即处理可能影响正在运行的系统原始 payload 不含 superseded_by 标记。应避开的范围依据内嵌的连续 diff;这些 diff 明确修正了本期更早的 commit。DHCP merge 将 mormot.commit-num.inc 保持在 16805,因此推荐修订比该编号 build 更新,但显示版本不变。
DNS 新增 EDNS、严格响应验证和 IPv6 resolver
DNS 客户端现在会声明 1232 字节的 EDNS UDP payload,在服务器返回 FORMERR 时回退,接受 resolver port 与 IPv6 地址,并在解析记录前验证回显的问题和响应来源。本批次中该实现经历了多次修正,因此 DNS 用户应采用最终 build,而不要停在中间修订。TCachedValues.Exists 已修复并加入测试,DHCP scope 也终于会发送配置的域名。
要点
- 完整 DNS 系列应采用 2.4.16805;build 2.4.16794 至 2.4.16804 包含 cache、EDNS、解析或验证的中间状态。
- DnsQuery 默认使用 1232 字节 EDNS,记住 FORMERR 回退,并验证响应的问题、类型、class、来源地址及来源 port。
- Resolver 定义现在支持带内联 port 的 IPv4 和 IPv6 地址;DnsBuildQuestion 公开可选的 EDNS payload size。
- TCachedValues.Exists 现在会选择正确的 comparator,Exists/Add 默认使用不过期的 cache window。
- TDhcpState.AddRegularOptions 现在从 Scope.DomainName 发送 DHCP option 15,同时仍由 per-client rule 优先覆盖。
升级建议
DNS 用户应采用 build 2.4.16805 并完整合入整个系列。不要停在 2.4.16794 至 2.4.16804:连续 commit 依次修正了 cache 过期、EDNS FORMERR 回退、响应定位、解压和响应匹配。TCachedValues 用户应从 2.4.16790 升级以获得 comparator 修复。依赖 Scope.DomainName 的 DHCP server 应采用 2.4.16805 之上的最终 head commit。
16 条中的 16 条 · 上游 17 次提交
1
高
DNS 响应现在必须匹配 resolver、port 和原始问题
DnsSendQuestionRaw 支持 IPv4 或 IPv6 resolver 地址,并拒绝来源 IP 或 port 与目标 endpoint 不同的 UDP 响应。DnsQuery 在 ParseDnsResult 前解压并比较回显的 QName、QTYPE 和 QCLASS;TDnsHeader.SetZ 现在写入 Flags2 而不是 Flags。
安全
mormot.net.dns
a415524a+69-62
net: several DNS fixes
影响
畸形、不匹配或发错目标的响应会被跳过并尝试下一个 resolver,而不会作为所请求的答案解析。应用也可直接查询 IPv6 DNS server。
建议升级
使用 mormot.net.dns 访问外部 resolver 的应用应升级,并测试显式 IPv6 或非默认 port 配置。
公开 API
DnsSendQuestionbehaviour-changed — Resolver endpoint 可使用 IPv6,且 UDP 响应必须同时匹配来源地址与 port。DnsQuerybehaviour-changed — 成功响应必须回显请求的 QName、QTYPE 与 QCLASS,记录才会被接受。TDnsHeader.Zbehaviour-changed — Setter 现在会更新保存 Z bits 的第二个 DNS flags 字节。
2
高
DNS 解压会拒绝循环指针链和超长名称
内部 DnsDecompress 现在跟踪上一个 compression offset,要求每个指针向后移动,拒绝保留指针形式,并在复制到固定 buffer 前执行 DNS 名称 255 字符限制。DnsParseString 委托给该有界例程。
安全
mormot.net.dns
ae18fe67+53-44
net: hardened DNS decompression logic
影响
畸形或恶意 DNS packet 无法再让解压器陷入循环链或溢出临时名称 buffer。有效的向后压缩名称仍可正常解码。
建议升级
解析不受信任 DNS server 响应的服务应升级,并在协议测试中保留畸形 compression 用例。
公开 API
DnsParseStringbehaviour-changed — 循环、向前、保留、越界或超长的压缩名称现在会返回零并失败。
3
高
EDNS 回退与记录定位得到修正
DnsQuery 现在仅在 EDNS 请求返回 FORMERR 时回退到普通 RFC 1035 请求,将该 server 决策缓存最多四分钟,并把记录解析拆分到 ParseDnsResult。DnsBuildQuestion 暂时返回用于解析的问题 body 边界。
修复
mormot.net.dns
432444d3+63-52
net: several fixes to EDNS(0) support
影响
这修复了初始 EDNS 分支:此前会因非 FORMERR 错误禁用 EDNS,却无法正确进入 FORMERR 回退。后续 commit 会替换临时 body-size 假设,因此不应停在此 build。
4
高
DNS 记录解析从服务器返回的问题位置开始
ParseDnsResult 通过解压响应中的 QName 确定第一条记录位置,不再复用本地构造请求的长度。DnsQuery 要求 QuestionCount=1,TCP 也允许仅有 header 大小的响应。
修复
mormot.net.dns
3da23281+41-22
net: several DNS fixes
影响
如果回显问题采用不同但有效的线上编码,响应会从实际边界开始解析。问题数量异常的响应会被拒绝,而不会导致记录解析偏移。
公开 API
DnsQuerybehaviour-changed — 响应必须包含一个问题,记录解析会跟随返回问题的编码。
5
高
TCachedValues 查找现在使用排序 cache 的 comparator
TCachedValues.Exists 修正错误的比较分支:配置 CustomCompare 时传给对应的 FastFindPUtf8CharSorted overload,nil 则选择默认 overload。Exists 与 Add 也新增默认 TixShr=0,零表示不周期清空。
修复
mormot.core.unicode
256cc2f4+13-11
core: fixed TCachedValues
影响
2.4.16790 新增的公开 cache 现在可使用默认或自定义 comparator 正确查找。已有实验用户在依赖 Exists 或重复抑制前应替换有缺陷的 build。
建议升级
采用 2.4.16790 TCachedValues 的代码应升级;重新测试默认与自定义比较模式后移除本地 comparator 分支 workaround。
公开 API
TCachedValues.Existsbehaviour-changed — 查找现在在已设置时使用 CustomCompare,否则使用默认 comparator;TixShr 默认为零。TCachedValues.Addsignature-changed — TixShr 改为可选且默认为零,表示不过期 cache。
6
高
DnsQuery 启用 1232 字节 EDNS 并修复默认 DNS port
DnsQuery 首先使用新的全局 DnsEdnsUdpSize 发送带 OPT 的问题,默认 1232 字节并限制在 4KB 接收 buffer 内。DnsSendQuestionRaw 在 Port 为空时将 fallback 从 389 改为 53;DnsQuery 把 Res 从 out 改为 var,以便复用前 finalize managed fields。
新功能
mormot.net.dns
fb1b5127+81-38
net: implemented EDNS(0) advertised UDP payload size
影响
大多数不超过 1232 字节的 DNS 响应可继续使用 UDP,减少 TCP 回退。Port 为空的直接 DnsSendQuestion 调用现在指向正确 DNS 服务,但初始 EDNS 回退逻辑由下一 commit 修正。
公开 API
DnsEdnsUdpSizeadded — 控制 EDNS UDP payload 声明值的公开全局变量;默认 1232,零表示禁用 EDNS,数值限制为 512..4096。DnsQuerysignature-changed — TDnsResult 参数由 out 改为 var;普通变量调用语法不变。
7
中
DHCP scope 现在会发送配置的域名
mormot.net.dhcp 的 TDhcpState.AddRegularOptions 现在调用 AddOptionOnceU,以 Scope.DomainName 生成 doDomainName。测试覆盖 scope 值,并确认 per-client rule 请求的 domain-name 会先发出,因此仍具有优先级。
修复
mormot.net.dhcp
3ad9e8c1+29-0
net: DHCP server was never sending the domain-name option 15
影响
从 TDhcpServer 获取 lease 的客户端现在可以从 scope 配置收到 DHCP option 15。现有 per-client domain-name override 行为不变。
建议升级
设置 Scope.DomainName 的 DHCP server 应升级,并在 lease 更新后验证客户端收到 option 15。
8
中
每个 resolver 条目可携带自己的 port
DnsSendQuestionRaw 将 Address 中唯一的冒号解析为内联 IPv4 port,并在设置 TNetAddr 前覆盖单独的 Port 参数。tcp@ 前缀会先移除,cache key 使用处理后的地址。
新功能
mormot.net.dns
c6756d1e+17-12
dns: allow 'ip:port' for DNS servers definitions
影响
NameServers 可指向 127.0.0.1:5353 等 resolver,无需修改全局 DnsPort。包含多个冒号的 IPv6 literal 不会被误判为内联 port 语法。
值得一看
若自定义 resolver 配置当前使用单独 port,请复核;现在可在每个 NameServers 条目中指定。
公开 API
DnsSendQuestionbehaviour-changed — Address 支持带内联 :port 的 IPv4 地址。
9
中
DnsBuildQuestion 可附加 EDNS OPT 记录
DnsBuildQuestion 新增可选 EdnsUdpSize 参数。非零值会添加一个 OPT pseudo-record、设置 AdditionalCount、把声明 UDP 大小限制在 512..4096,并写入零 extended RCODE、version、flags 与 option data。
新功能
mormot.net.dns
cd234840+18-5
net: optional EDNS(0) support for DnsBuildQuestion()
影响
低层调用方无需自行组装 OPT record 即可构建标准 EDNS 问题。现有三参数调用保持 classic DNS 行为,因为新参数默认为零。
值得一看
需要更大 UDP 响应的自定义 DnsBuildQuestion 调用应复核;显式设置 EdnsUdpSize,并合入后续 DNS 修复。
公开 API
DnsBuildQuestionsignature-changed — 新增可选 EdnsUdpSize: cardinal = 0;非零时写入 OPT pseudo-record。
10
中
DNS 传输先接收原始响应,再应用查询策略
传输实现改为 DnsSendQuestionRaw,可接收结构有效的 UDP 或 TCP 响应,不受 RCODE 或 answer count 限制。公开 DnsSendQuestion wrapper 保留旧成功策略;no-TCP cache 插入现在与查找同用 TixShr=6。
内部重构
mormot.net.dns
f1b7dcaf+25-20
net: fixed and refactored DnsSendQuestion()
影响
高层 DnsQuery 可检查 FORMERR 并实现 EDNS 回退,同时不削弱公开 raw-query contract。对 TCP 失败 server 的一分钟抑制重新生效。
11
中
DNS 使用共享 cache wrapper 记录 TCP 失败的 resolver
专用 NoTcpSafe、NoTcpTix16 与 NoTcpServers 存储被 TCachedValues 替代。TCachedValue 和 TCachedValues 也将 TixShr=0 视为不过期周期,并注明 record 存储必须先清零。
内部重构
mormot.core.os+3
e8fd8b73+14-21
net: some DNS code simplification
影响
预期行为仍是将不响应 TCP 的 resolver 缓存 64 秒。此 commit 插入时使用新的默认 TixShr=0,而查找使用 6,因此 cache 在后续 DnsSendQuestion refactor 向 Add 传入 6 前无效。
公开 API
TCachedValue.Cachebehaviour-changed — TixShr=0 现在表示稳定不过期的 cache period,不再派生 tick 值。
12
低
Intel/AMD 搜索汇编减少寄存器与 move 压力
多个 x86/x64 scan/search 例程使用 or 而非 mov 生成 -1。x64 FastFindPUtf8CharSorted 重新组织,以避免保存 r12/r13、缓存首字节并通过 indexed addressing 比较后续字节。
性能
mormot.core.base+1
1daae163+54-52
core: optimized Intel/AMD asm
影响
Intel/AMD 目标上的常用 scan 与排序 RawUtf8 查找使用更少指令或保存寄存器。公开行为与返回值不变。
13
低
16-bit byte swap 生成更简洁的 FPC 代码
mormot.core.base 的 bswap16 现在按值接收 cardinal 参数,先通过 ToByte 取得低字节,再移位并与高字节组合。在支持的平台上该函数仍为 inline。
性能
mormot.core.base
e00798bb+6-5
core: optimized bswap16() function
影响
FPC 可为这一常用 endian 转换生成更短指令序列。现有调用方的结果不变。
公开 API
bswap16signature-changed — 标量参数由 const cardinal 改为 cardinal;普通调用保持源码兼容。
14
低
Linux ARP 查找改用显式网络字节序常量
mormot.net.sock.posix.inc 的 GetRemoteMacAddress 在构建和检查原始 Ethernet frame 时,以 ETH_P_IP_LE、ETH_P_ARP_LE 及移位 ARP 常量替代重复的 bswap16 调用。实现 include 内的 TRawARP 规范为 TRawArp。
内部重构
mormot.net.sock
3b7a2a4f+17-15
net: refactored GetRemoteMacAddress() on Linux
影响
Linux 远程 MAC discovery 保持相同 packet layout 与权限要求。该变更移除低层路径中的运行时 byte swap,不改变应用调用。
15
低
TFTP frame opcode 直接按网络字节序写入
TTftpContext 在写入 OACK、ACK、DAT 与 ERR opcode 时,以常量移位替代 bswap16。Sequence 和 error-code 字段保留原有转换逻辑。
内部重构
mormot.net.tftp.client
eee50161+6-6
net: minor TFTP logic refactoring
影响
生成的 TFTP frame 不变;这是内部小幅简化,不涉及 API 或协议迁移。
16
低
Cache 修复新增 add、lookup 与 reset 直接测试
test.core.base 初始化 TCachedValues,并验证未命中查找、唯一插入、重复拒绝、成功查找和 Reset。PDF font 测试新增一个已知的平台相关 hash。
测试
test.core.base+1
816a0e19+24-5
tests: enhanced coverage
影响
生产代码不变。测试覆盖前一 commit 修复的默认 comparator 缺陷,并扩大可接受的 PDF 渲染差异。