|
|
@@ -201,11 +201,12 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata,
|
|
|
transferType: protocol.TransferTypePacket,
|
|
|
XUDP: x,
|
|
|
}
|
|
|
- go handle(ctx, x.Mux, w.link.Writer)
|
|
|
x.Status = Active
|
|
|
if !w.sessionManager.Add(x.Mux) {
|
|
|
x.Mux.Close(false)
|
|
|
+ return errors.New("failed to add new session")
|
|
|
}
|
|
|
+ go handle(ctx, x.Mux, w.link.Writer)
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
@@ -226,18 +227,23 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata,
|
|
|
if meta.Target.Network == net.Network_UDP {
|
|
|
s.transferType = protocol.TransferTypePacket
|
|
|
}
|
|
|
- w.sessionManager.Add(s)
|
|
|
+ if !w.sessionManager.Add(s) {
|
|
|
+ s.Close(false)
|
|
|
+ return errors.New("failed to add new session")
|
|
|
+ }
|
|
|
go handle(ctx, s, w.link.Writer)
|
|
|
if !meta.Option.Has(OptionData) {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
rr := s.NewReader(reader, &meta.Target)
|
|
|
- if err := buf.Copy(rr, s.output); err != nil {
|
|
|
- buf.Copy(rr, buf.Discard)
|
|
|
- return s.Close(false)
|
|
|
+ err = buf.Copy(rr, s.output)
|
|
|
+
|
|
|
+ if err != nil && buf.IsWriteError(err) {
|
|
|
+ s.Close(false)
|
|
|
+ return buf.Copy(rr, buf.Discard)
|
|
|
}
|
|
|
- return nil
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error {
|
|
|
@@ -304,10 +310,11 @@ func (w *ServerWorker) handleFrame(ctx context.Context, reader *buf.BufferedRead
|
|
|
}
|
|
|
|
|
|
func (w *ServerWorker) run(ctx context.Context) {
|
|
|
- input := w.link.Reader
|
|
|
- reader := &buf.BufferedReader{Reader: input}
|
|
|
+ reader := &buf.BufferedReader{Reader: w.link.Reader}
|
|
|
|
|
|
defer w.sessionManager.Close()
|
|
|
+ defer common.Close(w.link.Writer)
|
|
|
+ defer common.Interrupt(w.link.Reader)
|
|
|
|
|
|
for {
|
|
|
select {
|
|
|
@@ -318,7 +325,6 @@ func (w *ServerWorker) run(ctx context.Context) {
|
|
|
if err != nil {
|
|
|
if errors.Cause(err) != io.EOF {
|
|
|
errors.LogInfoInner(ctx, err, "unexpected EOF")
|
|
|
- common.Interrupt(input)
|
|
|
}
|
|
|
return
|
|
|
}
|