From: Daniel Theophanes Date: Wed, 16 Nov 2016 19:33:38 +0000 (-0800) Subject: database/sql: guard against driver.Stmt.Close panics X-Git-Tag: go1.8beta1~133 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=49b77a87974c310b1d6a8437f3490f81811b2058;p=gostls13.git 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 Reviewed-by: Brad Fitzpatrick --- 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 - - 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--