Browse Source

Fix infinite hangs

tags/0.9
9seconds 7 years ago
parent
commit
5413a5b090

+ 3
- 3
mtproto/wrappers/abridged.go View File

@@ -28,6 +28,9 @@ type AbridgedReadWriteCloserWithAddr struct {
28 28
 
29 29
 func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
30 30
 	return a.BufferedRead(p, func() error {
31
+		a.opts.QuickAck = false
32
+		a.opts.SimpleAck = false
33
+
31 34
 		buf := &bytes.Buffer{}
32 35
 		buf.Grow(3)
33 36
 
@@ -37,7 +40,6 @@ func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
37 40
 		msgLength := uint8(buf.Bytes()[0])
38 41
 		buf.Reset()
39 42
 
40
-		a.opts.QuickAck = false
41 43
 		if msgLength >= abridgedQuickAckLength {
42 44
 			a.opts.QuickAck = true
43 45
 			msgLength -= 0x80
@@ -78,13 +80,11 @@ func (a *AbridgedReadWriteCloserWithAddr) Write(p []byte) (int, error) {
78 80
 
79 81
 	case packetLength < abridgedLargePacketLength:
80 82
 		length24 := toUint24(uint32(packetLength))
81
-
82 83
 		buf := &bytes.Buffer{}
83 84
 		buf.Grow(1 + 3 + len(p))
84 85
 		buf.WriteByte(byte(abridgedSmallPacketLength))
85 86
 		buf.Write(length24[:])
86 87
 		buf.Write(p)
87
-
88 88
 		return a.conn.Write(buf.Bytes())
89 89
 
90 90
 	default:

+ 1
- 1
mtproto/wrappers/frame.go View File

@@ -66,7 +66,7 @@ func (f *FrameRWC) Read(p []byte) (int, error) {
66 66
 			if _, err := io.CopyN(writer, f.conn, 4); err != nil {
67 67
 				return errors.Annotate(err, "Cannot read frame padding")
68 68
 			}
69
-			if !bytes.Equal(buf.Bytes(), frameRWCPadding[:]) {
69
+			if !bytes.Equal(buf.Bytes(), frameRWCPadding) {
70 70
 				break
71 71
 			}
72 72
 		}

+ 3
- 0
mtproto/wrappers/intermediate.go View File

@@ -23,6 +23,9 @@ type IntermediateReadWriteCloserWithAddr struct {
23 23
 
24 24
 func (i *IntermediateReadWriteCloserWithAddr) Read(p []byte) (int, error) {
25 25
 	return i.BufferedRead(p, func() error {
26
+		i.opts.QuickAck = false
27
+		i.opts.SimpleAck = false
28
+
26 29
 		buf := &bytes.Buffer{}
27 30
 		buf.Grow(4)
28 31
 

+ 5
- 6
mtproto/wrappers/proxy_request.go View File

@@ -29,15 +29,16 @@ func (p *ProxyRequestReadWriteCloserWithAddr) Read(buf []byte) (int, error) {
29 29
 			return errors.Annotate(err, "Cannot read RPC tag")
30 30
 		}
31 31
 
32
-		if bytes.Equal(ansBuf.Bytes(), rpc.TagCloseExt) {
32
+		switch {
33
+		case bytes.Equal(ansBuf.Bytes(), rpc.TagCloseExt):
33 34
 			return p.readCloseExt()
34
-		} else if bytes.Equal(ansBuf.Bytes(), rpc.TagProxyAns) {
35
+		case bytes.Equal(ansBuf.Bytes(), rpc.TagProxyAns):
35 36
 			return p.readProxyAns(buf)
36
-		} else if bytes.Equal(ansBuf.Bytes(), rpc.TagSimpleAck) {
37
+		case bytes.Equal(ansBuf.Bytes(), rpc.TagSimpleAck):
37 38
 			return p.readSimpleAck()
38 39
 		}
39 40
 
40
-		return nil
41
+		return errors.Errorf("Unknown RPC answer %s", ansBuf.Bytes())
41 42
 	})
42 43
 }
43 44
 
@@ -80,8 +81,6 @@ func (p *ProxyRequestReadWriteCloserWithAddr) Write(raw []byte) (int, error) {
80 81
 	if _, err := p.conn.Write(p.req.Bytes(raw)); err != nil {
81 82
 		return 0, err
82 83
 	}
83
-	p.req.Options.SimpleAck = false
84
-	p.req.Options.QuickAck = false
85 84
 
86 85
 	return len(raw), nil
87 86
 }

+ 6
- 5
wrappers/blockcipherrwc.go View File

@@ -1,6 +1,7 @@
1 1
 package wrappers
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"crypto/aes"
5 6
 	"crypto/cipher"
6 7
 	"net"
@@ -18,16 +19,16 @@ type BlockCipherReadWriteCloserWithAddr struct {
18 19
 
19 20
 func (c *BlockCipherReadWriteCloserWithAddr) Read(p []byte) (int, error) {
20 21
 	return c.BufferedRead(p, func() error {
21
-		bufferLength := c.Buffer.Len()
22
-		for bufferLength%aes.BlockSize != 0 || bufferLength == 0 {
22
+		buf := &bytes.Buffer{}
23
+		for buf.Len()%aes.BlockSize != 0 || buf.Len() == 0 {
23 24
 			n, err := c.conn.Read(p)
24 25
 			if err != nil {
25 26
 				return errors.Annotate(err, "Cannot read from socket")
26 27
 			}
27
-			c.Buffer.Write(p[:n])
28
-			bufferLength = c.Buffer.Len()
28
+			buf.Write(p[:n])
29 29
 		}
30
-		c.decryptor.CryptBlocks(c.Buffer.Bytes(), c.Buffer.Bytes())
30
+		c.decryptor.CryptBlocks(buf.Bytes(), buf.Bytes())
31
+		c.Buffer.Write(buf.Bytes())
31 32
 
32 33
 		return nil
33 34
 	})

Loading…
Cancel
Save