From 49b77a87974c310b1d6a8437f3490f81811b2058 Mon Sep 17 00:00:00 2001 From: Daniel Theophanes Date: Wed, 16 Nov 2016 11:33:38 -0800 Subject: [PATCH] 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 --- src/database/sql/sql.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 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 - - 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-- -- 2.48.1