Skip to content

fix: use route -n to avoid reverse lookup timeout#323

Merged
zhaohuiw42 merged 1 commit intolinuxdeepin:masterfrom
zhaohuiw42:master
Mar 7, 2026
Merged

fix: use route -n to avoid reverse lookup timeout#323
zhaohuiw42 merged 1 commit intolinuxdeepin:masterfrom
zhaohuiw42:master

Conversation

@zhaohuiw42
Copy link
Copy Markdown
Contributor

This caused the update page to render blank

Bug: https://pms.uniontech.com/bug-view-351859.html

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 7, 2026

CLA Assistant Lite bot:
提交邮箱中包含我们的合作伙伴,但您似乎并非合作伙伴的成员或对接人,请联系相关对接人将您添加至组织之中,或由其重新发起 Pull Request。
The commit email domain belongs to one of our partners, but it seems you are not yet a member of the current organization, please contact the contact person to add you to the organization or let them submit the Pull Request.

You can retrigger this bot by commenting recheck in this Pull Request

@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这段代码的修改主要是对获取默认网关MAC地址的功能进行了重构和优化。以下是详细的审查意见:

1. 语法逻辑审查

优点:

  • 逻辑解耦:将解析路由表逻辑提取到独立的 getDefaultRouteIface 函数中,符合单一职责原则,提高了代码的可读性和可测试性。
  • 参数修正exec.Command("route", "-n") 添加了 -n 参数,这非常重要。它禁止 DNS 解析,直接输出 IP 地址,避免了因 DNS 问题导致的执行阻塞或错误,且输出格式更规范,易于解析。
  • 空格处理优化:使用 strings.Fields 替代 strings.Split(line, " ")。原代码在处理连续空格时可能会产生空字符串元素,导致切片索引错误;strings.Fields 能自动处理连续空白字符,更安全。
  • 判断条件修正:原代码检查 strings.Contains(line, "default") 依赖于本地化语言(如中文系统可能显示"默认"),且不够精确。新代码检查 fields[0] == "0.0.0.0",配合 -n 参数,确保了跨语言环境的兼容性和准确性。
  • 边界检查:增加了 if len(fields) < 8 的检查,防止因行格式异常导致的切片越界 panic。

潜在问题与建议:

  • 硬编码字段数量:代码中 if len(fields) < 8fields[0] 假设了 route -n 的输出格式固定为8列。虽然标准 Linux 输出通常如此,但不同发行版或版本可能略有差异。
    • 建议:可以考虑检查 fields[0] == "0.0.0.0"fields[0] == "default"(兼容性更强,但需配合 -n),并取最后一个字段作为接口名,不严格依赖列数,只要确保切片长度足够取最后一个元素即可。
  • 返回值处理getDefaultMac 函数在找不到设备时返回 ("", nil)。调用方可能无法区分"未找到设备"和"成功获取但为空"的情况。
    • 建议:考虑返回 ("", errors.New("default route interface not found")) 以明确错误状态。

2. 代码质量审查

优点:

  • 单元测试覆盖:新增了 TestGetDefaultRouteIface 测试用例,覆盖了"找到默认路由"和"未找到默认路由"两种场景,这是非常好的实践。
  • 路径拼接规范:使用 filepath.Join 替代字符串拼接 /sys/class/net/ + dev,提高了跨平台兼容性(尽管此路径是 Linux 特有的,但保持良好习惯很重要)。
  • 字符串清理strings.TrimSpace(string(mac)) 去除了读取文件可能产生的尾随换行符,使返回值更干净。

建议:

  • 测试用例补充:目前的测试用例比较正常,建议补充一些边界情况测试,例如:
    • 输出包含空行。
    • 输出格式异常(列数不足)。
    • 接口名称中包含空格(虽然 Linux 接口名通常不含空格,但防御性编程更好)。

3. 代码性能审查

  • 内存分配strings.Splitstrings.Fields 都会分配新的切片。对于 route 命令的输出(通常很小),性能影响可忽略不计。
  • I/O 操作:代码执行了外部命令 route 并读取了文件 /sys/class/net/.../address。这是获取系统信息的必要开销,无法避免。但需要注意 exec.Command 的超时控制,防止在某些异常系统状态下进程挂起。
    • 建议:虽然当前 diff 未涉及,但在生产环境中,建议为 exec.Command 设置 ContextTimeout

4. 代码安全审查

  • 命令注入风险exec.Command 使用参数列表形式("route", "-n")而非拼接字符串,有效防止了命令注入风险。
  • 路径遍历风险dev 变量来源于 route 命令的输出。虽然理论上 route 输出的是合法的网卡名,但如果有恶意篡改或解析错误,dev 可能包含 ../ 等字符。使用 filepath.Join 虽然规范,但不能完全消除路径遍历风险。
    • 建议:在拼接路径前,最好对 dev 进行简单的合法性校验(例如正则匹配 ^[a-zA-Z0-9]+$),确保它是一个合法的网卡名称,防止读取预期之外的文件。
  • 权限问题:读取 /sys/class/net/.../address 通常不需要 root 权限,但执行 route 命令在某些受限环境中可能受 seccomp 或 AppArmor 限制。这是运行时环境的安全考量。

总结

这段代码修改质量很高,主要改进了跨语言兼容性解析逻辑的健壮性代码结构

改进建议汇总:

  1. getDefaultRouteIface 中,稍微放宽对列数的严格限制,只要能取到目标字段即可。
  2. getDefaultMac 中,找不到设备时建议返回明确的 error。
  3. 补充单元测试的边界情况(异常格式输出)。
  4. 考虑为 exec.Command 添加超时机制。
  5. 对从 route 获取的网卡名称 dev 进行简单的格式校验,增强安全性。

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: qiuzhiqian, zhaohuiw42

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@zhaohuiw42 zhaohuiw42 merged commit 6f19756 into linuxdeepin:master Mar 7, 2026
15 of 17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants