Skip to content

[0146] C++ 层为 base64 编解码增加长度校验,修复长度参数越界读导致的段错误 - #967

Closed
da-liii wants to merge 2 commits into
mainfrom
da/0146/base64-length-check
Closed

da-liii wants to merge 2 commits into
mainfrom
da/0146/base64-length-check

Conversation

@da-liii

@da-liii da-liii commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

问题

(g_bytevector-base64-encode (make-bytevector 4 65) 1073741824) 会让 bin/gf 段错误(SIGSEGV, exit 139),见 demo/crash/f03-base64-encode-oob-length.scm。

根因:src/liii_base64.cpp 的 f_bytevector_base64_encode / f_bytevector_base64_decode 的第二参数(长度)直接 s7_integer(s7_cadr(args)),与 bytevector 实际长度完全无关;编码循环按声明长度读取 in[i],声明 1GB 时越界读取直至撞上未映射内存。负长度还会让负的 out_cap 进入 s7_make_byte_vector。decode 侧越界读通常被 Invalid base64 input 提前掩盖,但内存越界本身存在。

修复

沿用 0142-0145 的模式在 C 入口校验参数,长度增加区间校验:

  • 非整数:type-error(length must be an integer)
  • len < 0 或 len > (bytevector-length bv):value-error(length out of range)

复用现有 base64_error 报错路径。公开包装 bytevector-base64-encode/decode 始终传入正确长度,本修复防御的是 C 层入口 g_* 的直接调用。

测试

  • 新增 tests/liii/base64/bytevector-base64-encode-test.scm(6 条)与 tests/liii/base64/bytevector-base64-decode-test.scm(6 条):正常编解码 + 长度参数的 type-error/value-error。TDD:修复前 encode 测试文件本身即段错误,修复后 6/6 + 6/6 通过
  • 崩溃片段由 SIGSEGV 变为干净的 value-error: length out of range(exit 255),验证后按惯例移除并更新 README
  • 回归:tests/liii/base64-test.scm 通过

备注

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.

1 participant