Correctly close pipe after error in tarsum verification
This addresses a subtle deadlock where an error during a copy prevented pipe closure to propagate correctly. By closing down the read end of the pipe rather than the write end, the waiting writer is properly signaled. A nice side-effect of this change is that errors encountered by io.Copy are no propagated to the verifier's Write method. A test to ensure validation errors for unsupported digest types has been added, as well. Signed-off-by: Stephen J Day <stephen.day@docker.com>
This commit is contained in:
parent
ac550484be
commit
8c254edb9a
3 changed files with 89 additions and 3 deletions
|
@ -56,8 +56,11 @@ func NewDigestVerifier(d Digest) (Verifier, error) {
|
|||
// TODO(sday): Ick! A goroutine per digest verification? We'll have to
|
||||
// get the tarsum library to export an io.Writer variant.
|
||||
go func() {
|
||||
io.Copy(ioutil.Discard, ts)
|
||||
pw.Close()
|
||||
if _, err := io.Copy(ioutil.Discard, ts); err != nil {
|
||||
pr.CloseWithError(err)
|
||||
} else {
|
||||
pr.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
return &tarsumVerifier{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue