From 659f19f8bbefe0f1b8ea188e05a7362fc05c9a1e Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Sun, 13 Aug 2023 16:38:23 +0200 Subject: [PATCH] enable errcheck (#2201) --- .golangci.yml | 40 ++++++++++++++++++++-- internal/conf/conf.go | 6 ++-- internal/conf/env/env.go | 3 +- internal/confwatcher/confwatcher.go | 4 +-- internal/core/api.go | 4 +-- internal/core/api_test.go | 27 ++++++++++----- internal/core/core.go | 2 +- internal/core/hls_http_server.go | 2 +- internal/core/hls_manager_test.go | 3 +- internal/core/hls_source_test.go | 8 ++--- internal/core/metrics.go | 4 +-- internal/core/rtmp_conn.go | 36 ++++++++++---------- internal/core/rtmp_listener.go | 22 +++++++------ internal/core/rtsp_source_test.go | 6 ++-- internal/core/srt_listener.go | 42 +++++++++++++----------- internal/core/srt_server_test.go | 8 +++-- internal/core/srt_source_test.go | 8 +++-- internal/core/udp_source_test.go | 8 +++-- internal/core/webrtc_http_server.go | 2 +- internal/core/webrtc_manager_test.go | 5 +-- internal/core/webrtc_outgoing_track.go | 34 ++++++++++++------- internal/externalcmd/cmd_unix.go | 2 +- internal/formatprocessor/generic_test.go | 3 +- internal/formatprocessor/h264_test.go | 22 +++++++++---- internal/formatprocessor/h265_test.go | 26 +++++++++++---- internal/httpserv/handler_logger.go | 2 +- internal/logger/destination_file.go | 2 +- internal/logger/destination_stdout.go | 2 +- internal/rtmp/bytecounter/writer_test.go | 3 +- internal/rtmp/conn_test.go | 2 +- internal/rtmp/message/readwriter.go | 5 ++- internal/rtmp/rawmessage/reader.go | 2 +- internal/webrtcpc/pc.go | 2 +- internal/websocket/serverconn.go | 12 +++---- internal/websocket/serverconn_test.go | 5 +-- internal/whip/link_header.go | 2 +- 36 files changed, 237 insertions(+), 129 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index dadbd3f6..b9fd5c65 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -15,13 +15,49 @@ linters: - unconvert - wastedassign - whitespace - disable: - - errcheck issues: exclude-use-default: false linters-settings: + errcheck: + exclude-functions: + - io.Copy + - (io.Closer).Close + - (io.Writer).Write + - (hash.Hash).Write + - (net.Conn).Close + - (net.Conn).SetReadDeadline + - (net.Conn).SetWriteDeadline + - (*net.TCPConn).SetKeepAlive + - (*net.TCPConn).SetKeepAlivePeriod + - (*net.TCPConn).SetNoDelay + - (net.Listener).Close + - (net.PacketConn).Close + - (net.PacketConn).SetReadDeadline + - (net.PacketConn).SetWriteDeadline + - (net/http.ResponseWriter).Write + - (*net/http.Server).Serve + - (*net/http.Server).ServeTLS + - (*net/http.Server).Shutdown + - os.Chdir + - os.Mkdir + - os.MkdirAll + - os.Remove + - os.RemoveAll + - os.Setenv + - os.Unsetenv + - (*os.File).WriteString + - (*os.File).Close + - (github.com/datarhei/gosrt.Conn).Close + - (github.com/datarhei/gosrt.Conn).SetReadDeadline + - (github.com/datarhei/gosrt.Conn).SetWriteDeadline + - (*github.com/bluenviron/gortsplib/v3.Client).Close + - (*github.com/bluenviron/gortsplib/v3.Server).Close + - (*github.com/bluenviron/gortsplib/v3.ServerSession).Close + - (*github.com/bluenviron/gortsplib/v3.ServerStream).Close + - (*github.com/bluenviron/gortsplib/v3.ServerConn).Close + govet: enable-all: true disable: diff --git a/internal/conf/conf.go b/internal/conf/conf.go index ea6e5ee9..b81dd307 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -45,7 +45,8 @@ func loadFromFile(fpath string, conf *Conf) (bool, error) { // other configuration files are not if fpath == "mediamtx.yml" || fpath == "rtsp-simple-server.yml" { if _, err := os.Stat(fpath); errors.Is(err, os.ErrNotExist) { - conf.UnmarshalJSON(nil) // load defaults + // load defaults + conf.UnmarshalJSON(nil) //nolint:errcheck return false, nil } } @@ -294,7 +295,8 @@ func (conf *Conf) Check() error { pconf := conf.Paths[name] if pconf == nil { pconf = &PathConf{} - pconf.UnmarshalJSON(nil) // fill defaults + // load defaults + pconf.UnmarshalJSON(nil) //nolint:errcheck conf.Paths[name] = pconf } diff --git a/internal/conf/env/env.go b/internal/conf/env/env.go index 068731ce..bd8b2a29 100644 --- a/internal/conf/env/env.go +++ b/internal/conf/env/env.go @@ -117,7 +117,8 @@ func loadEnvInternal(env map[string]string, prefix string, rv reflect.Value) err if nv == zero { nv = reflect.New(rt.Elem().Elem()) if unm, ok := nv.Interface().(json.Unmarshaler); ok { - unm.UnmarshalJSON(nil) // load defaults + // load defaults + unm.UnmarshalJSON(nil) //nolint:errcheck } rv.SetMapIndex(reflect.ValueOf(mapKeyLower), nv) } diff --git a/internal/confwatcher/confwatcher.go b/internal/confwatcher/confwatcher.go index 330dc772..f721dff8 100644 --- a/internal/confwatcher/confwatcher.go +++ b/internal/confwatcher/confwatcher.go @@ -51,7 +51,7 @@ func New(confPath string) (*ConfWatcher, error) { err = inner.Add(parentPath) if err != nil { - inner.Close() + inner.Close() //nolint:errcheck return nil, err } @@ -120,7 +120,7 @@ outer: } close(w.signal) - w.inner.Close() + w.inner.Close() //nolint:errcheck } // Watch returns a channel that is called after the configuration file has changed. diff --git a/internal/core/api.go b/internal/core/api.go index b83d9f9f..393d797a 100644 --- a/internal/core/api.go +++ b/internal/core/api.go @@ -236,7 +236,7 @@ func newAPI( } router := gin.New() - router.SetTrustedProxies(nil) + router.SetTrustedProxies(nil) //nolint:errcheck group := router.Group("/") @@ -387,7 +387,7 @@ func (a *api) onConfigPathsAdd(ctx *gin.Context) { newConfPath := &conf.PathConf{} // load default values - newConfPath.UnmarshalJSON([]byte("{}")) + newConfPath.UnmarshalJSON([]byte("{}")) //nolint:errcheck fillStruct(newConfPath, in) diff --git a/internal/core/api_test.go b/internal/core/api_test.go index d43228b6..ac967ea0 100644 --- a/internal/core/api_test.go +++ b/internal/core/api_test.go @@ -265,13 +265,14 @@ func TestAPIPathsList(t *testing.T) { require.NoError(t, err) defer source.Close() - source.WritePacketRTP(media0, &rtp.Packet{ + err = source.WritePacketRTP(media0, &rtp.Packet{ Header: rtp.Header{ Version: 2, PayloadType: 96, }, Payload: []byte{0x01, 0x02, 0x03, 0x04}, }) + require.NoError(t, err) var out pathList httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out) @@ -618,7 +619,7 @@ func TestAPIProtocolList(t *testing.T) { 0x00, 0x00, 0x03, 0x00, 0xf0, 0x3c, 0x60, 0xc9, 0x20, },*/ - source.WritePacketRTP(medi, &rtp.Packet{ + err = source.WritePacketRTP(medi, &rtp.Packet{ Header: rtp.Header{ Version: 2, Marker: true, @@ -632,6 +633,7 @@ func TestAPIProtocolList(t *testing.T) { 0x05, }, }) + require.NoError(t, err) } }() @@ -654,7 +656,7 @@ func TestAPIProtocolList(t *testing.T) { time.Sleep(500 * time.Millisecond) - source.WritePacketRTP(medi, &rtp.Packet{ + err = source.WritePacketRTP(medi, &rtp.Packet{ Header: rtp.Header{ Version: 2, Marker: true, @@ -665,6 +667,7 @@ func TestAPIProtocolList(t *testing.T) { }, Payload: []byte{0x01, 0x02, 0x03, 0x04}, }) + require.NoError(t, err) <-c.incomingTrack @@ -686,7 +689,9 @@ func TestAPIProtocolList(t *testing.T) { err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}}) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) time.Sleep(500 * time.Millisecond) } @@ -898,7 +903,7 @@ func TestAPIProtocolGet(t *testing.T) { 0x00, 0x00, 0x03, 0x00, 0xf0, 0x3c, 0x60, 0xc9, 0x20, },*/ - source.WritePacketRTP(medi, &rtp.Packet{ + err := source.WritePacketRTP(medi, &rtp.Packet{ Header: rtp.Header{ Version: 2, Marker: true, @@ -912,6 +917,7 @@ func TestAPIProtocolGet(t *testing.T) { 0x05, }, }) + require.NoError(t, err) } }() @@ -934,7 +940,7 @@ func TestAPIProtocolGet(t *testing.T) { time.Sleep(500 * time.Millisecond) - source.WritePacketRTP(medi, &rtp.Packet{ + err = source.WritePacketRTP(medi, &rtp.Packet{ Header: rtp.Header{ Version: 2, Marker: true, @@ -945,6 +951,7 @@ func TestAPIProtocolGet(t *testing.T) { }, Payload: []byte{0x01, 0x02, 0x03, 0x04}, }) + require.NoError(t, err) <-c.incomingTrack @@ -966,7 +973,9 @@ func TestAPIProtocolGet(t *testing.T) { err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}}) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) time.Sleep(500 * time.Millisecond) } @@ -1237,9 +1246,9 @@ func TestAPIProtocolKick(t *testing.T) { err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}}) require.NoError(t, err) - bw.Flush() - // time.Sleep(500 * time.Millisecond) + err = bw.Flush() + require.NoError(t, err) } var pa string diff --git a/internal/core/core.go b/internal/core/core.go index 4437923c..6128bddc 100644 --- a/internal/core/core.go +++ b/internal/core/core.go @@ -206,7 +206,7 @@ func (p *Core) createResources(initial bool) error { // on Linux, try to raise the number of file descriptors that can be opened // to allow the maximum possible number of clients // do not check for errors - rlimit.Raise() + rlimit.Raise() //nolint:errcheck gin.SetMode(gin.ReleaseMode) diff --git a/internal/core/hls_http_server.go b/internal/core/hls_http_server.go index bcf42d2e..e0175e6a 100644 --- a/internal/core/hls_http_server.go +++ b/internal/core/hls_http_server.go @@ -63,7 +63,7 @@ func newHLSHTTPServer( //nolint:dupl } router := gin.New() - router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) + router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) //nolint:errcheck router.NoRoute(s.onRequest) diff --git a/internal/core/hls_manager_test.go b/internal/core/hls_manager_test.go index e5b66295..91724a96 100644 --- a/internal/core/hls_manager_test.go +++ b/internal/core/hls_manager_test.go @@ -143,7 +143,7 @@ func TestHLSRead(t *testing.T) { time.Sleep(500 * time.Millisecond) for i := 0; i < 2; i++ { - source.WritePacketRTP(medi, &rtp.Packet{ + err = source.WritePacketRTP(medi, &rtp.Packet{ Header: rtp.Header{ Version: 2, Marker: true, @@ -156,6 +156,7 @@ func TestHLSRead(t *testing.T) { 0x05, 0x02, 0x03, 0x04, // IDR }, }) + require.NoError(t, err) } hc := &http.Client{Transport: &http.Transport{}} diff --git a/internal/core/hls_source_test.go b/internal/core/hls_source_test.go index ce8682aa..5bc3aaef 100644 --- a/internal/core/hls_source_test.go +++ b/internal/core/hls_source_test.go @@ -87,7 +87,7 @@ func (ts *testHLSManager) onSegment1(ctx *gin.Context) { w := mpegts.NewWriter(ctx.Writer, []*mpegts.Track{track1, track2}) - w.WriteMPEG4Audio(track2, 1*90000, [][]byte{{1, 2, 3, 4}}) + w.WriteMPEG4Audio(track2, 1*90000, [][]byte{{1, 2, 3, 4}}) //nolint:errcheck } func (ts *testHLSManager) onSegment2(ctx *gin.Context) { @@ -97,14 +97,14 @@ func (ts *testHLSManager) onSegment2(ctx *gin.Context) { w := mpegts.NewWriter(ctx.Writer, []*mpegts.Track{track1, track2}) - w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ + w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ //nolint:errcheck {7, 1, 2, 3}, // SPS {8}, // PPS }) - w.WriteMPEG4Audio(track2, 2*90000, [][]byte{{1, 2, 3, 4}}) + w.WriteMPEG4Audio(track2, 2*90000, [][]byte{{1, 2, 3, 4}}) //nolint:errcheck - w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ + w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ //nolint:errcheck {5}, // IDR }) } diff --git a/internal/core/metrics.go b/internal/core/metrics.go index d127fc77..84290b4b 100644 --- a/internal/core/metrics.go +++ b/internal/core/metrics.go @@ -45,7 +45,7 @@ func newMetrics( } router := gin.New() - router.SetTrustedProxies(nil) + router.SetTrustedProxies(nil) //nolint:errcheck router.GET("/metrics", m.onMetrics) @@ -215,7 +215,7 @@ func (m *metrics) onMetrics(ctx *gin.Context) { } ctx.Writer.WriteHeader(http.StatusOK) - io.WriteString(ctx.Writer, out) + io.WriteString(ctx.Writer, out) //nolint:errcheck } // pathManagerSet is called by pathManager. diff --git a/internal/core/rtmp_conn.go b/internal/core/rtmp_conn.go index 1ce95189..5bf6bb7c 100644 --- a/internal/core/rtmp_conn.go +++ b/internal/core/rtmp_conn.go @@ -164,23 +164,7 @@ func (c *rtmpConn) run() { }() } - err := func() error { - readerErr := make(chan error) - go func() { - readerErr <- c.runReader() - }() - - select { - case err := <-readerErr: - c.nconn.Close() - return err - - case <-c.ctx.Done(): - c.nconn.Close() - <-readerErr - return errors.New("terminated") - } - }() + err := c.runInner() c.ctxCancel() @@ -189,6 +173,24 @@ func (c *rtmpConn) run() { c.Log(logger.Info, "closed (%v)", err) } +func (c *rtmpConn) runInner() error { + readerErr := make(chan error) + go func() { + readerErr <- c.runReader() + }() + + select { + case err := <-readerErr: + c.nconn.Close() + return err + + case <-c.ctx.Done(): + c.nconn.Close() + <-readerErr + return errors.New("terminated") + } +} + func (c *rtmpConn) runReader() error { c.nconn.SetReadDeadline(time.Now().Add(time.Duration(c.readTimeout))) c.nconn.SetWriteDeadline(time.Now().Add(time.Duration(c.writeTimeout))) diff --git a/internal/core/rtmp_listener.go b/internal/core/rtmp_listener.go index fe270fa7..7c058a4b 100644 --- a/internal/core/rtmp_listener.go +++ b/internal/core/rtmp_listener.go @@ -31,16 +31,18 @@ func newRTMPListener( func (l *rtmpListener) run() { defer l.wg.Done() - err := func() error { - for { - conn, err := l.ln.Accept() - if err != nil { - return err - } - - l.parent.newConn(conn) - } - }() + err := l.runInner() l.parent.acceptError(err) } + +func (l *rtmpListener) runInner() error { + for { + conn, err := l.ln.Accept() + if err != nil { + return err + } + + l.parent.newConn(conn) + } +} diff --git a/internal/core/rtsp_source_test.go b/internal/core/rtsp_source_test.go index 040ca273..db0d9568 100644 --- a/internal/core/rtsp_source_test.go +++ b/internal/core/rtsp_source_test.go @@ -117,7 +117,7 @@ func TestRTSPSource(t *testing.T) { err = s.Start() require.NoError(t, err) - defer s.Wait() + defer s.Wait() //nolint:errcheck defer s.Close() if source == "udp" || source == "tcp" { @@ -212,7 +212,7 @@ func TestRTSPSourceNoPassword(t *testing.T) { } err = s.Start() require.NoError(t, err) - defer s.Wait() + defer s.Wait() //nolint:errcheck defer s.Close() p, ok := newInstance("rtmp: no\n" + @@ -268,7 +268,7 @@ func TestRTSPSourceRange(t *testing.T) { } err := s.Start() require.NoError(t, err) - defer s.Wait() + defer s.Wait() //nolint:errcheck defer s.Close() var addConf string diff --git a/internal/core/srt_listener.go b/internal/core/srt_listener.go index 3fb75fbb..d0a11821 100644 --- a/internal/core/srt_listener.go +++ b/internal/core/srt_listener.go @@ -32,29 +32,31 @@ func newSRTListener( func (l *srtListener) run() { defer l.wg.Done() - err := func() error { - for { - var sconn *srtConn - conn, _, err := l.ln.Accept(func(req srt.ConnRequest) srt.ConnType { - sconn = l.parent.newConnRequest(req) - if sconn == nil { - return srt.REJECT - } - - // currently it's the same to return SUBSCRIBE or PUBLISH - return srt.SUBSCRIBE - }) - if err != nil { - return err - } + err := l.runInner() + + l.parent.acceptError(err) +} - if conn == nil { - continue +func (l *srtListener) runInner() error { + for { + var sconn *srtConn + conn, _, err := l.ln.Accept(func(req srt.ConnRequest) srt.ConnType { + sconn = l.parent.newConnRequest(req) + if sconn == nil { + return srt.REJECT } - sconn.setConn(conn) + // currently it's the same to return SUBSCRIBE or PUBLISH + return srt.SUBSCRIBE + }) + if err != nil { + return err } - }() - l.parent.acceptError(err) + if conn == nil { + continue + } + + sconn.setConn(conn) + } } diff --git a/internal/core/srt_server_test.go b/internal/core/srt_server_test.go index 0d0a5e9d..73a83987 100644 --- a/internal/core/srt_server_test.go +++ b/internal/core/srt_server_test.go @@ -50,7 +50,9 @@ func TestSRTServer(t *testing.T) { }, }) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) time.Sleep(500 * time.Millisecond) @@ -71,7 +73,9 @@ func TestSRTServer(t *testing.T) { }, }) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) r, err := mpegts.NewReader(reader) require.NoError(t, err) diff --git a/internal/core/srt_source_test.go b/internal/core/srt_source_test.go index d912e01b..7cb02e4d 100644 --- a/internal/core/srt_source_test.go +++ b/internal/core/srt_source_test.go @@ -51,13 +51,17 @@ func TestSRTSource(t *testing.T) { }, }) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) <-connected err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}}) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) <-done }() diff --git a/internal/core/udp_source_test.go b/internal/core/udp_source_test.go index 4b3d8e2f..7ca370bd 100644 --- a/internal/core/udp_source_test.go +++ b/internal/core/udp_source_test.go @@ -55,13 +55,17 @@ func TestUDPSource(t *testing.T) { }, }) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) <-connected err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}}) require.NoError(t, err) - bw.Flush() + + err = bw.Flush() + require.NoError(t, err) }() medias, baseURL, _, err := c.Describe(u) diff --git a/internal/core/webrtc_http_server.go b/internal/core/webrtc_http_server.go index 7007ff68..b919829c 100644 --- a/internal/core/webrtc_http_server.go +++ b/internal/core/webrtc_http_server.go @@ -67,7 +67,7 @@ func newWebRTCHTTPServer( //nolint:dupl } router := gin.New() - router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) + router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) //nolint:errcheck router.NoRoute(s.onRequest) network, address := restrictNetwork("tcp", address) diff --git a/internal/core/webrtc_manager_test.go b/internal/core/webrtc_manager_test.go index d1ec4b59..c670f1b8 100644 --- a/internal/core/webrtc_manager_test.go +++ b/internal/core/webrtc_manager_test.go @@ -242,7 +242,7 @@ func TestWebRTCRead(t *testing.T) { time.Sleep(500 * time.Millisecond) - source.WritePacketRTP(medi, &rtp.Packet{ + err = source.WritePacketRTP(medi, &rtp.Packet{ Header: rtp.Header{ Version: 2, Marker: true, @@ -253,6 +253,7 @@ func TestWebRTCRead(t *testing.T) { }, Payload: []byte{3}, }) + require.NoError(t, err) trak := <-c.incomingTrack @@ -289,7 +290,7 @@ func TestWebRTCReadNotFound(t *testing.T) { ICEServers: iceServers, }) require.NoError(t, err) - defer pc.Close() + defer pc.Close() //nolint:errcheck _, err = pc.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo) require.NoError(t, err) diff --git a/internal/core/webrtc_outgoing_track.go b/internal/core/webrtc_outgoing_track.go index 6aa6246a..db177114 100644 --- a/internal/core/webrtc_outgoing_track.go +++ b/internal/core/webrtc_outgoing_track.go @@ -47,7 +47,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err PayloadType: 105, PayloadMaxSize: webrtcPayloadMaxSize, } - encoder.Init() + err = encoder.Init() + if err != nil { + return nil, err + } return &webRTCOutgoingTrack{ media: videoMedia, @@ -66,7 +69,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err } for _, pkt := range packets { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil @@ -94,7 +97,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err PayloadType: 96, PayloadMaxSize: webrtcPayloadMaxSize, } - encoder.Init() + err = encoder.Init() + if err != nil { + return nil, err + } return &webRTCOutgoingTrack{ media: videoMedia, @@ -113,7 +119,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err } for _, pkt := range packets { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil @@ -141,7 +147,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err PayloadType: 96, PayloadMaxSize: webrtcPayloadMaxSize, } - encoder.Init() + err = encoder.Init() + if err != nil { + return nil, err + } return &webRTCOutgoingTrack{ media: videoMedia, @@ -160,7 +169,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err } for _, pkt := range packets { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil @@ -188,7 +197,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err PayloadType: 96, PayloadMaxSize: webrtcPayloadMaxSize, } - encoder.Init() + err = encoder.Init() + if err != nil { + return nil, err + } var lastPTS time.Duration firstNALUReceived := false @@ -220,7 +232,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err } for _, pkt := range packets { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil @@ -255,7 +267,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err track: webRTCTrak, cb: func(unit formatprocessor.Unit) error { for _, pkt := range unit.GetRTPPackets() { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil @@ -285,7 +297,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err track: webRTCTrak, cb: func(unit formatprocessor.Unit) error { for _, pkt := range unit.GetRTPPackets() { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil @@ -322,7 +334,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err track: webRTCTrak, cb: func(unit formatprocessor.Unit) error { for _, pkt := range unit.GetRTPPackets() { - webRTCTrak.WriteRTP(pkt) + webRTCTrak.WriteRTP(pkt) //nolint:errcheck } return nil diff --git a/internal/externalcmd/cmd_unix.go b/internal/externalcmd/cmd_unix.go index fb36a59e..41aa8733 100644 --- a/internal/externalcmd/cmd_unix.go +++ b/internal/externalcmd/cmd_unix.go @@ -50,7 +50,7 @@ func (e *Cmd) runOSSpecific() error { select { case <-e.terminate: - syscall.Kill(cmd.Process.Pid, syscall.SIGINT) + syscall.Kill(cmd.Process.Pid, syscall.SIGINT) //nolint:errcheck <-cmdDone return errTerminated diff --git a/internal/formatprocessor/generic_test.go b/internal/formatprocessor/generic_test.go index b58b480a..41c3c7aa 100644 --- a/internal/formatprocessor/generic_test.go +++ b/internal/formatprocessor/generic_test.go @@ -13,7 +13,8 @@ func TestGenericRemovePadding(t *testing.T) { PayloadTyp: 96, RTPMa: "private/90000", } - forma.Init() + err := forma.Init() + require.NoError(t, err) p, err := New(1472, forma, false, nil) require.NoError(t, err) diff --git a/internal/formatprocessor/h264_test.go b/internal/formatprocessor/h264_test.go index 4c2e3e32..72e588c2 100644 --- a/internal/formatprocessor/h264_test.go +++ b/internal/formatprocessor/h264_test.go @@ -30,7 +30,8 @@ func TestH264DynamicParams(t *testing.T) { RTPPackets: []*rtp.Packet{pkts[0]}, }, } - p.Process(data, true) + err = p.Process(data, true) + require.NoError(t, err) require.Equal(t, [][]byte{ {byte(h264.NALUTypeIDR)}, @@ -38,31 +39,37 @@ func TestH264DynamicParams(t *testing.T) { pkts, err = enc.Encode([][]byte{{7, 4, 5, 6}}, 0) // SPS require.NoError(t, err) - p.Process(&UnitH264{ + + err = p.Process(&UnitH264{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, }, false) + require.NoError(t, err) pkts, err = enc.Encode([][]byte{{8, 1}}, 0) // PPS require.NoError(t, err) - p.Process(&UnitH264{ + + err = p.Process(&UnitH264{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, }, false) + require.NoError(t, err) require.Equal(t, []byte{7, 4, 5, 6}, forma.SPS) require.Equal(t, []byte{8, 1}, forma.PPS) pkts, err = enc.Encode([][]byte{{byte(h264.NALUTypeIDR)}}, 0) require.NoError(t, err) + data = &UnitH264{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, } - p.Process(data, true) + err = p.Process(data, true) + require.NoError(t, err) require.Equal(t, [][]byte{ {0x07, 4, 5, 6}, @@ -127,7 +134,9 @@ func TestH264OversizedPackets(t *testing.T) { RTPPackets: []*rtp.Packet{pkt}, }, } - p.Process(data, false) + err := p.Process(data, false) + require.NoError(t, err) + out = append(out, data.RTPPackets...) } @@ -190,7 +199,8 @@ func TestH264EmptyPacket(t *testing.T) { }, } - p.Process(unit, false) + err = p.Process(unit, false) + require.NoError(t, err) // if all NALUs have been removed, no RTP packets must be generated. require.Equal(t, []*rtp.Packet(nil), unit.RTPPackets) diff --git a/internal/formatprocessor/h265_test.go b/internal/formatprocessor/h265_test.go index 83c27dec..3fdea293 100644 --- a/internal/formatprocessor/h265_test.go +++ b/internal/formatprocessor/h265_test.go @@ -29,7 +29,8 @@ func TestH265DynamicParams(t *testing.T) { RTPPackets: []*rtp.Packet{pkts[0]}, }, } - p.Process(data, true) + err = p.Process(data, true) + require.NoError(t, err) require.Equal(t, [][]byte{ {byte(h265.NALUType_CRA_NUT) << 1, 0}, @@ -37,27 +38,33 @@ func TestH265DynamicParams(t *testing.T) { pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}}, 0) require.NoError(t, err) - p.Process(&UnitH265{ + + err = p.Process(&UnitH265{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, }, false) + require.NoError(t, err) pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}}, 0) require.NoError(t, err) - p.Process(&UnitH265{ + + err = p.Process(&UnitH265{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, }, false) + require.NoError(t, err) pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_PPS_NUT) << 1, 7, 8, 9}}, 0) require.NoError(t, err) - p.Process(&UnitH265{ + + err = p.Process(&UnitH265{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, }, false) + require.NoError(t, err) require.Equal(t, []byte{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}, forma.VPS) require.Equal(t, []byte{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}, forma.SPS) @@ -65,12 +72,14 @@ func TestH265DynamicParams(t *testing.T) { pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_CRA_NUT) << 1, 0}}, 0) require.NoError(t, err) + data = &UnitH265{ BaseUnit: BaseUnit{ RTPPackets: []*rtp.Packet{pkts[0]}, }, } - p.Process(data, true) + err = p.Process(data, true) + require.NoError(t, err) require.Equal(t, [][]byte{ {byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}, @@ -124,7 +133,9 @@ func TestH265OversizedPackets(t *testing.T) { RTPPackets: []*rtp.Packet{pkt}, }, } - p.Process(data, false) + err = p.Process(data, false) + require.NoError(t, err) + out = append(out, data.RTPPackets...) } @@ -187,7 +198,8 @@ func TestH265EmptyPacket(t *testing.T) { }, } - p.Process(unit, false) + err = p.Process(unit, false) + require.NoError(t, err) // if all NALUs have been removed, no RTP packets must be generated. require.Equal(t, []*rtp.Packet(nil), unit.RTPPackets) diff --git a/internal/httpserv/handler_logger.go b/internal/httpserv/handler_logger.go index 9e463f9f..9e3162f6 100644 --- a/internal/httpserv/handler_logger.go +++ b/internal/httpserv/handler_logger.go @@ -35,7 +35,7 @@ func (w *loggerWriter) WriteHeader(statusCode int) { func (w *loggerWriter) dump() string { var buf bytes.Buffer fmt.Fprintf(&buf, "%s %d %s\n", "HTTP/1.1", w.status, http.StatusText(w.status)) - w.w.Header().Write(&buf) + w.w.Header().Write(&buf) //nolint:errcheck buf.Write([]byte("\n")) if w.buf.Len() > 0 { fmt.Fprintf(&buf, "(body of %d bytes)", w.buf.Len()) diff --git a/internal/logger/destination_file.go b/internal/logger/destination_file.go index d40c91d8..46ba8c38 100644 --- a/internal/logger/destination_file.go +++ b/internal/logger/destination_file.go @@ -27,7 +27,7 @@ func (d *destinationFile) log(t time.Time, level Level, format string, args ...i writeTime(&d.buf, t, false) writeLevel(&d.buf, level, false) writeContent(&d.buf, format, args) - d.file.Write(d.buf.Bytes()) + d.file.Write(d.buf.Bytes()) //nolint:errcheck } func (d *destinationFile) close() { diff --git a/internal/logger/destination_stdout.go b/internal/logger/destination_stdout.go index 95f76c48..4df94c2b 100644 --- a/internal/logger/destination_stdout.go +++ b/internal/logger/destination_stdout.go @@ -25,7 +25,7 @@ func (d *destinationStdout) log(t time.Time, level Level, format string, args .. writeTime(&d.buf, t, d.useColor) writeLevel(&d.buf, level, d.useColor) writeContent(&d.buf, format, args) - os.Stdout.Write(d.buf.Bytes()) + os.Stdout.Write(d.buf.Bytes()) //nolint:errcheck } func (d *destinationStdout) close() { diff --git a/internal/rtmp/bytecounter/writer_test.go b/internal/rtmp/bytecounter/writer_test.go index f2804178..8b96a52b 100644 --- a/internal/rtmp/bytecounter/writer_test.go +++ b/internal/rtmp/bytecounter/writer_test.go @@ -13,6 +13,7 @@ func TestWriter(t *testing.T) { w := NewWriter(&buf) w.SetCount(100) - w.Write(bytes.Repeat([]byte{0x01}, 64)) + _, err := w.Write(bytes.Repeat([]byte{0x01}, 64)) + require.NoError(t, err) require.Equal(t, uint64(100+64), w.Count()) } diff --git a/internal/rtmp/conn_test.go b/internal/rtmp/conn_test.go index 3cd98fd7..d09fd405 100644 --- a/internal/rtmp/conn_test.go +++ b/internal/rtmp/conn_test.go @@ -490,6 +490,6 @@ func BenchmarkRead(b *testing.B) { conn := newNoHandshakeConn(&buf) for n := 0; n < b.N; n++ { - conn.Read() + conn.Read() //nolint:errcheck } } diff --git a/internal/rtmp/message/readwriter.go b/internal/rtmp/message/readwriter.go index cb03ec22..e0755c63 100644 --- a/internal/rtmp/message/readwriter.go +++ b/internal/rtmp/message/readwriter.go @@ -44,9 +44,12 @@ func (rw *ReadWriter) Read() (Message, error) { rw.w.SetAcknowledgeValue(tmsg.Value) case *UserControlPingRequest: - rw.w.Write(&UserControlPingResponse{ + err := rw.w.Write(&UserControlPingResponse{ ServerTime: tmsg.ServerTime, }) + if err != nil { + return nil, err + } } return msg, nil diff --git a/internal/rtmp/rawmessage/reader.go b/internal/rtmp/rawmessage/reader.go index 970f2267..7e3f76d4 100644 --- a/internal/rtmp/rawmessage/reader.go +++ b/internal/rtmp/rawmessage/reader.go @@ -266,7 +266,7 @@ func (r *Reader) Read() (*Message, error) { r.chunkStreams[chunkStreamID] = rc } - r.br.UnreadByte() + r.br.UnreadByte() //nolint:errcheck msg, err := rc.readMessage(typ) if err != nil { diff --git a/internal/webrtcpc/pc.go b/internal/webrtcpc/pc.go index b9bca32b..ac6f3569 100644 --- a/internal/webrtcpc/pc.go +++ b/internal/webrtcpc/pc.go @@ -90,7 +90,7 @@ func New( // Close closes the connection. func (co *PeerConnection) Close() { - co.PeerConnection.Close() + co.PeerConnection.Close() //nolint:errcheck <-co.closed } diff --git a/internal/websocket/serverconn.go b/internal/websocket/serverconn.go index 1edc50fe..f0e81922 100644 --- a/internal/websocket/serverconn.go +++ b/internal/websocket/serverconn.go @@ -57,7 +57,7 @@ func NewServerConn(w http.ResponseWriter, req *http.Request) (*ServerConn, error // Close closes a ServerConn. func (c *ServerConn) Close() { - c.wc.Close() + c.wc.Close() //nolint:errcheck close(c.terminate) } @@ -67,10 +67,10 @@ func (c *ServerConn) RemoteAddr() net.Addr { } func (c *ServerConn) run() { - c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) + c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) //nolint:errcheck c.wc.SetPongHandler(func(string) error { - c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) + c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) //nolint:errcheck return nil }) @@ -80,13 +80,13 @@ func (c *ServerConn) run() { for { select { case byts := <-c.write: - c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) + c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) //nolint:errcheck err := c.wc.WriteMessage(websocket.TextMessage, byts) c.writeErr <- err case <-pingTicker.C: - c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) - c.wc.WriteMessage(websocket.PingMessage, nil) + c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) //nolint:errcheck + c.wc.WriteMessage(websocket.PingMessage, nil) //nolint:errcheck case <-c.terminate: return diff --git a/internal/websocket/serverconn_test.go b/internal/websocket/serverconn_test.go index 6761986d..8b40efb7 100644 --- a/internal/websocket/serverconn_test.go +++ b/internal/websocket/serverconn_test.go @@ -37,7 +37,7 @@ func TestServerConn(t *testing.T) { c, res, err := websocket.DefaultDialer.Dial("ws://localhost:6344/", nil) require.NoError(t, err) defer res.Body.Close() - defer c.Close() + defer c.Close() //nolint:errcheck c.SetPingHandler(func(msg string) error { close(pingReceived) @@ -49,7 +49,8 @@ func TestServerConn(t *testing.T) { require.NoError(t, err) require.Equal(t, "testing", msg) - c.ReadMessage() + _, _, err = c.ReadMessage() + require.Error(t, err) <-pingReceived } diff --git a/internal/whip/link_header.go b/internal/whip/link_header.go index 8828c9af..4fb338b8 100644 --- a/internal/whip/link_header.go +++ b/internal/whip/link_header.go @@ -16,7 +16,7 @@ func quoteCredential(v string) string { func unquoteCredential(v string) string { var s string - json.Unmarshal([]byte("\""+v+"\""), &s) + json.Unmarshal([]byte("\""+v+"\""), &s) //nolint:errcheck return s }