Skip to content

Commit

Permalink
type switch on an error will fail on wrapped errors. Use errors.As/Is…
Browse files Browse the repository at this point in the history
… to check for specific errors (errorlint) (#10959)

func  is unused (unused)

G602: Potentially accessing slice out of bounds (gosec)
  • Loading branch information
jmank88 authored Oct 16, 2023
1 parent 4519370 commit a76e6a1
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 58 deletions.
7 changes: 0 additions & 7 deletions core/services/keystore/eth.go
Original file line number Diff line number Diff line change
Expand Up @@ -529,13 +529,6 @@ func (ks *eth) getByID(id string) (ethkey.KeyV2, error) {
return key, nil
}

func (ks *eth) exists(address common.Address) bool {
ks.lock.RLock()
defer ks.lock.RUnlock()
_, found := ks.keyRing.Eth[address.Hex()]
return found
}

// caller must hold lock!
func (ks *eth) enabledKeysForChain(chainID *big.Int) (keys []ethkey.KeyV2) {
return ks.keysForChain(chainID, false)
Expand Down
4 changes: 3 additions & 1 deletion core/services/telemetry/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,9 @@ func TestLegacyMode(t *testing.T) {
e2.SendLog([]byte("endpoint-2-message-1"))
e2.SendLog([]byte("endpoint-2-message-2"))
e2.SendLog([]byte("endpoint-2-message-3"))
require.Len(t, clientSent, 6)
if len(clientSent) != 6 {
t.Fatalf("expected length 6 but got %d", len(clientSent))
}

require.Equal(t, 1, obsLogs.Len()) // Deprecation warning for TelemetryIngress.URL and TelemetryIngress.ServerPubKey
require.Equal(t, []byte("endpoint-1-message-1"), clientSent[0].Telemetry)
Expand Down
12 changes: 7 additions & 5 deletions core/store/models/errors.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package models

import (
"errors"
"strings"
)

Expand Down Expand Up @@ -49,12 +50,13 @@ func (jae *JSONAPIErrors) Add(detail string) {
// Merge combines the arrays of the passed error if it is of type JSONAPIErrors,
// otherwise simply adds a single error with the error string as detail.
func (jae *JSONAPIErrors) Merge(e error) {
switch typed := e.(type) {
case *JSONAPIErrors:
jae.Errors = append(jae.Errors, typed.Errors...)
default:
jae.Add(e.Error())
var jsonErr *JSONAPIErrors
if errors.As(e, &jsonErr) {
jae.Errors = append(jae.Errors, jsonErr.Errors...)
return
}
jae.Add(e.Error())

}

// CoerceEmptyToNil will return nil if JSONAPIErrors has no errors.
Expand Down
11 changes: 6 additions & 5 deletions core/web/auth/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package auth

import (
"github.com/gin-gonic/gin"
"github.com/pkg/errors"

"github.com/smartcontractkit/chainlink/v2/core/store/models"
)
Expand All @@ -13,12 +14,12 @@ import (
// so this is ok for now
func jsonAPIError(c *gin.Context, statusCode int, err error) {
_ = c.Error(err).SetType(gin.ErrorTypePublic)
switch v := err.(type) {
case *models.JSONAPIErrors:
c.JSON(statusCode, v)
default:
c.JSON(statusCode, models.NewJSONAPIErrorsWith(err.Error()))
var jsonErr *models.JSONAPIErrors
if errors.As(err, &jsonErr) {
c.JSON(statusCode, jsonErr)
return
}
c.JSON(statusCode, models.NewJSONAPIErrorsWith(err.Error()))
}

// addForbiddenErrorHeaders adds custom headers to the 403 (Forbidden) response
Expand Down
27 changes: 13 additions & 14 deletions core/web/bridge_types_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,29 +83,28 @@ func (btc *BridgeTypesController) Create(c *gin.Context) {
jsonAPIError(c, http.StatusInternalServerError, e)
return
}
switch e := err.(type) {
case *pgconn.PgError:
var pgErr *pgconn.PgError
if errors.As(err, &pgErr) {
var apiErr error
if e.ConstraintName == "external_initiators_name_key" {
if pgErr.ConstraintName == "external_initiators_name_key" {
apiErr = fmt.Errorf("bridge Type %v conflict", bt.Name)
} else {
apiErr = err
}
jsonAPIError(c, http.StatusConflict, apiErr)
return
default:
resource := presenters.NewBridgeResource(*bt)
resource.IncomingToken = bta.IncomingToken
}
resource := presenters.NewBridgeResource(*bt)
resource.IncomingToken = bta.IncomingToken

btc.App.GetAuditLogger().Audit(audit.BridgeCreated, map[string]interface{}{
"bridgeName": bta.Name,
"bridgeConfirmations": bta.Confirmations,
"bridgeMinimumContractPayment": bta.MinimumContractPayment,
"bridgeURL": bta.URL,
})
btc.App.GetAuditLogger().Audit(audit.BridgeCreated, map[string]interface{}{
"bridgeName": bta.Name,
"bridgeConfirmations": bta.Confirmations,
"bridgeMinimumContractPayment": bta.MinimumContractPayment,
"bridgeURL": bta.URL,
})

jsonAPIResponse(c, resource, "bridge")
}
jsonAPIResponse(c, resource, "bridge")
}

// Index lists Bridges, one page at a time.
Expand Down
12 changes: 5 additions & 7 deletions core/web/evm_transfer_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,11 @@ func (tc *EVMTransfersController) Create(c *gin.Context) {
}

chain, err := getChain(tc.App.GetRelayers().LegacyEVMChains(), tr.EVMChainID.String())
switch err {
case ErrInvalidChainID, ErrMultipleChains, ErrMissingChainID:
jsonAPIError(c, http.StatusUnprocessableEntity, err)
return
case nil:
break
default:
if err != nil {
if errors.Is(err, ErrInvalidChainID) || errors.Is(err, ErrMultipleChains) || errors.Is(err, ErrMissingChainID) {
jsonAPIError(c, http.StatusUnprocessableEntity, err)
return
}
jsonAPIError(c, http.StatusInternalServerError, err)
return
}
Expand Down
10 changes: 5 additions & 5 deletions core/web/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ import (
// the JSON value of errors.
func jsonAPIError(c *gin.Context, statusCode int, err error) {
_ = c.Error(err).SetType(gin.ErrorTypePublic)
switch v := err.(type) {
case *models.JSONAPIErrors:
c.JSON(statusCode, v)
default:
c.JSON(statusCode, models.NewJSONAPIErrorsWith(err.Error()))
var jsonErr *models.JSONAPIErrors
if errors.As(err, &jsonErr) {
c.JSON(statusCode, jsonErr)
return
}
c.JSON(statusCode, models.NewJSONAPIErrorsWith(err.Error()))
}

func paginatedResponse(
Expand Down
12 changes: 5 additions & 7 deletions core/web/replay_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,11 @@ func (bdc *ReplayController) ReplayFromBlock(c *gin.Context) {
}

chain, err := getChain(bdc.App.GetRelayers().LegacyEVMChains(), c.Query("evmChainID"))
switch err {
case ErrInvalidChainID, ErrMultipleChains, ErrMissingChainID:
jsonAPIError(c, http.StatusUnprocessableEntity, err)
return
case nil:
break
default:
if err != nil {
if errors.Is(err, ErrInvalidChainID) || errors.Is(err, ErrMultipleChains) || errors.Is(err, ErrMissingChainID) {
jsonAPIError(c, http.StatusUnprocessableEntity, err)
return
}
jsonAPIError(c, http.StatusInternalServerError, err)
return
}
Expand Down
10 changes: 3 additions & 7 deletions core/web/solana_transfer_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,16 +61,12 @@ func (tc *SolanaTransfersController) Create(c *gin.Context) {

err = relayer.Transact(c, tr.From.String(), tr.To.String(), amount, !tr.AllowHigherAmounts)
if err != nil {
switch err {
case chains.ErrNotFound, chains.ErrChainIDEmpty:
if errors.Is(err, chains.ErrNotFound) || errors.Is(err, chains.ErrChainIDEmpty) {
jsonAPIError(c, http.StatusBadRequest, err)
return
case nil:
break
default:
jsonAPIError(c, http.StatusInternalServerError, err)
return
}
jsonAPIError(c, http.StatusInternalServerError, err)
return
}

resource := presenters.NewSolanaMsgResource("sol_transfer_"+uuid.New().String(), tr.SolanaChainID)
Expand Down

0 comments on commit a76e6a1

Please sign in to comment.