Skip to content

Commit 09a6bab

Browse files
apoorvajagtapAlexVulaj
authored andcommitted
removing error handling while closing connections
1 parent 58af150 commit 09a6bab

7 files changed

+48
-53
lines changed

client.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h
293293
}
294294
err = c.SetDeadline(deadline)
295295
if err != nil {
296-
return nil, errors.Join(err, c.Close())
296+
c.Close() //#nosec G104 (CWE-703): Errors unhandled
297+
return nil, err
297298
}
298299
return c, nil
299300
}
@@ -332,7 +333,9 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h
332333

333334
defer func() {
334335
if netConn != nil {
335-
netConn.Close() //#nosec:G104 (CWE-703)
336+
// As mentioned in https://github.com/gorilla/websocket/pull/897#issuecomment-1947108098:
337+
// It's safe to ignore the errors for netconn.Close()
338+
netConn.Close() //#nosec G104 (CWE-703): Errors unhandled
336339
}
337340
}()
338341

@@ -423,11 +426,9 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h
423426
resp.Body = io.NopCloser(bytes.NewReader([]byte{}))
424427
conn.subprotocol = resp.Header.Get("Sec-Websocket-Protocol")
425428

426-
if err := netConn.SetDeadline(time.Time{}); err != nil {
427-
return nil, nil, err
428-
}
429-
netConn = nil // to avoid close in defer.
430-
return conn, resp, err
429+
netConn.SetDeadline(time.Time{}) //#nosec G104 (CWE-703): Errors unhandled
430+
netConn = nil // to avoid close in defer.
431+
return conn, resp, nil
431432
}
432433

433434
func cloneTLSConfig(cfg *tls.Config) *tls.Config {

client_server_test.go

+11-15
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ func (t cstHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
9292
}
9393
ws, err := cstUpgrader.Upgrade(w, r, http.Header{"Set-Cookie": {"sessionID=1234"}})
9494
if err != nil {
95+
t.Logf("Upgrade: %v", err)
9596
return
9697
}
9798
defer ws.Close()
@@ -103,16 +104,20 @@ func (t cstHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
103104
}
104105
op, rd, err := ws.NextReader()
105106
if err != nil {
107+
t.Logf("NextReader: %v", err)
106108
return
107109
}
108110
wr, err := ws.NextWriter(op)
109111
if err != nil {
112+
t.Logf("NextWriter: %v", err)
110113
return
111114
}
112115
if _, err = io.Copy(wr, rd); err != nil {
116+
t.Logf("Copy: %v", err)
113117
return
114118
}
115119
if err := wr.Close(); err != nil {
120+
t.Logf("Close: %v", err)
116121
return
117122
}
118123
}
@@ -430,7 +435,7 @@ func TestDialBadOrigin(t *testing.T) {
430435
ws.Close()
431436
t.Fatalf("Dial: nil")
432437
}
433-
if resp == nil { // nolint:staticcheck
438+
if resp == nil {
434439
t.Fatalf("resp=nil, err=%v", err)
435440
}
436441
if resp.StatusCode != http.StatusForbidden { // nolint:staticcheck
@@ -539,9 +544,7 @@ func TestRespOnBadHandshake(t *testing.T) {
539544

540545
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
541546
w.WriteHeader(expectedStatus)
542-
if _, err := io.WriteString(w, expectedBody); err != nil {
543-
t.Fatalf("WriteString: %v", err)
544-
}
547+
io.WriteString(w, expectedBody) // nolint:errcheck
545548
}))
546549
defer s.Close()
547550

@@ -574,6 +577,7 @@ type testLogWriter struct {
574577
}
575578

576579
func (w testLogWriter) Write(p []byte) (int, error) {
580+
w.t.Logf("%s", p)
577581
return len(p), nil
578582
}
579583

@@ -793,10 +797,7 @@ func TestSocksProxyDial(t *testing.T) {
793797
}
794798
defer c1.Close()
795799

796-
if err := c1.SetDeadline(time.Now().Add(30 * time.Second)); err != nil {
797-
t.Errorf("set deadline failed: %v", err)
798-
return
799-
}
800+
c1.SetDeadline(time.Now().Add(30 * time.Second)) // nolint:errcheck
800801

801802
buf := make([]byte, 32)
802803
if _, err := io.ReadFull(c1, buf[:3]); err != nil {
@@ -835,15 +836,10 @@ func TestSocksProxyDial(t *testing.T) {
835836
defer c2.Close()
836837
done := make(chan struct{})
837838
go func() {
838-
if _, err := io.Copy(c1, c2); err != nil {
839-
t.Errorf("copy failed: %v", err)
840-
}
839+
io.Copy(c1, c2) // nolint:errcheck
841840
close(done)
842841
}()
843-
if _, err := io.Copy(c2, c1); err != nil {
844-
t.Errorf("copy failed: %v", err)
845-
return
846-
}
842+
io.Copy(c2, c1) // nolint:errcheck
847843
<-done
848844
}()
849845

compression.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ func decompressNoContextTakeover(r io.Reader) io.ReadCloser {
3333
"\x01\x00\x00\xff\xff"
3434

3535
fr, _ := flateReaderPool.Get().(io.ReadCloser)
36-
if err := fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil); err != nil {
37-
panic(err)
38-
}
36+
fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil) //#nosec G104 (CWE-703): Errors unhandled
3937
return &flateReadWrapper{fr}
4038
}
4139

@@ -134,7 +132,7 @@ func (r *flateReadWrapper) Read(p []byte) (int, error) {
134132
// Preemptively place the reader back in the pool. This helps with
135133
// scenarios where the application does not call NextReader() soon after
136134
// this final read.
137-
_ = r.Close()
135+
r.Close() //#nosec G104 (CWE-703): Errors unhandled
138136
}
139137
return n, err
140138
}

compression_test.go

+3-9
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ func TestTruncWriter(t *testing.T) {
2323
if m > n {
2424
m = n
2525
}
26-
if _, err := w.Write(p[:m]); err != nil {
27-
t.Fatal(err)
28-
}
26+
w.Write(p[:m]) // nolint:errcheck
2927
p = p[m:]
3028
}
3129
if b.String() != data[:len(data)-len(w.p)] {
@@ -49,9 +47,7 @@ func BenchmarkWriteNoCompression(b *testing.B) {
4947
messages := textMessages(100)
5048
b.ResetTimer()
5149
for i := 0; i < b.N; i++ {
52-
if err := c.WriteMessage(TextMessage, messages[i%len(messages)]); err != nil {
53-
b.Fatal(err)
54-
}
50+
c.WriteMessage(TextMessage, messages[i%len(messages)]) // nolint:errcheck
5551
}
5652
b.ReportAllocs()
5753
}
@@ -64,9 +60,7 @@ func BenchmarkWriteWithCompression(b *testing.B) {
6460
c.newCompressionWriter = compressNoContextTakeover
6561
b.ResetTimer()
6662
for i := 0; i < b.N; i++ {
67-
if err := c.WriteMessage(TextMessage, messages[i%len(messages)]); err != nil {
68-
b.Fatal(err)
69-
}
63+
c.WriteMessage(TextMessage, messages[i%len(messages)]) // nolint:errcheck
7064
}
7165
b.ReportAllocs()
7266
}

conn.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -934,9 +934,7 @@ func (c *Conn) advanceFrame() (int, error) {
934934
}
935935

936936
if c.readLimit > 0 && c.readLength > c.readLimit {
937-
if err := c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)); err != nil {
938-
return noFrame, err
939-
}
937+
c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)) //#nosec G104 (CWE-703): Errors unhandled
940938
return noFrame, ErrReadLimit
941939
}
942940

