]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: guard against driver.Stmt.Close panics
authorDaniel Theophanes <kardianos@gmail.com>
Wed, 16 Nov 2016 19:33:38 +0000 (11:33 -0800)
committerIan Lance Taylor <iant@golang.org>
Wed, 16 Nov 2016 22:21:02 +0000 (22:21 +0000)
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>
src/database/sql/sql.go

index d3803e85c3a9482b2fe9129b7b356094a00042fb..a549e859a4792769caed3d9cc784b0835fb463ea 100644 (file)
@@ -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
-
-       err := dc.ci.Close()
-       dc.ci = nil
-       dc.finalClosed = true
-       dc.Unlock()
+       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
+               }()
+
+               for si := range dc.openStmt {
+                       si.Close()
+               }
+       })
 
        dc.db.mu.Lock()
        dc.db.numOpen--