mORMot2 Daily每日上游提交速读

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。

版本号2.4.16790 → 2.4.16805
提交17
行数+559 -370
阅读2 分钟

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。

公开 API

  • DnsSendQuestionbehaviour-changed — Resolver endpoint 可使用 IPv6,且 UDP 响应必须同时匹配来源地址与 port。
  • DnsQuerybehaviour-changed — 成功响应必须回显请求的 QName、QTYPE 与 QCLASS,记录才会被接受。
  • TDnsHeader.Zbehaviour-changed — Setter 现在会更新保存 Z bits 的第二个 DNS flags 字节。

Arnaud Bouchez · 17:33 UTC · 在 GitHub 上查看该提交 →

2 高 DNS 解压会拒绝循环指针链和超长名称 内部 DnsDecompress 现在跟踪上一个 compression offset,要求每个指针向后移动,拒绝保留指针形式,并在复制到固定 buffer 前执行 DNS 名称 255 字符限制。DnsParseString 委托给该有界例程。 安全 mormot.net.dns ae18fe67+53-44

net: hardened DNS decompression logic

影响

畸形或恶意 DNS packet 无法再让解压器陷入循环链或溢出临时名称 buffer。有效的向后压缩名称仍可正常解码。

公开 API

  • DnsParseStringbehaviour-changed — 循环、向前、保留、越界或超长的压缩名称现在会返回零并失败。

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

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。

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

4 高 DNS 记录解析从服务器返回的问题位置开始 ParseDnsResult 通过解压响应中的 QName 确定第一条记录位置,不再复用本地构造请求的长度。DnsQuery 要求 QuestionCount=1,TCP 也允许仅有 header 大小的响应。 修复 mormot.net.dns 3da23281+41-22

net: several DNS fixes

影响

如果回显问题采用不同但有效的线上编码,响应会从实际边界开始解析。问题数量异常的响应会被拒绝,而不会导致记录解析偏移。

公开 API

  • DnsQuerybehaviour-changed — 响应必须包含一个问题,记录解析会跟随返回问题的编码。

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

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。

公开 API

  • TCachedValues.Existsbehaviour-changed — 查找现在在已设置时使用 CustomCompare,否则使用默认 comparator;TixShr 默认为零。
  • TCachedValues.Addsignature-changed — TixShr 改为可选且默认为零,表示不过期 cache。

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

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;普通变量调用语法不变。

Arnaud Bouchez · 11:26 UTC · 在 GitHub 上查看该提交 →

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 行为不变。

zen010101 · 17:43 UTC · 在 GitHub 上查看该提交 →

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 地址。

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

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。

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

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 的一分钟抑制重新生效。

Arnaud Bouchez · 09:29 UTC · 在 GitHub 上查看该提交 →

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 值。

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

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 查找使用更少指令或保存寄存器。公开行为与返回值不变。

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

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;普通调用保持源码兼容。

Arnaud Bouchez · 17:31 UTC · 在 GitHub 上查看该提交 →

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,不改变应用调用。

Arnaud Bouchez · 17:33 UTC · 在 GitHub 上查看该提交 →

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 或协议迁移。

Arnaud Bouchez · 17:31 UTC · 在 GitHub 上查看该提交 →

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 渲染差异。

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