@@ -997,9 +995,7 @@ func (c *Conn) handleProtocolError(message string) error {
997995
if len(data) > maxControlFramePayloadSize {
998996
data = data[:maxControlFramePayloadSize]
999997
}
1000-
if err := c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)); err != nil {
1001-
return err
1002-
}
998+
c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)) //#nosec G104 (CWE-703): Errors unhandled
1003999
return errors.New("websocket: " + message)
10041000
}
10051001

proxy.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,25 @@ func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error)
5757
}
5858

5959
if err := connectReq.Write(conn); err != nil {
60-
return nil, errors.Join(err, conn.Close())
60+
// As mentioned in https://github.com/gorilla/websocket/pull/897#issuecomment-1947108098:
61+
// It's safe to ignore the errors for conn.Close()
62+
conn.Close() //#nosec G104 (CWE-703): Errors unhandled
63+
return nil, err
6164
}
6265

6366
// Read response. It's OK to use and discard buffered reader here becaue
6467
// the remote server does not speak until spoken to.
6568
br := bufio.NewReader(conn)
6669
resp, err := http.ReadResponse(br, connectReq)
6770
if err != nil {
68-
return nil, errors.Join(err, conn.Close())
71+
conn.Close() //#nosec G104 (CWE-703): Errors unhandled
72+
return nil, err
6973
}
7074

7175
if resp.StatusCode != http.StatusOK {
76+
conn.Close() //#nosec G104 (CWE-703): Errors unhandled
7277
f := strings.SplitN(resp.Status, " ", 2)
73-
return nil, errors.Join(errors.New(f[1]), conn.Close())
78+
return nil, errors.New(f[1])
7479
}
7580
return conn, nil
7681
}

server.go

+14-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"bufio"
99
"errors"
1010
"io"
11+
"log"
1112
"net/http"
1213
"net/url"
1314
"strings"
@@ -179,10 +180,10 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade
179180
}
180181

181182
if brw.Reader.Buffered() > 0 {
182-
return nil, errors.Join(
183-
errors.New("websocket: client sent data before handshake is complete"),
184-
netConn.Close(),
185-
)
183+
// As mentioned in https://github.com/gorilla/websocket/pull/897#issuecomment-1947108098:
184+
// It's safe to ignore the errors for netconn.Close()
185+
netConn.Close() //#nosec G104 (CWE-703): Errors unhandled
186+
return nil, errors.New("websocket: client sent data before handshake is complete")
186187
}
187188

188189
var br *bufio.Reader
@@ -247,20 +248,24 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade
247248

248249
// Clear deadlines set by HTTP server.
249250
if err := netConn.SetDeadline(time.Time{}); err != nil {
250-
return nil, errors.Join(err, netConn.Close())
251+
netConn.Close() //#nosec G104 (CWE-703): Errors unhandled
252+
return nil, err
251253
}
252254

253255
if u.HandshakeTimeout > 0 {
254256
if err := netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)); err != nil {
255-
return nil, errors.Join(err, netConn.Close())
257+
netConn.Close() //#nosec G104 (CWE-703): Errors unhandled
258+
return nil, err
256259
}
257260
}
258261
if _, err = netConn.Write(p); err != nil {
259-
return nil, errors.Join(err, netConn.Close())
262+
netConn.Close() //#nosec G104 (CWE-703): Errors unhandled
263+
return nil, err
260264
}
261265
if u.HandshakeTimeout > 0 {
262266
if err := netConn.SetWriteDeadline(time.Time{}); err != nil {
263-
return nil, errors.Join(err, netConn.Close())
267+
netConn.Close() //#nosec G104 (CWE-703): Errors unhandled
268+
return nil, err
264269
}
265270
}
266271

@@ -363,7 +368,7 @@ func bufioWriterBuffer(originalWriter io.Writer, bw *bufio.Writer) []byte {
363368
panic(err)
364369
}
365370
if err := bw.Flush(); err != nil {
366-
panic(err)
371+
log.Printf("websocket: bufioWriterBuffer: Flush: %v", err)
367372
}
368373

369374
bw.Reset(originalWriter)

0 commit comments

Comments
 (0)