]> Cypherpunks repositories - gostls13.git/commitdiff
sql: fix missing mutex unlock in an error case
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 12 Dec 2011 21:56:56 +0000 (13:56 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 12 Dec 2011 21:56:56 +0000 (13:56 -0800)
Fixes #2542

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5483054

src/pkg/exp/sql/sql.go
src/pkg/exp/sql/sql_test.go

index f17d12eaa13e27f69cd5eec288688617b02dd3ef..948b911f2e0a0ef554eff75a823afcc8cabececf 100644 (file)
@@ -134,6 +134,7 @@ func (db *DB) maxIdleConns() int {
 func (db *DB) conn() (driver.Conn, error) {
        db.mu.Lock()
        if db.closed {
+               db.mu.Unlock()
                return nil, errors.New("sql: database is closed")
        }
        if n := len(db.freeConn); n > 0 {
index 4f8318d26ef7972884804f2a7a6dde463e7bae0b..f8ccf764e73ada4f56fe86acab7866e693788974 100644 (file)
@@ -228,3 +228,16 @@ func TestTxStmt(t *testing.T) {
                t.Fatalf("Commit = %v", err)
        }
 }
+
+// Tests fix for issue 2542, that we release a lock when querying on
+// a closed connection.
+func TestIssue2542Deadlock(t *testing.T) {
+       db := newTestDB(t, "people")
+       closeDB(t, db)
+       for i := 0; i < 2; i++ {
+               _, err := db.Query("SELECT|people|age,name|")
+               if err == nil {
+                       t.Fatalf("expected error")
+               }
+       }
+}