From 4b5e41c7832a808c3ad52f41e958ad508add4e01 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 19 Jan 2018 11:08:34 +0100 Subject: [PATCH] fix UDP handling in Shadowsocks client --- proxy/shadowsocks/client.go | 2 +- proxy/shadowsocks/config.go | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index ff19538e6..3ce880c68 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -155,7 +155,7 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale User: user, } - if err := buf.Copy(reader, outboundRay.OutboundOutput(), buf.UpdateActivity(timer)); err != nil { + if err := buf.Copy(reader, outboundRay.OutboundOutput(), buf.UpdateActivity(timer), buf.IgnoreReaderError()); err != nil { return newError("failed to transport all UDP response").Base(err) } return nil diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 54de878f0..5105e3809 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -140,6 +140,9 @@ func (v *AesCfb) EncodePacket(key []byte, b *buf.Buffer) error { } func (v *AesCfb) DecodePacket(key []byte, b *buf.Buffer) error { + if b.Len() <= v.IVSize() { + return newError("insufficient data: ", b.Len()) + } iv := b.BytesTo(v.IVSize()) stream := crypto.NewAesDecryptionStream(key, iv) stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize())) @@ -203,6 +206,9 @@ func (c *AEADCipher) EncodePacket(key []byte, b *buf.Buffer) error { } func (c *AEADCipher) DecodePacket(key []byte, b *buf.Buffer) error { + if b.Len() <= v.IVSize() { + return newError("insufficient data: ", b.Len()) + } ivLen := c.IVSize() payloadLen := b.Len() auth := c.createAuthenticator(key, b.BytesTo(ivLen)) @@ -253,6 +259,9 @@ func (v *ChaCha20) EncodePacket(key []byte, b *buf.Buffer) error { } func (v *ChaCha20) DecodePacket(key []byte, b *buf.Buffer) error { + if b.Len() <= v.IVSize() { + return newError("insufficient data: ", b.Len()) + } iv := b.BytesTo(v.IVSize()) stream := crypto.NewChaCha20Stream(key, iv) stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize()))