Skip to content

Commit

Permalink
sumdb: handle panic from c.ReadRemote during ReadTiles
Browse files Browse the repository at this point in the history
The go command tests use a network stack that sometimes
panics during read. This code was assuming a network stack
that returns errors instead. If a tile-reading goroutine panicked,
ReadTiles considered it done with data, err = nil, nil, and then
there was a race between ReadTiles failing with an error about
a suspiciously short tile and the panicking goroutine getting
to run and bring down the entire program.

Remove the race by converting the panic into an error during
ReadTiles.

For a test in golang/go#57001.

Change-Id: I9b18a244238e67c27a15b93f8397bf3ab44b06e6
Reviewed-on: https://go-review.googlesource.com/c/mod/+/501035
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
  • Loading branch information
rsc committed Jun 6, 2023
1 parent 2a1c06a commit 62c7e57
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions sumdb/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,11 @@ func (r *tileReader) ReadTiles(tiles []tlog.Tile) ([][]byte, error) {
wg.Add(1)
go func(i int, tile tlog.Tile) {
defer wg.Done()
defer func() {
if e := recover(); e != nil {
errs[i] = fmt.Errorf("panic: %v", e)
}
}()
data[i], errs[i] = r.c.readTile(tile)
}(i, tile)
}
Expand Down

0 comments on commit 62c7e57

Please sign in to comment.