mORMot2 Daily每日上游提交速读

DHCP 请求归属与短数值解析得到修复

DHCP server 现在更严格地遵循 client 状态与 server selection 规则:NAK frame 被清理,指定其他 server 的请求会被忽略,过期的 static address 会被拒绝。后续修复还防止 malformed address option 被误认为真实 IPv4 值。除此之外,GetExtended 不再从仅一两个字符的无效输入中读取四个字节,因此解析不可信数值文本的服务应采用本期版本。

要点

  • 应采用 build 2.4.16861;build 2.4.16857 至 2.4.16859 可能把 malformed DHCP option 50 或 54 误认为真实地址。
  • GetExtended 现在会在执行四字节 NAN/INF 探测前拒绝过短的无效 token,防止读取超出所提供文本。
  • 若 DHCP REQUEST 的 server-identifier 指向其他 server,该请求会被忽略,并由新增的 dsmDroppedOtherServer metric 计数。
  • client 明确请求的地址若已不符合其 static reservation,现在会收到 NAK,而不是 renewal ACK。
  • DHCPNAK frame 不再包含 lease、network、boot 与 rule option,会保留 packet chaddr,并在无 relay 时广播。
  • DhcpIP4 对缺失或 malformed 的四字节 option 现返回零,使新的 REQUEST 检查不再产生错误 NAK 或错误丢弃。

升级建议

若使用 TDhcpServer 或把不可信文本传给 GetExtended,应完整采用 build 2.4.16861。不要停在 build 2.4.16857–2.4.16859:新的 DHCP option 50/54 决策依赖 DhcpIP4 对 malformed 数据返回零,该问题在 16860 修复。升级后请重新检查 DHCP REQUEST/NAK 流量、static reservation 迁移,以及任何持久化的 TDhcpScopeMetric 数值 ordinal。

版本号2.4.16851 → 2.4.16861
提交7
行数+192 -28
阅读1 分钟

6 条中的 6 条 · 上游 7 次提交

主题
# 条目 类别 单元
1 高 迁移后的 static reservation 会拒绝 client 请求的旧地址 当 TDhcpProcess.LockedResponse 找到 lsStatic lease 时,现在会把 option 50 读入 State.Ip4。对于 SELECTING 或 INIT-REBOOT 请求,若显式非零地址与保留的 p^.IP4 不同,它会返回 DoError(State, dsmNak),不再递增 dsmLeaseRenewed 并确认该 lease。 修复 mormot.net.dhcp 2d2627f7+17-3

net: NAK requested address is not the one reserved

影响

管理员迁移 static reservation 后,提交旧地址的 client 会被要求重新开始地址获取,不再在状态不一致时收到 ACK。无 option 50 的请求以及通过 ciaddr 的 RENEWING 会刻意保留现有行为。

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

2 高 Malformed DHCP 地址 option 不再伪装成 IPv4 值 mormot.net.dhcp 的 DhcpIP4 现在把 TNetIP4 result 初始化为零,而不是 option offset。仅当 option 存在且其 length byte 等于 SizeOf(TNetIP4) 时才替换零。回归测试发送三字节 option 50 与 54 payload,并要求正常 ACK 处理。 修复 mormot.net.dhcp a86688a9+16-3

net: fixed DhcpIP4()

影响

malformed requested-address 数据不再导致错误的 static-reservation conflict NAK,malformed server-identifier 数据也不再使 server 把 REQUEST 当作指向其他 server 而丢弃。正确的四字节 option 与缺失 option 在 Delphi 和 FPC 上保持原有含义。

公开 API

  • DhcpIP4behaviour-changed — 缺失或非四字节 option 现在返回零,而不是被解释为 IPv4 的 option-buffer offset。

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

3 高 选择其他 server 的 DHCP 请求会被忽略 mormot.net.dhcp 的 TDhcpProcess.LockedResponse 在处理任何 dmtRequest lease 前先用 DhcpIP4 读取 option 54。若非零 server identifier 与 TDhcpScope.ServerIdentifier 不同,它会通过 DoError 退出,并使用新增的 dsmDroppedOtherServer metric 与专用 trace 原因。 修复 mormot.net.dhcp 6a6f94d3+15-2

net: new DHCP dsmDroppedOtherServer for REQUEST

影响

在存在多个 DHCP server 的网络中,本 server 不再对选择了其他 server 的 SELECTING client 发送 ACK 或 NAK。新增 enum member 会改变后续 TDhcpScopeMetric 值的数值 ordinal,因此使用原始 metric ordinal 或 set bit position 的代码与存储应进行检查。

值得一看

检查多 server REQUEST trace,并搜索持久化的 Ord(TDhcpScopeMetric) 值或数值 TDhcpScopeMetrics mask。

公开 API

  • TDhcpScopeMetric.dsmDroppedOtherServeradded — 统计 server-identifier 选择其他 DHCP server 的 REQUEST packet。

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

4 高 短无效数值文本不再触发四字节读取 在 mormot.core.text 的非 WIN32DELPHI GetExtended 实现中,非数字路径现在会先检查 P[1] 与 P[2] 是否为 NUL,再读取 PCardinal(P)^ 以识别 NAN 或 INF。长度为一或两个字符的无效 token 会直接进入现有错误路径。 修复 mormot.core.text 0a750051+5-2

core: avoid potential read overflow in GetExtended()

影响

解析短无效 buffer 的 FPC 与非 Win32 Delphi 服务可避免越过所提供 NUL-terminated 文本的潜在读取,否则可能访问不可用内存。有效数字与公开 signature 不变;Delphi Win32 继续使用独立的 x87 assembly parser。

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

5 低 DHCP 回归测试覆盖 REQUEST 状态转换 test.net.proto 新增 matching 与 moved static reservation、INIT-REBOOT 和 SELECTING NAK、通过 ciaddr 的 RENEWING、NAK 后 OFFER,以及 static 或 dynamic REQUEST 选择其他 server 的用例。test.core.base 还新增 GetExtended('0.0') 回归 assertion。 测试 a0347464+73-3

tests: cover latest DHCP fixes

影响

应用代码与公开 API 均无变化。测试矩阵记录哪些 DHCP client 状态应被忽略、ACK、NAK 或获得 reservation OFFER,从而降低 Delphi 与 FPC server build 的回归风险。

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

6 低 DHCP malformed-option 测试移回受保护的测试主体 test.net.proto 把 finally 关键字移到 malformed option 50 与 54 assertion 之后。这些 assertion 现在在 try 主体中运行,而 server.Free 与 settings.Free 保留在 finally block,即使检查抛出异常也会执行。 测试 d3ed9070+4-3

tests: fixed typo on previous commit

影响

应用代码与公开 API 均无变化。malformed-option assertion 失败时不再跳过预期的测试资源清理,因此 Delphi 与 FPC 回归套件可在更安全的清理条件下报告失败。

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