internal/jsonrpc2_v2: fix a racy map assignment in readIncoming

If a call request comes it at the same time that a response becomes
ready for another call (either via an explicit Respond call or the
return from a Handle call), the map read and deletion for the response
could race with the map assignment for the new (incoming) call.

Change-Id: Ifd81dbc490486251e81c7eeae438806356f514af
Reviewed-on: https://go-review.googlesource.com/c/tools/+/388595
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Bryan C. Mills 2022-02-28 11:03:25 -05:00 committed by Bryan Mills
parent 625c871d3c
commit ffa170dc4a
2 changed files with 9 additions and 1 deletions

View File

@ -322,8 +322,8 @@ func (c *Connection) readIncoming(ctx context.Context, reader Reader, toQueue ch
// cancelled by id
if msg.IsCall() {
pending := <-c.incomingBox
c.incomingBox <- pending
pending[msg.ID] = entry
c.incomingBox <- pending
}
// send the message to the incoming queue
toQueue <- entry

View File

@ -60,6 +60,14 @@ var callTests = []invoker{
notify{"unblock", "a"},
collect{"a", true, false},
}},
sequence{"concurrent", []invoker{
async{"a", "fork", "a"},
notify{"unblock", "a"},
async{"b", "fork", "b"},
notify{"unblock", "b"},
collect{"a", true, false},
collect{"b", true, false},
}},
}
type binder struct {