]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.23] database/sql: avoid closing Rows while scan is in progress
authorDamien Neil <dneil@google.com>
Wed, 23 Jul 2025 21:26:54 +0000 (14:26 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 6 Aug 2025 17:51:00 +0000 (10:51 -0700)
commit8a924caaf348fdc366bab906424616b2974ad4e9
treeb44e10449fe99d3febc0bf2b87cde101080fe8ad
parent8fa31a2d7d9e60c50a3a94080c097b6e65773f4b
[release-branch.go1.23] database/sql: avoid closing Rows while scan is in progress

A database/sql/driver.Rows can return database-owned data
from Rows.Next. The driver.Rows documentation doesn't explicitly
document the lifetime guarantees for this data, but a reasonable
expectation is that the caller of Next should only access it
until the next call to Rows.Close or Rows.Next.

Avoid violating that constraint when a query is cancelled while
a call to database/sql.Rows.Scan (note the difference between
the two different Rows types!) is in progress. We previously
took care to avoid closing a driver.Rows while the user has
access to driver-owned memory via a RawData, but we could still
close a driver.Rows while a Scan call was in the process of
reading previously-returned driver-owned data.

Update the fake DB used in database/sql tests to invalidate
returned data to help catch other places we might be
incorrectly retaining it.

Updates #74831
Fixes #74832

Change-Id: Ice45b5fad51b679c38e3e1d21ef39156b56d6037
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/2540
Reviewed-by: Roland Shoemaker <bracewell@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/2601
Reviewed-on: https://go-review.googlesource.com/c/go/+/693558
TryBot-Bypass: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Mark Freeman <markfreeman@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
src/database/sql/convert.go
src/database/sql/fakedb_test.go
src/database/sql/sql.go
src/database/sql/sql_test.go