From 8a36a7e89b5408f22b5c83cf5ec358e7affc2127 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 20 Sep 2017 10:59:19 +0100 Subject: [PATCH] Add errcheck linter (#238) * Add errcheck linter * Add config for 'fast' linters * Fix errcheck lint stuff * Fix errcheck lint --- linter-fast.json | 15 +++++++++++ linter.json | 3 ++- .../auth/storage/accounts/membership_table.go | 2 +- .../dendrite/clientapi/events/events.go | 5 +++- .../dendrite/clientapi/httputil/httputil.go | 2 +- .../clientapi/readers/account_data.go | 2 +- .../dendrite/clientapi/writers/createroom.go | 12 ++++++--- .../dendrite/clientapi/writers/joinroom.go | 27 +++++++++++++++---- .../dendrite/clientapi/writers/sendevent.go | 5 +++- .../dendrite/cmd/create-room-events/main.go | 6 ++--- .../cmd/mediaapi-integration-tests/main.go | 9 ++++--- .../cmd/roomserver-integration-tests/main.go | 10 ++++--- .../cmd/syncserver-integration-tests/main.go | 20 ++++++++++---- .../matrix-org/dendrite/common/consumers.go | 4 +-- .../matrix-org/dendrite/common/keydb/keydb.go | 5 +++- .../dendrite/common/keydb/server_key_table.go | 2 +- .../dendrite/common/partition_offset_table.go | 2 +- .../matrix-org/dendrite/common/sql.go | 4 +-- .../matrix-org/dendrite/common/test/client.go | 4 +-- .../matrix-org/dendrite/common/test/config.go | 15 +++++++---- .../dendrite/federationapi/writers/send.go | 5 +++- .../federationapi/writers/threepid.go | 5 +++- .../storage/joined_hosts_table.go | 2 +- .../dendrite/mediaapi/fileutils/fileutils.go | 21 ++++++++++----- .../mediaapi/thumbnailer/thumbnailer_nfnt.go | 6 ++--- .../dendrite/mediaapi/writers/download.go | 16 ++++++----- .../dendrite/roomserver/alias/alias.go | 5 +++- .../dendrite/roomserver/api/query.go | 4 +-- .../dendrite/roomserver/input/events.go | 5 +++- .../roomserver/storage/event_json_table.go | 2 +- .../storage/event_state_keys_table.go | 4 +-- .../roomserver/storage/event_types_table.go | 2 +- .../roomserver/storage/events_table.go | 14 +++++----- .../roomserver/storage/invite_table.go | 11 ++++---- .../roomserver/storage/state_block_table.go | 4 +-- .../storage/state_snapshot_table.go | 2 +- .../dendrite/roomserver/storage/storage.go | 8 +++--- .../syncapi/storage/account_data_table.go | 2 +- .../storage/current_room_state_table.go | 8 +++--- .../storage/output_room_events_table.go | 4 +-- 40 files changed, 186 insertions(+), 98 deletions(-) create mode 100644 linter-fast.json diff --git a/linter-fast.json b/linter-fast.json new file mode 100644 index 00000000..2abb30af --- /dev/null +++ b/linter-fast.json @@ -0,0 +1,15 @@ +{ + "Vendor": true, + "Cyclo": 12, + "Deadline": "5m", + "Enable": [ + "vetshadow", + "gotype", + "deadcode", + "gocyclo", + "ineffassign", + "gas", + "misspell", + "errcheck" + ] +} diff --git a/linter.json b/linter.json index 1c852515..649e6a0e 100644 --- a/linter.json +++ b/linter.json @@ -14,6 +14,7 @@ "ineffassign", "gas", "misspell", - "unparam" + "unparam", + "errcheck" ] } diff --git a/src/github.com/matrix-org/dendrite/clientapi/auth/storage/accounts/membership_table.go b/src/github.com/matrix-org/dendrite/clientapi/auth/storage/accounts/membership_table.go index 75b65b53..11cecb8b 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/auth/storage/accounts/membership_table.go +++ b/src/github.com/matrix-org/dendrite/clientapi/auth/storage/accounts/membership_table.go @@ -108,7 +108,7 @@ func (s *membershipStatements) selectMembershipsByLocalpart( memberships = []authtypes.Membership{} - defer rows.Close() + defer rows.Close() // nolint: errcheck for rows.Next() { var m authtypes.Membership m.Localpart = localpart diff --git a/src/github.com/matrix-org/dendrite/clientapi/events/events.go b/src/github.com/matrix-org/dendrite/clientapi/events/events.go index f61ca937..23cb5bbc 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/events/events.go +++ b/src/github.com/matrix-org/dendrite/clientapi/events/events.go @@ -69,7 +69,10 @@ func BuildEvent( authEvents := gomatrixserverlib.NewAuthEvents(nil) for i := range queryRes.StateEvents { - authEvents.AddEvent(&queryRes.StateEvents[i]) + err = authEvents.AddEvent(&queryRes.StateEvents[i]) + if err != nil { + return nil, err + } } refs, err := eventsNeeded.AuthEventReferences(&authEvents) diff --git a/src/github.com/matrix-org/dendrite/clientapi/httputil/httputil.go b/src/github.com/matrix-org/dendrite/clientapi/httputil/httputil.go index 7bc8a46d..8135b9dd 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/httputil/httputil.go +++ b/src/github.com/matrix-org/dendrite/clientapi/httputil/httputil.go @@ -25,7 +25,7 @@ import ( // UnmarshalJSONRequest into the given interface pointer. Returns an error JSON response if // there was a problem unmarshalling. Calling this function consumes the request body. func UnmarshalJSONRequest(req *http.Request, iface interface{}) *util.JSONResponse { - defer req.Body.Close() + defer req.Body.Close() // nolint: errcheck if err := json.NewDecoder(req.Body).Decode(iface); err != nil { // TODO: We may want to suppress the Error() return in production? It's useful when // debugging because an error will be produced for both invalid/malformed JSON AND diff --git a/src/github.com/matrix-org/dendrite/clientapi/readers/account_data.go b/src/github.com/matrix-org/dendrite/clientapi/readers/account_data.go index bd64e2b0..9846fd61 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/readers/account_data.go +++ b/src/github.com/matrix-org/dendrite/clientapi/readers/account_data.go @@ -52,7 +52,7 @@ func SaveAccountData( return httputil.LogThenError(req, err) } - defer req.Body.Close() + defer req.Body.Close() // nolint: errcheck body, err := ioutil.ReadAll(req.Body) if err != nil { diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/createroom.go b/src/github.com/matrix-org/dendrite/clientapi/writers/createroom.go index d948c919..7d5d318d 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/createroom.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/createroom.go @@ -185,7 +185,10 @@ func createRoom(req *http.Request, device *authtypes.Device, StateKey: &e.StateKey, Depth: int64(depth), } - builder.SetContent(e.Content) + err = builder.SetContent(e.Content) + if err != nil { + return httputil.LogThenError(req, err) + } if i > 0 { builder.PrevEvents = []gomatrixserverlib.EventReference{builtEvents[i-1].EventReference()} } @@ -194,13 +197,16 @@ func createRoom(req *http.Request, device *authtypes.Device, return httputil.LogThenError(req, err) } - if err := gomatrixserverlib.Allowed(*ev, &authEvents); err != nil { + if err = gomatrixserverlib.Allowed(*ev, &authEvents); err != nil { return httputil.LogThenError(req, err) } // Add the event to the list of auth events builtEvents = append(builtEvents, *ev) - authEvents.AddEvent(ev) + err = authEvents.AddEvent(ev) + if err != nil { + return httputil.LogThenError(req, err) + } } // send events to the room server diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/joinroom.go b/src/github.com/matrix-org/dendrite/clientapi/writers/joinroom.go index b6520d83..fde934ac 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/joinroom.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/joinroom.go @@ -153,21 +153,35 @@ func (r joinRoomReq) joinRoomByRemoteAlias( return r.joinRoomUsingServers(resp.RoomID, resp.Servers) } -func (r joinRoomReq) writeToBuilder(eb *gomatrixserverlib.EventBuilder, roomID string) { +func (r joinRoomReq) writeToBuilder(eb *gomatrixserverlib.EventBuilder, roomID string) error { eb.Type = "m.room.member" - eb.SetContent(r.content) - eb.SetUnsigned(struct{}{}) + + err := eb.SetContent(r.content) + if err != nil { + return err + } + + err = eb.SetUnsigned(struct{}{}) + if err != nil { + return err + } + eb.Sender = r.userID eb.StateKey = &r.userID eb.RoomID = roomID eb.Redacts = "" + + return nil } func (r joinRoomReq) joinRoomUsingServers( roomID string, servers []gomatrixserverlib.ServerName, ) util.JSONResponse { var eb gomatrixserverlib.EventBuilder - r.writeToBuilder(&eb, roomID) + err := r.writeToBuilder(&eb, roomID) + if err != nil { + return httputil.LogThenError(r.req, err) + } var queryRes api.QueryLatestEventsAndStateResponse event, err := events.BuildEvent(r.req.Context(), &eb, r.cfg, r.queryAPI, &queryRes) @@ -235,7 +249,10 @@ func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib // Set all the fields to be what they should be, this should be a no-op // but it's possible that the remote server returned us something "odd" - r.writeToBuilder(&respMakeJoin.JoinEvent, roomID) + err = r.writeToBuilder(&respMakeJoin.JoinEvent, roomID) + if err != nil { + return nil, err + } now := time.Now() eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.cfg.Matrix.ServerName) diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go b/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go index 904e7eab..f11d0421 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go @@ -60,7 +60,10 @@ func SendEvent( Type: eventType, StateKey: stateKey, } - builder.SetContent(r) + err := builder.SetContent(r) + if err != nil { + return httputil.LogThenError(req, err) + } var queryRes api.QueryLatestEventsAndStateResponse e, err := events.BuildEvent(req.Context(), &builder, cfg, queryAPI, &queryRes) diff --git a/src/github.com/matrix-org/dendrite/cmd/create-room-events/main.go b/src/github.com/matrix-org/dendrite/cmd/create-room-events/main.go index c7b9d953..2992cba9 100644 --- a/src/github.com/matrix-org/dendrite/cmd/create-room-events/main.go +++ b/src/github.com/matrix-org/dendrite/cmd/create-room-events/main.go @@ -80,20 +80,20 @@ func main() { b.RoomID = *roomID b.Type = "m.room.create" b.StateKey = &emptyString - b.SetContent(map[string]string{"creator": *userID}) + b.SetContent(map[string]string{"creator": *userID}) // nolint: errcheck create := buildAndOutput() // Build a m.room.member event. b.Type = "m.room.member" b.StateKey = userID - b.SetContent(map[string]string{"membership": "join"}) + b.SetContent(map[string]string{"membership": "join"}) // nolint: errcheck b.AuthEvents = []gomatrixserverlib.EventReference{create} member := buildAndOutput() // Build a number of m.room.message events. b.Type = "m.room.message" b.StateKey = nil - b.SetContent(map[string]string{"body": "Test Message"}) + b.SetContent(map[string]string{"body": "Test Message"}) // nolint: errcheck b.AuthEvents = []gomatrixserverlib.EventReference{create, member} for i := 0; i < *messageCount; i++ { buildAndOutput() diff --git a/src/github.com/matrix-org/dendrite/cmd/mediaapi-integration-tests/main.go b/src/github.com/matrix-org/dendrite/cmd/mediaapi-integration-tests/main.go index 6eaa9ea3..c190c10b 100644 --- a/src/github.com/matrix-org/dendrite/cmd/mediaapi-integration-tests/main.go +++ b/src/github.com/matrix-org/dendrite/cmd/mediaapi-integration-tests/main.go @@ -125,7 +125,8 @@ func startMediaAPI(suffix string, dynamicThumbnails bool) (*exec.Cmd, chan error } func cleanUpServer(cmd *exec.Cmd, dir string) { - cmd.Process.Kill() // ensure server is dead, only cleaning up so don't care about errors this returns. + // ensure server is dead, only cleaning up so don't care about errors this returns + cmd.Process.Kill() // nolint: errcheck if err := os.RemoveAll(dir); err != nil { fmt.Printf("WARNING: Failed to remove temporary directory %v: %q\n", dir, err) } @@ -146,7 +147,7 @@ func main() { // create server1 with only pre-generated thumbnails allowed server1Cmd, server1CmdChan, _, server1ProxyCmd, _, server1ProxyAddr, server1Dir := startMediaAPI("1", false) defer cleanUpServer(server1Cmd, server1Dir) - defer server1ProxyCmd.Process.Kill() + defer server1ProxyCmd.Process.Kill() // nolint: errcheck testDownload(server1ProxyAddr, server1ProxyAddr, "doesnotexist", 404, server1CmdChan) // upload a JPEG file @@ -163,7 +164,7 @@ func main() { // create server2 with dynamic thumbnail generation server2Cmd, server2CmdChan, _, server2ProxyCmd, _, server2ProxyAddr, server2Dir := startMediaAPI("2", true) defer cleanUpServer(server2Cmd, server2Dir) - defer server2ProxyCmd.Process.Kill() + defer server2ProxyCmd.Process.Kill() // nolint: errcheck testDownload(server2ProxyAddr, server2ProxyAddr, "doesnotexist", 404, server2CmdChan) // pre-generated thumbnail that JPEG file via server2 @@ -189,7 +190,7 @@ func getMediaURI(host, endpoint, query string, components []string) string { func testUpload(host, filePath string) { fmt.Printf("==TESTING== upload %v to %v\n", filePath, host) file, err := os.Open(filePath) - defer file.Close() + defer file.Close() // nolint: errcheck if err != nil { panic(err) } diff --git a/src/github.com/matrix-org/dendrite/cmd/roomserver-integration-tests/main.go b/src/github.com/matrix-org/dendrite/cmd/roomserver-integration-tests/main.go index 06f9af13..126a9143 100644 --- a/src/github.com/matrix-org/dendrite/cmd/roomserver-integration-tests/main.go +++ b/src/github.com/matrix-org/dendrite/cmd/roomserver-integration-tests/main.go @@ -114,8 +114,8 @@ func runAndReadFromTopic(runCmd *exec.Cmd, readyURL string, doInput func(), topi readCmd.Stderr = os.Stderr // Kill both processes before we exit. - defer func() { runCmd.Process.Kill() }() - defer func() { readCmd.Process.Kill() }() + defer func() { runCmd.Process.Kill() }() // nolint: errcheck + defer func() { readCmd.Process.Kill() }() // nolint: errcheck // Run the command, read the messages and wait for a timeout in parallel. go func() { @@ -228,7 +228,11 @@ func testRoomserver(input []string, wantOutput []string, checkQueries func(api.R outputTopic := string(cfg.Kafka.Topics.OutputRoomEvent) - exe.DeleteTopic(outputTopic) + err = exe.DeleteTopic(outputTopic) + if err != nil { + panic(err) + } + if err = exe.CreateTopic(outputTopic); err != nil { panic(err) } diff --git a/src/github.com/matrix-org/dendrite/cmd/syncserver-integration-tests/main.go b/src/github.com/matrix-org/dendrite/cmd/syncserver-integration-tests/main.go index e39a8980..7f315cd3 100644 --- a/src/github.com/matrix-org/dendrite/cmd/syncserver-integration-tests/main.go +++ b/src/github.com/matrix-org/dendrite/cmd/syncserver-integration-tests/main.go @@ -175,12 +175,21 @@ func startSyncServer() (*exec.Cmd, chan error) { // prepareKafka creates the topics which will be written to by the tests. func prepareKafka() { - exe.DeleteTopic(inputTopic) - if err := exe.CreateTopic(inputTopic); err != nil { + err := exe.DeleteTopic(inputTopic) + if err != nil { panic(err) } - exe.DeleteTopic(clientTopic) - if err := exe.CreateTopic(clientTopic); err != nil { + + if err = exe.CreateTopic(inputTopic); err != nil { + panic(err) + } + + err = exe.DeleteTopic(clientTopic) + if err != nil { + panic(err) + } + + if err = exe.CreateTopic(clientTopic); err != nil { panic(err) } } @@ -225,7 +234,8 @@ func main() { fmt.Println("==TESTING==", os.Args[0]) prepareKafka() cmd, syncServerCmdChan := startSyncServer() - defer cmd.Process.Kill() // ensure server is dead, only cleaning up so don't care about errors this returns. + // ensure server is dead, only cleaning up so don't care about errors this returns. + defer cmd.Process.Kill() // nolint: errcheck // $ curl -XPOST -d '{}' "http://localhost:8009/_matrix/client/r0/createRoom?access_token=@alice:localhost" // $ curl -XPUT -d '{"msgtype":"m.text","body":"hello world"}' "http://localhost:8009/_matrix/client/r0/rooms/%21PjrbIMW2cIiaYF4t:localhost/send/m.room.message/1?access_token=@alice:localhost" diff --git a/src/github.com/matrix-org/dendrite/common/consumers.go b/src/github.com/matrix-org/dendrite/common/consumers.go index 8f900ab6..e3f99911 100644 --- a/src/github.com/matrix-org/dendrite/common/consumers.go +++ b/src/github.com/matrix-org/dendrite/common/consumers.go @@ -91,7 +91,7 @@ func (c *ContinualConsumer) Start() error { pc, err := c.Consumer.ConsumePartition(c.Topic, partition, offset) if err != nil { for _, p := range partitionConsumers { - p.Close() + p.Close() // nolint: errcheck } return err } @@ -106,7 +106,7 @@ func (c *ContinualConsumer) Start() error { // consumePartition consumes the room events for a single partition of the kafkaesque stream. func (c *ContinualConsumer) consumePartition(pc sarama.PartitionConsumer) { - defer pc.Close() + defer pc.Close() // nolint: errcheck for message := range pc.Messages() { msgErr := c.ProcessMessage(message) // Advance our position in the stream so that we will start at the right position after a restart. diff --git a/src/github.com/matrix-org/dendrite/common/keydb/keydb.go b/src/github.com/matrix-org/dendrite/common/keydb/keydb.go index cfb1d34e..8d5a6dde 100644 --- a/src/github.com/matrix-org/dendrite/common/keydb/keydb.go +++ b/src/github.com/matrix-org/dendrite/common/keydb/keydb.go @@ -37,7 +37,10 @@ func NewDatabase(dataSourceName string) (*Database, error) { return nil, err } d := &Database{} - d.statements.prepare(db) + err = d.statements.prepare(db) + if err != nil { + return nil, err + } return d, nil } diff --git a/src/github.com/matrix-org/dendrite/common/keydb/server_key_table.go b/src/github.com/matrix-org/dendrite/common/keydb/server_key_table.go index 936470d7..a459bd8c 100644 --- a/src/github.com/matrix-org/dendrite/common/keydb/server_key_table.go +++ b/src/github.com/matrix-org/dendrite/common/keydb/server_key_table.go @@ -83,7 +83,7 @@ func (s *serverKeyStatements) bulkSelectServerKeys( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := map[gomatrixserverlib.PublicKeyRequest]gomatrixserverlib.ServerKeys{} for rows.Next() { var serverName string diff --git a/src/github.com/matrix-org/dendrite/common/partition_offset_table.go b/src/github.com/matrix-org/dendrite/common/partition_offset_table.go index 3898cc1f..63aa61a5 100644 --- a/src/github.com/matrix-org/dendrite/common/partition_offset_table.go +++ b/src/github.com/matrix-org/dendrite/common/partition_offset_table.go @@ -71,7 +71,7 @@ func (s *PartitionOffsetStatements) SelectPartitionOffsets(topic string) ([]Part if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck var results []PartitionOffset for rows.Next() { var offset PartitionOffset diff --git a/src/github.com/matrix-org/dendrite/common/sql.go b/src/github.com/matrix-org/dendrite/common/sql.go index c2fb753f..f3de66f1 100644 --- a/src/github.com/matrix-org/dendrite/common/sql.go +++ b/src/github.com/matrix-org/dendrite/common/sql.go @@ -30,9 +30,9 @@ type Transaction interface { // If the transaction succeeded then it is committed, otherwise it is rolledback. func EndTransaction(txn Transaction, succeeded *bool) { if *succeeded { - txn.Commit() + txn.Commit() // nolint: errcheck } else { - txn.Rollback() + txn.Rollback() // nolint: errcheck } } diff --git a/src/github.com/matrix-org/dendrite/common/test/client.go b/src/github.com/matrix-org/dendrite/common/test/client.go index 7d7b0589..d1c40e53 100644 --- a/src/github.com/matrix-org/dendrite/common/test/client.go +++ b/src/github.com/matrix-org/dendrite/common/test/client.go @@ -69,7 +69,7 @@ func CanonicalJSONInput(jsonData []string) []string { } // Do issues a request and checks the status code and body of the response -func (r *Request) Do() error { +func (r *Request) Do() (err error) { client := &http.Client{ Timeout: 5 * time.Second, Transport: &http.Transport{ @@ -82,7 +82,7 @@ func (r *Request) Do() error { if err != nil { return err } - defer res.Body.Close() + defer (func() { err = res.Body.Close() })() if res.StatusCode != r.WantedStatusCode { return fmt.Errorf("incorrect status code. Expected: %d Got: %d", r.WantedStatusCode, res.StatusCode) diff --git a/src/github.com/matrix-org/dendrite/common/test/config.go b/src/github.com/matrix-org/dendrite/common/test/config.go index 1e5d0821..d29b754e 100644 --- a/src/github.com/matrix-org/dendrite/common/test/config.go +++ b/src/github.com/matrix-org/dendrite/common/test/config.go @@ -120,16 +120,21 @@ func WriteConfig(cfg *config.Dendrite, configDir string) error { } // NewMatrixKey generates a new ed25519 matrix server key and writes it to a file. -func NewMatrixKey(matrixKeyPath string) error { +func NewMatrixKey(matrixKeyPath string) (err error) { var data [35]byte - if _, err := rand.Read(data[:]); err != nil { + _, err = rand.Read(data[:]) + if err != nil { return err } keyOut, err := os.OpenFile(matrixKeyPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return err } - defer keyOut.Close() + + defer (func() { + err = keyOut.Close() + })() + if err = pem.Encode(keyOut, &pem.Block{ Type: "MATRIX PRIVATE KEY", Headers: map[string]string{ @@ -176,7 +181,7 @@ func NewTLSKey(tlsKeyPath, tlsCertPath string) error { if err != nil { return err } - defer certOut.Close() + defer certOut.Close() // nolint: errcheck if err = pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}); err != nil { return err } @@ -185,7 +190,7 @@ func NewTLSKey(tlsKeyPath, tlsCertPath string) error { if err != nil { return err } - defer keyOut.Close() + defer keyOut.Close() // nolint: errcheck if err = pem.Encode(keyOut, &pem.Block{ Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv), diff --git a/src/github.com/matrix-org/dendrite/federationapi/writers/send.go b/src/github.com/matrix-org/dendrite/federationapi/writers/send.go index 3b66ca43..00e1d8d5 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/writers/send.go +++ b/src/github.com/matrix-org/dendrite/federationapi/writers/send.go @@ -180,7 +180,10 @@ func (t *txnReq) processEvent(e gomatrixserverlib.Event) error { func checkAllowedByState(e gomatrixserverlib.Event, stateEvents []gomatrixserverlib.Event) error { authUsingState := gomatrixserverlib.NewAuthEvents(nil) for i := range stateEvents { - authUsingState.AddEvent(&stateEvents[i]) + err := authUsingState.AddEvent(&stateEvents[i]) + if err != nil { + return err + } } return gomatrixserverlib.Allowed(e, &authUsingState) } diff --git a/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go b/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go index 2d7bac3d..1ab03a34 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go +++ b/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go @@ -257,7 +257,10 @@ func buildMembershipEvent( authEvents := gomatrixserverlib.NewAuthEvents(nil) for i := range queryRes.StateEvents { - authEvents.AddEvent(&queryRes.StateEvents[i]) + err = authEvents.AddEvent(&queryRes.StateEvents[i]) + if err != nil { + return nil, err + } } if err = fillDisplayName(builder, authEvents); err != nil { diff --git a/src/github.com/matrix-org/dendrite/federationsender/storage/joined_hosts_table.go b/src/github.com/matrix-org/dendrite/federationsender/storage/joined_hosts_table.go index 3b9510d7..487de9e6 100644 --- a/src/github.com/matrix-org/dendrite/federationsender/storage/joined_hosts_table.go +++ b/src/github.com/matrix-org/dendrite/federationsender/storage/joined_hosts_table.go @@ -105,7 +105,7 @@ func (s *joinedHostsStatements) selectJoinedHosts( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck var result []types.JoinedHost for rows.Next() { diff --git a/src/github.com/matrix-org/dendrite/mediaapi/fileutils/fileutils.go b/src/github.com/matrix-org/dendrite/mediaapi/fileutils/fileutils.go index 0c2ba876..e9a1a519 100644 --- a/src/github.com/matrix-org/dendrite/mediaapi/fileutils/fileutils.go +++ b/src/github.com/matrix-org/dendrite/mediaapi/fileutils/fileutils.go @@ -105,12 +105,14 @@ func RemoveDir(dir types.Path, logger *log.Entry) { } // WriteTempFile writes to a new temporary file -func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, absBasePath config.Path) (types.Base64Hash, types.FileSizeBytes, types.Path, error) { +func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, absBasePath config.Path) (hash types.Base64Hash, size types.FileSizeBytes, path types.Path, err error) { + size = -1 + tmpFileWriter, tmpFile, tmpDir, err := createTempFileWriter(absBasePath) if err != nil { - return "", -1, "", err + return } - defer tmpFile.Close() + defer (func() { err = tmpFile.Close() })() // The amount of data read is limited to maxFileSizeBytes. At this point, if there is more data it will be truncated. limitedReader := io.LimitReader(reqReader, int64(maxFileSizeBytes)) @@ -121,13 +123,18 @@ func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, a teeReader := io.TeeReader(limitedReader, hasher) bytesWritten, err := io.Copy(tmpFileWriter, teeReader) if err != nil && err != io.EOF { - return "", -1, "", err + return } - tmpFileWriter.Flush() + err = tmpFileWriter.Flush() + if err != nil { + return + } - hash := hasher.Sum(nil) - return types.Base64Hash(base64.RawURLEncoding.EncodeToString(hash[:])), types.FileSizeBytes(bytesWritten), tmpDir, nil + hash = types.Base64Hash(base64.RawURLEncoding.EncodeToString(hasher.Sum(nil)[:])) + size = types.FileSizeBytes(bytesWritten) + path = tmpDir + return } // moveFile attempts to move the file src to dst diff --git a/src/github.com/matrix-org/dendrite/mediaapi/thumbnailer/thumbnailer_nfnt.go b/src/github.com/matrix-org/dendrite/mediaapi/thumbnailer/thumbnailer_nfnt.go index 3e822dd0..06607f71 100644 --- a/src/github.com/matrix-org/dendrite/mediaapi/thumbnailer/thumbnailer_nfnt.go +++ b/src/github.com/matrix-org/dendrite/mediaapi/thumbnailer/thumbnailer_nfnt.go @@ -83,7 +83,7 @@ func readFile(src string) (image.Image, error) { if err != nil { return nil, err } - defer file.Close() + defer file.Close() // nolint: errcheck img, _, err := image.Decode(file) if err != nil { @@ -93,12 +93,12 @@ func readFile(src string) (image.Image, error) { return img, nil } -func writeFile(img image.Image, dst string) error { +func writeFile(img image.Image, dst string) (err error) { out, err := os.Create(dst) if err != nil { return err } - defer out.Close() + defer (func() { err = out.Close() })() return jpeg.Encode(out, img, &jpeg.Options{ Quality: 85, diff --git a/src/github.com/matrix-org/dendrite/mediaapi/writers/download.go b/src/github.com/matrix-org/dendrite/mediaapi/writers/download.go index 926d2fbe..49068580 100644 --- a/src/github.com/matrix-org/dendrite/mediaapi/writers/download.go +++ b/src/github.com/matrix-org/dendrite/mediaapi/writers/download.go @@ -148,7 +148,9 @@ func (r *downloadRequest) jsonErrorResponse(w http.ResponseWriter, res util.JSON // Set status code and write the body w.WriteHeader(res.Code) r.Logger.WithField("code", res.Code).Infof("Responding (%d bytes)", len(resBytes)) - w.Write(resBytes) + + // we don't really care that much if we fail to write the error response + w.Write(resBytes) // nolint: errcheck } // Validate validates the downloadRequest fields @@ -234,7 +236,7 @@ func (r *downloadRequest) respondFromLocalFile( return nil, errors.Wrap(err, "failed to get file path from metadata") } file, err := os.Open(filePath) - defer file.Close() + defer file.Close() // nolint: errcheck if err != nil { return nil, errors.Wrap(err, "failed to open file") } @@ -256,7 +258,7 @@ func (r *downloadRequest) respondFromLocalFile( if r.IsThumbnailRequest { thumbFile, thumbMetadata, resErr := r.getThumbnailFile(types.Path(filePath), activeThumbnailGeneration, maxThumbnailGenerators, db, dynamicThumbnails, thumbnailSizes) if thumbFile != nil { - defer thumbFile.Close() + defer thumbFile.Close() // nolint: errcheck } if resErr != nil { return nil, resErr @@ -360,16 +362,16 @@ func (r *downloadRequest) getThumbnailFile( thumbPath := string(thumbnailer.GetThumbnailPath(types.Path(filePath), thumbnail.ThumbnailSize)) thumbFile, err := os.Open(string(thumbPath)) if err != nil { - thumbFile.Close() + thumbFile.Close() // nolint: errcheck return nil, nil, errors.Wrap(err, "failed to open file") } thumbStat, err := thumbFile.Stat() if err != nil { - thumbFile.Close() + thumbFile.Close() // nolint: errcheck return nil, nil, errors.Wrap(err, "failed to stat file") } if types.FileSizeBytes(thumbStat.Size()) != thumbnail.MediaMetadata.FileSizeBytes { - thumbFile.Close() + thumbFile.Close() // nolint: errcheck return nil, nil, errors.New("thumbnail file sizes on disk and in database differ") } return thumbFile, thumbnail, nil @@ -564,7 +566,7 @@ func (r *downloadRequest) fetchRemoteFile(absBasePath config.Path, maxFileSizeBy // Remote file not found return "", false, nil } - defer resp.Body.Close() + defer resp.Body.Close() // nolint: errcheck // get metadata from request and set metadata on response contentLength, err := strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 64) diff --git a/src/github.com/matrix-org/dendrite/roomserver/alias/alias.go b/src/github.com/matrix-org/dendrite/roomserver/alias/alias.go index 0ea3f238..91aa3a26 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/alias/alias.go +++ b/src/github.com/matrix-org/dendrite/roomserver/alias/alias.go @@ -183,7 +183,10 @@ func (r *RoomserverAliasAPI) sendUpdatedAliasesEvent( // Add auth events authEvents := gomatrixserverlib.NewAuthEvents(nil) for i := range res.StateEvents { - authEvents.AddEvent(&res.StateEvents[i]) + err = authEvents.AddEvent(&res.StateEvents[i]) + if err != nil { + return err + } } refs, err := eventsNeeded.AuthEventReferences(&authEvents) if err != nil { diff --git a/src/github.com/matrix-org/dendrite/roomserver/api/query.go b/src/github.com/matrix-org/dendrite/roomserver/api/query.go index c42c6821..9222b168 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/api/query.go +++ b/src/github.com/matrix-org/dendrite/roomserver/api/query.go @@ -283,7 +283,7 @@ func (h *httpRoomserverQueryAPI) QueryServerAllowedToSeeEvent( ctx context.Context, request *QueryServerAllowedToSeeEventRequest, response *QueryServerAllowedToSeeEventResponse, -) error { +) (err error) { apiURL := h.roomserverURL + RoomserverQueryServerAllowedToSeeEventPath return postJSON(ctx, h.httpClient, apiURL, request, response) } @@ -306,7 +306,7 @@ func postJSON( res, err := httpClient.Do(req.WithContext(ctx)) if res != nil { - defer res.Body.Close() + defer (func() { err = res.Body.Close() })() } if err != nil { return err diff --git a/src/github.com/matrix-org/dendrite/roomserver/input/events.go b/src/github.com/matrix-org/dendrite/roomserver/input/events.go index c7a33f52..57b20961 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/input/events.go +++ b/src/github.com/matrix-org/dendrite/roomserver/input/events.go @@ -117,7 +117,10 @@ func processRoomEvent( return err } } - db.SetState(ctx, stateAtEvent.EventNID, stateAtEvent.BeforeStateSnapshotNID) + err = db.SetState(ctx, stateAtEvent.EventNID, stateAtEvent.BeforeStateSnapshotNID) + if err != nil { + return err + } } if input.Kind == api.KindBackfill { diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/event_json_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/event_json_table.go index 63792d15..b81667d9 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/event_json_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/event_json_table.go @@ -85,7 +85,7 @@ func (s *eventJSONStatements) bulkSelectEventJSON( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck // We know that we will only get as many results as event NIDs // because of the unique constraint on event NIDs. diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/event_state_keys_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/event_state_keys_table.go index 46f2434a..0bf71132 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/event_state_keys_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/event_state_keys_table.go @@ -119,7 +119,7 @@ func (s *eventStateKeyStatements) bulkSelectEventStateKeyNID( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck result := make(map[string]types.EventStateKeyNID, len(eventStateKeys)) for rows.Next() { @@ -153,7 +153,7 @@ func (s *eventStateKeyStatements) bulkSelectEventStateKey( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck result := make(map[types.EventStateKeyNID]string, len(eventStateKeyNIDs)) for rows.Next() { diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/event_types_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/event_types_table.go index 2d9f290e..7b8d53a5 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/event_types_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/event_types_table.go @@ -131,7 +131,7 @@ func (s *eventTypeStatements) bulkSelectEventTypeNID( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck result := make(map[string]types.EventTypeNID, len(eventTypes)) for rows.Next() { diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/events_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/events_table.go index bcf17c26..5bad939f 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/events_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/events_table.go @@ -191,7 +191,7 @@ func (s *eventStatements) bulkSelectStateEventByID( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck // We know that we will only get as many results as event IDs // because of the unique constraint on event IDs. // So we can allocate an array of the correct size now. @@ -231,7 +231,7 @@ func (s *eventStatements) bulkSelectStateAtEventByID( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make([]types.StateAtEvent, len(eventIDs)) i := 0 for ; rows.Next(); i++ { @@ -269,7 +269,7 @@ func (s *eventStatements) selectEventSentToOutput( ctx context.Context, txn *sql.Tx, eventNID types.EventNID, ) (sentToOutput bool, err error) { stmt := common.TxStmt(txn, s.selectEventSentToOutputStmt) - stmt.QueryRowContext(ctx, int64(eventNID)).Scan(&sentToOutput) + err = stmt.QueryRowContext(ctx, int64(eventNID)).Scan(&sentToOutput) return } @@ -295,7 +295,7 @@ func (s *eventStatements) bulkSelectStateAtEventAndReference( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make([]types.StateAtEventAndReference, len(eventNIDs)) i := 0 for ; rows.Next(); i++ { @@ -333,7 +333,7 @@ func (s *eventStatements) bulkSelectEventReference( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make([]gomatrixserverlib.EventReference, len(eventNIDs)) i := 0 for ; rows.Next(); i++ { @@ -354,7 +354,7 @@ func (s *eventStatements) bulkSelectEventID(ctx context.Context, eventNIDs []typ if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make(map[types.EventNID]string, len(eventNIDs)) i := 0 for ; rows.Next(); i++ { @@ -378,7 +378,7 @@ func (s *eventStatements) bulkSelectEventNID(ctx context.Context, eventIDs []str if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make(map[string]types.EventNID, len(eventIDs)) for rows.Next() { var eventID string diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/invite_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/invite_table.go index 76fa3e04..4f9cdfb4 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/invite_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/invite_table.go @@ -113,22 +113,21 @@ func (s *inviteStatements) insertInviteEvent( func (s *inviteStatements) updateInviteRetired( ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, targetUserNID types.EventStateKeyNID, -) ([]string, error) { +) (eventIDs []string, err error) { stmt := common.TxStmt(txn, s.updateInviteRetiredStmt) rows, err := stmt.QueryContext(ctx, roomNID, targetUserNID) if err != nil { return nil, err } - defer rows.Close() - var result []string + defer (func() { err = rows.Close() })() for rows.Next() { var inviteEventID string if err := rows.Scan(&inviteEventID); err != nil { return nil, err } - result = append(result, inviteEventID) + eventIDs = append(eventIDs, inviteEventID) } - return result, nil + return } // selectInviteActiveForUserInRoom returns a list of sender state key NIDs @@ -142,7 +141,7 @@ func (s *inviteStatements) selectInviteActiveForUserInRoom( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck var result []types.EventStateKeyNID for rows.Next() { var senderUserNID int64 diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/state_block_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/state_block_table.go index 136f61c4..b2e8ef8a 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/state_block_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/state_block_table.go @@ -137,7 +137,7 @@ func (s *stateBlockStatements) bulkSelectStateBlockEntries( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make([]types.StateEntryList, len(stateBlockNIDs)) // current is a pointer to the StateEntryList to append the state entries to. @@ -193,7 +193,7 @@ func (s *stateBlockStatements) bulkSelectFilteredStateBlockEntries( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck var results []types.StateEntryList var current types.StateEntryList diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/state_snapshot_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/state_snapshot_table.go index a0dace82..aa14daad 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/state_snapshot_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/state_snapshot_table.go @@ -97,7 +97,7 @@ func (s *stateSnapshotStatements) bulkSelectStateBlockNIDs( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck results := make([]types.StateBlockNIDList, len(stateNIDs)) i := 0 for ; rows.Next(); i++ { diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go b/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go index 239837fc..ad4fed65 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go @@ -287,19 +287,19 @@ func (d *Database) GetLatestEventsForUpdate( eventNIDs, lastEventNIDSent, currentStateSnapshotNID, err := d.statements.selectLatestEventsNIDsForUpdate(ctx, txn, roomNID) if err != nil { - txn.Rollback() + txn.Rollback() // nolint: errcheck return nil, err } stateAndRefs, err := d.statements.bulkSelectStateAtEventAndReference(ctx, txn, eventNIDs) if err != nil { - txn.Rollback() + txn.Rollback() // nolint: errcheck return nil, err } var lastEventIDSent string if lastEventNIDSent != 0 { lastEventIDSent, err = d.statements.selectEventID(ctx, txn, lastEventNIDSent) if err != nil { - txn.Rollback() + txn.Rollback() // nolint: errcheck return nil, err } } @@ -459,7 +459,7 @@ func (d *Database) MembershipUpdater( succeeded := false defer func() { if !succeeded { - txn.Rollback() + txn.Rollback() // nolint: errcheck } }() diff --git a/src/github.com/matrix-org/dendrite/syncapi/storage/account_data_table.go b/src/github.com/matrix-org/dendrite/syncapi/storage/account_data_table.go index 72aaf355..d4d74d15 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/storage/account_data_table.go +++ b/src/github.com/matrix-org/dendrite/syncapi/storage/account_data_table.go @@ -87,7 +87,7 @@ func (s *accountDataStatements) insertAccountData( ctx context.Context, userID, roomID, dataType string, ) (pos int64, err error) { - s.insertAccountDataStmt.QueryRowContext(ctx, userID, roomID, dataType).Scan(&pos) + err = s.insertAccountDataStmt.QueryRowContext(ctx, userID, roomID, dataType).Scan(&pos) return } diff --git a/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go b/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go index 307af433..e5430d14 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go +++ b/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go @@ -122,7 +122,7 @@ func (s *currentRoomStateStatements) selectJoinedUsers( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck result := make(map[string][]string) for rows.Next() { @@ -147,7 +147,7 @@ func (s *currentRoomStateStatements) selectRoomIDsWithMembership( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck var result []string for rows.Next() { @@ -169,7 +169,7 @@ func (s *currentRoomStateStatements) selectCurrentState( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck return rowsToEvents(rows) } @@ -208,7 +208,7 @@ func (s *currentRoomStateStatements) selectEventsWithEventIDs( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck return rowsToStreamEvents(rows) } diff --git a/src/github.com/matrix-org/dendrite/syncapi/storage/output_room_events_table.go b/src/github.com/matrix-org/dendrite/syncapi/storage/output_room_events_table.go index 660a3074..ac6e3d7f 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/storage/output_room_events_table.go +++ b/src/github.com/matrix-org/dendrite/syncapi/storage/output_room_events_table.go @@ -213,7 +213,7 @@ func (s *outputRoomEventsStatements) selectRecentEvents( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck events, err := rowsToStreamEvents(rows) if err != nil { return nil, err @@ -233,7 +233,7 @@ func (s *outputRoomEventsStatements) selectEvents( if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() // nolint: errcheck return rowsToStreamEvents(rows) }