立即处理可能影响正在运行的系统原始 payload 不含 superseded_by 标记。其中的 merge commit 包含一个更早编写、未在本时间窗口单独列出的 branch commit 所做的 DHCPNAK frame 修复;本期已审查并总结该内嵌 merge diff。应避开的范围依据可见的 16857–16860 序列,其中 DhcpIP4 最终补全新的 REQUEST 检查。
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。
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 会刻意保留现有行为。
建议升级
升级到 2.4.16861,并测试 static reservation 地址可能在 client 仍缓存旧 lease 时发生变化的场景。
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 上保持原有含义。
建议升级
不要部署 build 2.4.16857–2.4.16859;请升级到 2.4.16861,并测试 malformed option 50 与 54 packet。
公开 API
DhcpIP4behaviour-changed — 缺失或非四字节 option 现在返回零,而不是被解释为 IPv4 的 option-buffer offset。
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。
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。
建议升级
若 GetExtended 接收外部文本,尤其是一两个字符的无效值,请升级。
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 的回归风险。
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 回归套件可在更安全的清理条件下报告失败。