• Daniel Theophanes's avatar
    database/sql: fix race when canceling queries immediately · 2b283ced
    Daniel Theophanes authored
    Previously the following could happen, though in practice it would
    be rare.
    
    Goroutine 1:
    	(*Tx).QueryContext begins a query, passing in userContext
    
    Goroutine 2:
    	(*Tx).awaitDone starts to wait on the context derived from the passed in context
    
    Goroutine 1:
    	(*Tx).grabConn returns a valid (*driverConn)
    	The (*driverConn) passes to (*DB).queryConn
    
    Goroutine 3:
    	userContext is canceled
    
    Goroutine 2:
    	(*Tx).awaitDone unblocks and calls (*Tx).rollback
    	(*driverConn).finalClose obtains dc.Mutex
    	(*driverConn).finalClose sets dc.ci = nil
    
    Goroutine 1:
    	(*DB).queryConn obtains dc.Mutex in withLock
    	ctxDriverPrepare accepts dc.ci which is now nil
    	ctxCriverPrepare panics on the nil ci
    
    The fix for this is to guard the Tx methods with a RWLock
    holding it exclusivly when closing the Tx and holding a read lock
    when executing a query.
    
    Fixes #18719
    
    Change-Id: I37aa02c37083c9793dabd28f7f934a1c5cbc05ea
    Reviewed-on: https://go-review.googlesource.com/35550
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    2b283ced
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...