diff options
| author | Russ Cox <rsc@golang.org> | 2015-12-18 12:16:05 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2016-01-08 15:49:12 +0000 |
| commit | 99ed71a02c07a073a82a06c8f3a975a9540e962e (patch) | |
| tree | dd332d1d47f7c3c39e24adec946163631db908b5 /src/database/sql/sql.go | |
| parent | 81adfa508a81e24b8257571dd717845647607cbd (diff) | |
| download | go-99ed71a02c07a073a82a06c8f3a975a9540e962e.tar.xz | |
database/sql: guard against panics in driver.Stmt implementation
For #13677, but there is more to do.
Change-Id: Id1af999dc972d07cdfc771e5855a1a7dca47ca96
Reviewed-on: https://go-review.googlesource.com/18046
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/database/sql/sql.go')
| -rw-r--r-- | src/database/sql/sql.go | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go index 2d1528a21f..b5a17f0fc1 100644 --- a/src/database/sql/sql.go +++ b/src/database/sql/sql.go @@ -1477,10 +1477,14 @@ func (s *Stmt) Exec(args ...interface{}) (Result, error) { return nil, driver.ErrBadConn } -func resultFromStatement(ds driverStmt, args ...interface{}) (Result, error) { +func driverNumInput(ds driverStmt) int { ds.Lock() - want := ds.si.NumInput() - ds.Unlock() + defer ds.Unlock() // in case NumInput panics + return ds.si.NumInput() +} + +func resultFromStatement(ds driverStmt, args ...interface{}) (Result, error) { + want := driverNumInput(ds) // -1 means the driver doesn't know how to count the number of // placeholders, so we won't sanity check input here and instead let the @@ -1495,8 +1499,8 @@ func resultFromStatement(ds driverStmt, args ...interface{}) (Result, error) { } ds.Lock() + defer ds.Unlock() resi, err := ds.si.Exec(dargs) - ds.Unlock() if err != nil { return nil, err } @@ -1927,6 +1931,6 @@ func stack() string { // withLock runs while holding lk. func withLock(lk sync.Locker, fn func()) { lk.Lock() + defer lk.Unlock() // in case fn panics fn() - lk.Unlock() } |
