]> Cypherpunks repositories - gostls13.git/commit
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 18:36:35 +0000 (11:36 -0700)
commita3895fe9f18682d5055cb68283eba21d7255a67f
tree3f8feedc0a7e331a48441960efd2be757f2598d3
parent608e9fac9055aa188c513f4dd53f12e692bc3c0c
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.

Fixes #74831.

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-review.googlesource.com/c/go/+/693735
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Roland Shoemaker <roland@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: 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