diff --git a/cmd/infra/stcrashreceiver/sentry.go b/cmd/infra/stcrashreceiver/sentry.go index ba2874f84..dcc60f069 100644 --- a/cmd/infra/stcrashreceiver/sentry.go +++ b/cmd/infra/stcrashreceiver/sentry.go @@ -136,7 +136,7 @@ func parseCrashReport(path string, report []byte) (*raven.Packet, error) { r := bytes.NewReader(report) ctx, _, err := stack.ScanSnapshot(r, io.Discard, stack.DefaultOpts()) - if err != nil && err != io.EOF { + if err != nil && !errors.Is(err, io.EOF) { return nil, err } if ctx == nil || len(ctx.Goroutines) == 0 { diff --git a/cmd/strelaysrv/testutil/main.go b/cmd/strelaysrv/testutil/main.go index ab35c3ed4..4b4392db9 100644 --- a/cmd/strelaysrv/testutil/main.go +++ b/cmd/strelaysrv/testutil/main.go @@ -6,6 +6,7 @@ import ( "bufio" "context" "crypto/tls" + "errors" "flag" "log" "net" @@ -133,7 +134,8 @@ func connectToStdio(stdin <-chan string, conn net.Conn) { conn.SetReadDeadline(time.Now().Add(time.Millisecond)) n, err := conn.Read(buf[0:]) if err != nil { - nerr, ok := err.(net.Error) + var nerr net.Error + ok := errors.As(err, &nerr) if !ok || !nerr.Timeout() { log.Println(err) return diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 766aa470c..27844d546 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -529,7 +529,8 @@ func (c *serveCmd) syncthingMain() { err = upgrade.To(release) } if err != nil { - if _, ok := err.(*errNoUpgrade); ok || err == errTooEarlyUpgradeCheck || err == errTooEarlyUpgrade { + var noUpgradeErr *errNoUpgrade + if errors.As(err, &noUpgradeErr) || errors.Is(err, errTooEarlyUpgradeCheck) || errors.Is(err, errTooEarlyUpgrade) { slog.Debug("Initial automatic upgrade", slogutil.Error(err)) } else { slog.Info("Initial automatic upgrade", slogutil.Error(err)) @@ -721,7 +722,7 @@ func autoUpgrade(cfg config.Wrapper, app *syncthing.App, evLogger events.Logger) checkInterval := time.Duration(opts.AutoUpgradeIntervalH) * time.Hour rel, err := upgrade.LatestRelease(opts.ReleasesURL, build.Version, opts.UpgradeToPreReleases) - if err == upgrade.ErrUpgradeUnsupported { + if errors.Is(err, upgrade.ErrUpgradeUnsupported) { sub.Unsubscribe() return } @@ -837,7 +838,8 @@ func setPauseState(cfgWrapper config.Wrapper, paused bool) { } func exitCodeForUpgrade(err error) int { - if _, ok := err.(*errNoUpgrade); ok { + var noUpgradeErr *errNoUpgrade + if errors.As(err, &noUpgradeErr) { return svcutil.ExitNoUpgradeAvailable.AsInt() } return svcutil.ExitError.AsInt() diff --git a/cmd/syncthing/monitor.go b/cmd/syncthing/monitor.go index 5fa22b52d..1af210fbb 100644 --- a/cmd/syncthing/monitor.go +++ b/cmd/syncthing/monitor.go @@ -9,6 +9,7 @@ package main import ( "bufio" "context" + "errors" "fmt" "io" "log/slog" @@ -176,7 +177,8 @@ func (c *serveCmd) monitorMain() { os.Exit(svcutil.ExitSuccess.AsInt()) } - if exiterr, ok := err.(*exec.ExitError); ok { + exiterr := &exec.ExitError{} + if errors.As(err, &exiterr) { exitCode := exiterr.ExitCode() if stopped || c.NoRestart { os.Exit(exitCode) diff --git a/lib/api/api.go b/lib/api/api.go index 6791123f9..a1c075e93 100644 --- a/lib/api/api.go +++ b/lib/api/api.go @@ -455,7 +455,7 @@ func (s *service) Serve(ctx context.Context) error { // due to a config change through the API, let that finish successfully. timeout, cancel := context.WithTimeout(context.Background(), s.shutdownTimeout) defer cancel() - if err := srv.Shutdown(timeout); err == timeout.Err() { + if err := srv.Shutdown(timeout); errors.Is(err, timeout.Err()) { srv.Close() } diff --git a/lib/beacon/broadcast.go b/lib/beacon/broadcast.go index bba7eef96..353ecb5e1 100644 --- a/lib/beacon/broadcast.go +++ b/lib/beacon/broadcast.go @@ -8,6 +8,7 @@ package beacon import ( "context" + "errors" "log/slog" "net" "time" @@ -93,7 +94,8 @@ func writeBroadcasts(ctx context.Context, inbox <-chan []byte, port int) error { _, err = conn.WriteTo(bs, dst) conn.SetWriteDeadline(time.Time{}) - if nerr, ok := err.(net.Error); ok && nerr.Timeout() { + var nerr net.Error + if errors.As(err, &nerr) && nerr.Timeout() { // Write timeouts should not happen. We treat it as a fatal // error on the socket. l.Debugln(err) diff --git a/lib/config/folderconfiguration.go b/lib/config/folderconfiguration.go index e318d2ae0..c6696eee3 100644 --- a/lib/config/folderconfiguration.go +++ b/lib/config/folderconfiguration.go @@ -153,7 +153,7 @@ func (f FolderConfiguration) ModTimeWindow() time.Duration { } func (f *FolderConfiguration) CreateMarker() error { - if err := f.CheckPath(); err != ErrMarkerMissing { + if err := f.CheckPath(); !errors.Is(err, ErrMarkerMissing) { return err } if f.MarkerName != DefaultMarkerName { diff --git a/lib/connections/util.go b/lib/connections/util.go index eeabc3c94..72c677c28 100644 --- a/lib/connections/util.go +++ b/lib/connections/util.go @@ -7,6 +7,7 @@ package connections import ( + "errors" "net" "net/url" "strconv" @@ -20,7 +21,8 @@ func fixupPort(uri *url.URL, defaultPort int) *url.URL { copyURI := *uri host, port, err := net.SplitHostPort(uri.Host) - if e, ok := err.(*net.AddrError); ok && strings.Contains(e.Err, "missing port") { + e := &net.AddrError{} + if errors.As(err, &e) && strings.Contains(e.Err, "missing port") { // addr is of the form "1.2.3.4" or "[fe80::1]" host = uri.Host if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") { diff --git a/lib/protocol/protocol.go b/lib/protocol/protocol.go index 8d47d4948..ddc11ec74 100644 --- a/lib/protocol/protocol.go +++ b/lib/protocol/protocol.go @@ -406,7 +406,7 @@ func (c *rawConnection) readerLoop() { for { msg, err := c.readMessage(fourByteBuf) if err != nil { - if err == errUnknownMessage { + if errors.Is(err, errUnknownMessage) { // Unknown message types are skipped, for future extensibility. continue } diff --git a/lib/rc/rc.go b/lib/rc/rc.go index 7386ffac0..7deff4c3d 100644 --- a/lib/rc/rc.go +++ b/lib/rc/rc.go @@ -144,7 +144,7 @@ func (p *Process) Stop() (*os.ProcessState, error) { default: } - if _, err := p.Post("/rest/system/shutdown", nil); err != nil && err != io.ErrUnexpectedEOF { + if _, err := p.Post("/rest/system/shutdown", nil); err != nil && !errors.Is(err, io.ErrUnexpectedEOF) { // Unexpected EOF is somewhat expected here, as we may exit before // returning something sensible. return nil, err diff --git a/lib/relay/client/methods.go b/lib/relay/client/methods.go index 04594c42b..612e31da3 100644 --- a/lib/relay/client/methods.go +++ b/lib/relay/client/methods.go @@ -5,6 +5,7 @@ package client import ( "context" "crypto/tls" + "errors" "fmt" "net" "net/url" @@ -137,7 +138,8 @@ func TestRelay(ctx context.Context, uri *url.URL, certs []tls.Certificate, sleep if err == nil { return nil } - if _, ok := err.(*incorrectResponseCodeErr); !ok { + incorrectResponseCodeErr := &incorrectResponseCodeErr{} + if errors.As(err, &incorrectResponseCodeErr) { return fmt.Errorf("getting invitation: %w", err) } time.Sleep(sleep) diff --git a/lib/tlsutil/tlsutil.go b/lib/tlsutil/tlsutil.go index 43cb3d52e..62c93f45e 100644 --- a/lib/tlsutil/tlsutil.go +++ b/lib/tlsutil/tlsutil.go @@ -209,7 +209,7 @@ func (l *DowngradingListener) Accept() (net.Conn, error) { // We failed to identify the socket type, pretend that everything is fine, // and pass it to the underlying handler, and let them deal with it. - if err == ErrIdentificationFailed { + if errors.Is(err, ErrIdentificationFailed) { return conn, nil } diff --git a/lib/upnp/upnp.go b/lib/upnp/upnp.go index 9f49d8214..79b2e3e18 100644 --- a/lib/upnp/upnp.go +++ b/lib/upnp/upnp.go @@ -229,7 +229,8 @@ USER-AGENT: syncthing/%s _, err = socket.WriteTo(search, &ssdp) if err != nil { - if e, ok := err.(net.Error); !ok || !e.Timeout() { + var e net.Error + if !errors.As(err, &e) || !e.Timeout() { l.Debugln("UPnP discovery: sending search request:", err) } return diff --git a/lib/versioner/external.go b/lib/versioner/external.go index e5a29574f..5a9ead4f9 100644 --- a/lib/versioner/external.go +++ b/lib/versioner/external.go @@ -101,8 +101,9 @@ func (v external) Archive(filePath string) error { combinedOutput, err := cmd.CombinedOutput() l.Debugln("external command output:", string(combinedOutput)) if err != nil { - if eerr, ok := err.(*exec.ExitError); ok && len(eerr.Stderr) > 0 { - return fmt.Errorf("%v: %v", err, string(eerr.Stderr)) + eerr := &exec.ExitError{} + if errors.As(err, &eerr) && len(eerr.Stderr) > 0 { + return fmt.Errorf("%w: %v", err, string(eerr.Stderr)) } return err }