Skip to content

fix(ent): make GroupQuery clone nil-safe - #5367

Closed
wucm667 wants to merge 1 commit into
Wei-Shaw:mainfrom
wucm667:fix/issue-5360-group-query-clone
Closed

fix(ent): make GroupQuery clone nil-safe#5367
wucm667 wants to merge 1 commit into
Wei-Shaw:mainfrom
wucm667:fix/issue-5360-group-query-clone

Conversation

@wucm667

@wucm667 wucm667 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

问题

GroupQuery.Clone 在查询上下文或 SQL selector 尚未初始化时会发生空指针异常。

根因

克隆逻辑无条件调用 _q.ctx.Clone()_q.sql.Clone(),未处理这两个字段为 nil 的情况。

改动

为查询上下文和 SQL selector 增加 nil-safe 克隆,并添加覆盖未初始化及已初始化字段的回归测试。未发现重叠 PR。

测试

  • cd backend && go test ./ent -run TestGroupQueryClone -count=1 (passed)
  • cd backend && go vet ./ent (passed)
  • git diff --check (passed)

Fixes #5360.

@Wei-Shaw

Copy link
Copy Markdown
Owner

代码审计反馈(已在 main + ent v0.14.5 源码上核对,非猜测)。

1. backend/ent/group_query.go 是生成文件

文件首行是 // Code generated by ent, DO NOT EDIT.Makefile:10go generate ./entent/generate.go 里有对应的 //go:generate。下一次执行 make generate 会把本补丁静默还原,而同批新增的 backend/ent/group_query_test.go(手写文件,不会被覆盖)会继续断言 query.ctx == nil / query.sql == nil,届时变成 CI 红。

另外全仓 40+ 个 *_query.go 都是同一个 sql: _q.sql.Clone() 模式,只补 group_query.go 也不一致。

2. sql 那一半是 no-op

ent v0.14.5 dialect/sql/builder.go:2390

func (s *Selector) Clone() *Selector {
	if s == nil {
		return nil
	}

*sql.SelectorClone() 本身就是 nil-safe,selector 变量不改变任何行为。

3. ctx 那一半只有零值字面量能触发

QueryContext.Clone()(ent.go:550)确实在 nil receiver 上会 panic(首行取 q.Op)。但 _q.ctx 只有在手写 &GroupQuery{} 零值字面量时才为 nil —— 本 PR 的测试正是这么构造的:

query := (&GroupQuery{}).Clone()

grep -rn "GroupQuery{"backend/ent/ 之外零命中,生产代码一律经 client.Group.Query() 构造,ctx 必然非 nil。

综合下来:这个补丁修的是当前不存在的触发路径,代价是改生成代码 + 埋一个 regenerate 后的 CI 失败。如果实际遇到过 panic,能否贴一下 stack / 触发它的调用方?那样修调用方会更合适。

@wucm667

wucm667 commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

感谢审阅。核对后确认该修改落在 Ent 生成文件中,重新执行生成会覆盖补丁;sql.Selector.Clone() 已经是 nil-safe,而 QueryContext 的 nil 仅由手工零值 GroupQuery 构造触发,当前没有生产调用路径。继续维护这个补丁会留下 regenerate 后测试失败的问题,因此按建议关闭。若后续拿到真实生产 panic stack,会从调用方或生成模板层重新处理。

@wucm667 wucm667 closed this Aug 11, 2026
@wucm667
wucm667 deleted the fix/issue-5360-group-query-clone branch August 11, 2026 05:47
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.

Nil pointer dereference when cloning an uninitialized query

2 participants