Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit98bc44b

Browse files
committed
Fix goroutine leak from deadlock when closing
1 parent6b38ebb commit98bc44b

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

‎conn_test.go‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ func TestConn(t *testing.T) {
348348
}()
349349
defercancel()
350350

351-
c1.SetReadLimit(131072)
351+
c1.SetReadLimit(1<<30)
352352

353353
exp:=xrand.String(xrand.Int(131072))
354354

@@ -401,8 +401,6 @@ func TestConn(t *testing.T) {
401401
}()
402402
defercancel()
403403

404-
c1.SetReadLimit(131072)
405-
406404
exp:=ptypes.DurationProto(100)
407405
err=wspb.Write(ctx,c1,exp)
408406
iferr!=nil {

‎read.go‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ func (c *Conn) CloseRead(ctx context.Context) context.Context {
6969
//
7070
// When the limit is hit, the connection will be closed with StatusMessageTooBig.
7171
func (c*Conn)SetReadLimit(nint64) {
72-
c.msgReader.limitReader.limit.Store(n)
72+
// We add read one more byte than the limit in case
73+
// there is a fin frame that needs to be read.
74+
c.msgReader.limitReader.limit.Store(n+1)
7375
}
7476

7577
constdefaultReadLimit=32768
@@ -80,7 +82,7 @@ func newMsgReader(c *Conn) *msgReader {
8082
fin:true,
8183
}
8284

83-
mr.limitReader=newLimitReader(c,readerFunc(mr.read),defaultReadLimit)
85+
mr.limitReader=newLimitReader(c,readerFunc(mr.read),defaultReadLimit+1)
8486
returnmr
8587
}
8688

‎write.go‎

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ func (c *Conn) Write(ctx context.Context, typ MessageType, p []byte) error {
5050
typemsgWriterstruct {
5151
c*Conn
5252

53-
mu*mu
53+
mu*mu
54+
activeMu*mu
5455

5556
ctx context.Context
5657
opcodeopcode
@@ -63,8 +64,9 @@ type msgWriter struct {
6364

6465
funcnewMsgWriter(c*Conn)*msgWriter {
6566
mw:=&msgWriter{
66-
c:c,
67-
mu:newMu(c),
67+
c:c,
68+
mu:newMu(c),
69+
activeMu:newMu(c),
6870
}
6971
returnmw
7072
}
@@ -151,6 +153,12 @@ func (mw *msgWriter) Write(p []byte) (_ int, err error) {
151153
return0,xerrors.New("cannot use closed writer")
152154
}
153155

156+
err=mw.activeMu.Lock(mw.ctx)
157+
iferr!=nil {
158+
return0,err
159+
}
160+
defermw.activeMu.Unlock()
161+
154162
// TODO Write to buffer to detect whether to enable flate or not for this message.
155163
ifmw.c.flate() {
156164
mw.ensureFlate()
@@ -177,6 +185,12 @@ func (mw *msgWriter) Close() (err error) {
177185
returnxerrors.New("cannot use closed writer")
178186
}
179187

188+
err=mw.activeMu.Lock(mw.ctx)
189+
iferr!=nil {
190+
returnerr
191+
}
192+
defermw.activeMu.Unlock()
193+
180194
ifmw.flate {
181195
err=mw.flateWriter.Flush()
182196
iferr!=nil {
@@ -201,7 +215,7 @@ func (mw *msgWriter) Close() (err error) {
201215
}
202216

203217
func (mw*msgWriter)close() {
204-
mw.mu.Lock(context.Background())
218+
mw.activeMu.Lock(context.Background())
205219
mw.returnFlateWriter()
206220
}
207221

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp