Skip to content

Commit cec2de3

Browse files
committed
fix: Race when writing to a closed pipe
This is such an intermittent race it's difficult to track, but regardless this is an improvement to the code.
1 parent 9b19dc9 commit cec2de3

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

provisionersdk/serve.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser
3131
if options.Listener == nil {
3232
config := yamux.DefaultConfig()
3333
config.LogOutput = io.Discard
34-
stdio, err := yamux.Server(readWriteCloser{
35-
ReadCloser: os.Stdin,
36-
Writer: os.Stdout,
34+
stdio, err := yamux.Server(&readWriteCloser{
35+
ReadCloser: os.Stdin,
36+
WriteCloser: os.Stdout,
3737
}, config)
3838
if err != nil {
3939
return xerrors.Errorf("create yamux: %w", err)
@@ -54,6 +54,9 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser
5454
// short-lived processes that can be executed concurrently.
5555
err = srv.Serve(ctx, options.Listener)
5656
if err != nil {
57+
if errors.Is(err, io.EOF) {
58+
return nil
59+
}
5760
if errors.Is(err, context.Canceled) {
5861
return nil
5962
}

provisionersdk/transport.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ func TransportPipe() (*yamux.Session, *yamux.Session) {
2222
yamuxConfig := yamux.DefaultConfig()
2323
yamuxConfig.LogOutput = io.Discard
2424
client, err := yamux.Client(&readWriteCloser{
25-
ReadCloser: clientReader,
26-
Writer: serverWriter,
25+
ReadCloser: clientReader,
26+
WriteCloser: serverWriter,
2727
}, yamuxConfig)
2828
if err != nil {
2929
panic(err)
3030
}
3131

3232
server, err := yamux.Server(&readWriteCloser{
33-
ReadCloser: serverReader,
34-
Writer: clientWriter,
33+
ReadCloser: serverReader,
34+
WriteCloser: clientWriter,
3535
}, yamuxConfig)
3636
if err != nil {
3737
panic(err)
@@ -46,7 +46,15 @@ func Conn(session *yamux.Session) drpc.Conn {
4646

4747
type readWriteCloser struct {
4848
io.ReadCloser
49-
io.Writer
49+
io.WriteCloser
50+
}
51+
52+
func (c *readWriteCloser) Close() error {
53+
err := c.ReadCloser.Close()
54+
if err != nil {
55+
return err
56+
}
57+
return c.WriteCloser.Close()
5058
}
5159

5260
// Allows concurrent requests on a single dRPC connection.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy