Skip to content

Commit c134b4a

Browse files
authored
tls.Conn use different lock for read/write
1 parent 4fa38f6 commit c134b4a

File tree

1 file changed

+10
-15
lines changed

1 file changed

+10
-15
lines changed

std/crypto/tls/conn.go

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ func (c *Conn) ServerHello() *serverHelloMsg {
247247
// A halfConn represents one direction of the record layer
248248
// connection, either sending or receiving.
249249
type halfConn struct {
250-
// sync.Mutex
250+
sync.Mutex
251251

252252
err error // first permanent error
253253
version uint16 // protocol version
@@ -1302,34 +1302,29 @@ var (
13021302
// has not yet completed. See SetDeadline, SetReadDeadline, and
13031303
// SetWriteDeadline.
13041304
func (c *Conn) Write(b []byte) (int, error) {
1305-
// defer c.allocator.Free(b)
1306-
13071305
if len(b) == 0 {
13081306
return 0, nil
13091307
}
1310-
13111308
c.closeMux.Lock()
1312-
defer c.closeMux.Unlock()
1313-
13141309
if c.closed {
1310+
c.closeMux.Unlock()
13151311
return 0, net.ErrClosed
13161312
}
1313+
c.closeMux.Unlock()
13171314

13181315
if err := c.Handshake(); err != nil {
13191316
return 0, err
13201317
}
13211318

1322-
// c.out.Lock()
1323-
// defer c.out.Unlock()
1324-
1319+
c.out.Lock()
1320+
defer c.out.Unlock()
13251321
if err := c.out.err; err != nil {
13261322
return 0, err
13271323
}
13281324

13291325
if !c.handshakeComplete() {
13301326
return 0, alertInternalError
13311327
}
1332-
13331328
if c.closeNotifySent {
13341329
return 0, errShutdown
13351330
}
@@ -1353,8 +1348,8 @@ func (c *Conn) Write(b []byte) (int, error) {
13531348
m, b = 1, b[1:]
13541349
}
13551350
}
1356-
13571351
n, err := c.writeRecordLocked(recordTypeApplicationData, b)
1352+
13581353
return n + m, c.out.setErrorLocked(err)
13591354
}
13601355

@@ -1497,10 +1492,11 @@ func (c *Conn) Append(b []byte) (int, error) {
14971492
// SetWriteDeadline.
14981493
func (c *Conn) Read(b []byte) (int, error) {
14991494
c.closeMux.Lock()
1500-
defer c.closeMux.Unlock()
15011495
if c.closed {
1496+
c.closeMux.Unlock()
15021497
return 0, net.ErrClosed
15031498
}
1499+
c.closeMux.Unlock()
15041500

15051501
if err := c.Handshake(); err != nil {
15061502
if c.isNonBlock && err == errDataNotEnough {
@@ -1514,8 +1510,8 @@ func (c *Conn) Read(b []byte) (int, error) {
15141510
return 0, nil
15151511
}
15161512

1517-
// c.in.Lock()
1518-
// defer c.in.Unlock()
1513+
c.in.Lock()
1514+
defer c.in.Unlock()
15191515

15201516
for c.input.Len() == 0 {
15211517
if err := c.readRecord(); err != nil {
@@ -1659,7 +1655,6 @@ func (c *Conn) Close() error {
16591655
}
16601656

16611657
c.release()
1662-
16631658
var alertErr error
16641659
if c.handshakeComplete() {
16651660
if err := c.closeNotify(); err != nil {

0 commit comments

Comments
 (0)