aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql/sql.go
diff options
context:
space:
mode:
authorDaniel Theophanes <kardianos@gmail.com>2016-11-16 11:33:38 -0800
committerIan Lance Taylor <iant@golang.org>2016-11-16 22:21:02 +0000
commit49b77a87974c310b1d6a8437f3490f81811b2058 (patch)
tree856edb2aff9ff42afd392c0b4b904b6ca9c5c337 /src/database/sql/sql.go
parent81627f0e47f91a6e6e7bfd7c59b4e3ac596668ca (diff)
downloadgo-49b77a87974c310b1d6a8437f3490f81811b2058.tar.xz
database/sql: guard against driver.Stmt.Close panics
Do not retain a lock when driver.Stmt.Close panic as the rest of the sql package ensures. Updates #16019 Change-Id: Idc7ea9258ae23f491e79cce3efc365684a708428 Reviewed-on: https://go-review.googlesource.com/33328 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/database/sql/sql.go')
-rw-r--r--src/database/sql/sql.go22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go
index d3803e85c3..a549e859a4 100644
--- a/src/database/sql/sql.go
+++ b/src/database/sql/sql.go
@@ -408,17 +408,19 @@ func (dc *driverConn) Close() error {
}
func (dc *driverConn) finalClose() error {
- dc.Lock()
-
- for si := range dc.openStmt {
- si.Close()
- }
- dc.openStmt = nil
+ var err error
+ withLock(dc, func() {
+ defer func() { // In case si.Close panics.
+ dc.openStmt = nil
+ dc.finalClosed = true
+ err = dc.ci.Close()
+ dc.ci = nil
+ }()
- err := dc.ci.Close()
- dc.ci = nil
- dc.finalClosed = true
- dc.Unlock()
+ for si := range dc.openStmt {
+ si.Close()
+ }
+ })
dc.db.mu.Lock()
dc.db.numOpen--