syncpipe: read from parent before reporting error
Docker-DCO-1.1-Signed-off-by: Bernerd Schaefer <bj.schaefer@gmail.com> (github: bernerdschaefer)
This commit is contained in:
parent
4080743cbc
commit
1faa2b56df
|
@ -77,6 +77,10 @@ func (s *SyncPipe) ReadFromParent(v interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SyncPipe) ReportChildError(err error) {
|
func (s *SyncPipe) ReportChildError(err error) {
|
||||||
|
// ensure that any data sent from the parent is consumed so it doesn't
|
||||||
|
// receive ECONNRESET when the child writes to the pipe.
|
||||||
|
ioutil.ReadAll(s.child)
|
||||||
|
|
||||||
s.child.Write([]byte(err.Error()))
|
s.child.Write([]byte(err.Error()))
|
||||||
s.CloseChild()
|
s.CloseChild()
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package syncpipe
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -20,9 +21,17 @@ func TestSendErrorFromChild(t *testing.T) {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
expected := "something bad happened"
|
childfd, err := syscall.Dup(int(pipe.Child().Fd()))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
childPipe, _ := NewSyncPipeFromFd(0, uintptr(childfd))
|
||||||
|
|
||||||
pipe.ReportChildError(fmt.Errorf(expected))
|
pipe.CloseChild()
|
||||||
|
pipe.SendToChild(nil)
|
||||||
|
|
||||||
|
expected := "something bad happened"
|
||||||
|
childPipe.ReportChildError(fmt.Errorf(expected))
|
||||||
|
|
||||||
childError := pipe.ReadFromChild()
|
childError := pipe.ReadFromChild()
|
||||||
if childError == nil {
|
if childError == nil {
|
||||||
|
|
Loading…
Reference in New Issue