diff --git a/plugin/client_rpc.go b/plugin/client_rpc.go index a43107c93c..1bf1f4e435 100644 --- a/plugin/client_rpc.go +++ b/plugin/client_rpc.go @@ -395,26 +395,31 @@ func (g *hooksRPCClient) FileWillBeUploaded(c *Context, info *model.FileInfo, fi serveIOReader(file, uploadedFileConnection) }() + replacementDone := make(chan bool) replacementFileStreamId := g.muxBroker.NextId() go func() { + defer close(replacementDone) + replacementFileConnection, err := g.muxBroker.Accept(replacementFileStreamId) if err != nil { g.log.Error("Plugin failed to serve replacement file stream. MuxBroker could not Accept connection", mlog.Err(err)) return } defer replacementFileConnection.Close() - if _, err := io.Copy(output, replacementFileConnection); err != nil && err != io.EOF { + if _, err := io.Copy(output, replacementFileConnection); err != nil { g.log.Error("Error reading replacement file.", mlog.Err(err)) } }() _args := &Z_FileWillBeUploadedArgs{c, info, uploadedFileStreamId, replacementFileStreamId} _returns := &Z_FileWillBeUploadedReturns{A: _args.B} - if g.implemented[FileWillBeUploadedId] { - if err := g.client.Call("Plugin.FileWillBeUploaded", _args, _returns); err != nil { - g.log.Error("RPC call FileWillBeUploaded to plugin failed.", mlog.Err(err)) - } + if err := g.client.Call("Plugin.FileWillBeUploaded", _args, _returns); err != nil { + g.log.Error("RPC call FileWillBeUploaded to plugin failed.", mlog.Err(err)) } + + // Ensure the io.Copy from the replacementFileConnection above completes. + <-replacementDone + return _returns.A, _returns.B }