From 1144ac589b9c7e22b4f3fafc31e37472bf87060c Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 Oct 2022 14:49:06 +0200 Subject: [PATCH 1/6] Fix fs error handling --- cmds/portmaster-start/lock.go | 2 +- cmds/updatemgr/sign.go | 13 +++++++------ netenv/dbus_linux_test.go | 4 +++- network/proc/findpid.go | 6 ++++-- network/proc/pids_by_user.go | 4 +++- profile/framework.go | 2 +- ui/serve.go | 4 ++-- updates/helper/indexes.go | 6 ++++-- 8 files changed, 25 insertions(+), 16 deletions(-) diff --git a/cmds/portmaster-start/lock.go b/cmds/portmaster-start/lock.go index c09e8731d..33ba8d8e5 100644 --- a/cmds/portmaster-start/lock.go +++ b/cmds/portmaster-start/lock.go @@ -33,7 +33,7 @@ func checkAndCreateInstanceLock(path, name string, perUser bool) (pid int32, err // read current pid file data, err := os.ReadFile(lockFilePath) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { // create new lock return 0, createInstanceLock(lockFilePath) } diff --git a/cmds/updatemgr/sign.go b/cmds/updatemgr/sign.go index b0011356f..02cfb15d1 100644 --- a/cmds/updatemgr/sign.go +++ b/cmds/updatemgr/sign.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "io/fs" "os" "path/filepath" "strings" @@ -79,7 +80,7 @@ func sign(cmd *cobra.Command, args []string) error { // Check if there is an existing signature. _, err := os.Stat(file.Path() + filesig.Extension) switch { - case err == nil || os.IsExist(err): + case err == nil || errors.Is(err, fs.ErrExist): // If the file exists, just verify. fileData, err := filesig.VerifyFile( file.Path(), @@ -97,7 +98,7 @@ func sign(cmd *cobra.Command, args []string) error { verified++ } - case os.IsNotExist(err): + case errors.Is(err, fs.ErrNotExist): // Attempt to sign file. fileData, err := filesig.SignFile( file.Path(), @@ -123,10 +124,10 @@ func sign(cmd *cobra.Command, args []string) error { } if verified > 0 { - fmt.Printf("[STAT] verified %d files", verified) + fmt.Printf("[STAT] verified %d files\n", verified) } if signed > 0 { - fmt.Printf("[STAT] signed %d files", signed) + fmt.Printf("[STAT] signed %d files\n", signed) } if fails > 0 { return fmt.Errorf("signing or verification failed on %d files", fails) @@ -170,7 +171,7 @@ func signIndex(cmd *cobra.Command, args []string) error { // Check if there is an existing signature. _, err := os.Stat(sigFile) switch { - case err == nil || os.IsExist(err): + case err == nil || errors.Is(err, fs.ErrExist): // If the file exists, just verify. fileData, err := filesig.VerifyFile( file, @@ -189,7 +190,7 @@ func signIndex(cmd *cobra.Command, args []string) error { } fallthrough - case os.IsNotExist(err): + case errors.Is(err, fs.ErrNotExist): // Attempt to sign file. fileData, err := filesig.SignFile( file, diff --git a/netenv/dbus_linux_test.go b/netenv/dbus_linux_test.go index 160d4c069..65abac07e 100644 --- a/netenv/dbus_linux_test.go +++ b/netenv/dbus_linux_test.go @@ -1,6 +1,8 @@ package netenv import ( + "errors" + "io/fs" "os" "testing" ) @@ -12,7 +14,7 @@ func TestDbus(t *testing.T) { t.Skip("skipping test in short mode because it fails in the CI") } - if _, err := os.Stat("/var/run/dbus/system_bus_socket"); os.IsNotExist(err) { + if _, err := os.Stat("/var/run/dbus/system_bus_socket"); errors.Is(err, fs.ErrNotExist) { t.Logf("skipping dbus tests, as dbus does not seem to be installed: %s", err) return } diff --git a/network/proc/findpid.go b/network/proc/findpid.go index 693fb72fe..2c89da295 100644 --- a/network/proc/findpid.go +++ b/network/proc/findpid.go @@ -3,7 +3,9 @@ package proc import ( + "errors" "fmt" + "io/fs" "os" "time" @@ -103,7 +105,7 @@ func findSocketFromPid(pid int, socketName string) bool { for _, entry := range entries { link, err := os.Readlink(fmt.Sprintf("/proc/%d/fd/%s", pid, entry)) if err != nil { - if !os.IsNotExist(err) { + if !errors.Is(err, fs.ErrNotExist) { log.Warningf("proc: failed to read link /proc/%d/fd/%s: %s", pid, entry, err) } continue @@ -122,7 +124,7 @@ func findSocketFromPid(pid int, socketName string) bool { func readDirNames(dir string) (names []string) { file, err := os.Open(dir) if err != nil { - if !os.IsNotExist(err) { + if !errors.Is(err, fs.ErrNotExist) { log.Warningf("proc: could not open directory %s: %s", dir, err) } return diff --git a/network/proc/pids_by_user.go b/network/proc/pids_by_user.go index 662d2a072..95d6122c4 100644 --- a/network/proc/pids_by_user.go +++ b/network/proc/pids_by_user.go @@ -3,7 +3,9 @@ package proc import ( + "errors" "fmt" + "io/fs" "os" "strconv" "sync" @@ -50,7 +52,7 @@ func updatePids() { statData, err := os.Stat(fmt.Sprintf("/proc/%d", pid)) if err != nil { - if !os.IsNotExist(err) { + if !errors.Is(err, fs.ErrNotExist) { log.Warningf("proc: could not stat /proc/%d: %s", pid, err) } continue entryLoop diff --git a/profile/framework.go b/profile/framework.go index dc2030987..4eae57c7e 100644 --- a/profile/framework.go +++ b/profile/framework.go @@ -57,7 +57,7 @@ package profile // lastError = fmt.Errorf("constructed path \"%s\" from framework is not absolute", buildPath) // continue // } -// if _, err := os.Stat(buildPath); os.IsNotExist(err) { +// if _, err := os.Stat(buildPath); errors.Is(err, fs.ErrNotExist) { // lastError = fmt.Errorf("constructed path \"%s\" does not exist", buildPath) // continue // } diff --git a/ui/serve.go b/ui/serve.go index 1d80a0595..811be7dfc 100644 --- a/ui/serve.go +++ b/ui/serve.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" "io" + "io/fs" "net/http" "net/url" - "os" "path/filepath" "strings" "sync" @@ -125,7 +125,7 @@ func (bs *archiveServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { func ServeFileFromArchive(w http.ResponseWriter, r *http.Request, archiveName string, archiveFS *zipfs.FileSystem, path string) { readCloser, err := archiveFS.Open(path) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { // Check if there is a base index.html file we can serve instead. var indexErr error path = "index.html" diff --git a/updates/helper/indexes.go b/updates/helper/indexes.go index d0722f340..2995e168d 100644 --- a/updates/helper/indexes.go +++ b/updates/helper/indexes.go @@ -1,7 +1,9 @@ package helper import ( + "errors" "fmt" + "io/fs" "os" "path/filepath" @@ -106,13 +108,13 @@ func indexExists(registry *updater.ResourceRegistry, indexPath string) bool { func deleteIndex(registry *updater.ResourceRegistry, indexPath string) error { // Remove index itself. err := os.Remove(filepath.Join(registry.StorageDir().Path, indexPath)) - if err != nil && !os.IsNotExist(err) { + if err != nil && !errors.Is(err, fs.ErrNotExist) { return err } // Remove any accompanying signature. err = os.Remove(filepath.Join(registry.StorageDir().Path, indexPath+filesig.Extension)) - if err != nil && !os.IsNotExist(err) { + if err != nil && !errors.Is(err, fs.ErrNotExist) { return err } From 694dfb5b460635ae72f63a7823dcaa7cfdd12dce Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 Oct 2022 14:49:27 +0200 Subject: [PATCH 2/6] Use per-user lock file when unlocking --- cmds/portmaster-start/lock.go | 39 +++++++++++++++++++---------------- cmds/portmaster-start/run.go | 2 +- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/cmds/portmaster-start/lock.go b/cmds/portmaster-start/lock.go index 33ba8d8e5..0db866065 100644 --- a/cmds/portmaster-start/lock.go +++ b/cmds/portmaster-start/lock.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "io/fs" "log" "os" "os/user" @@ -14,21 +15,7 @@ import ( ) func checkAndCreateInstanceLock(path, name string, perUser bool) (pid int32, err error) { - var lockFilePath string - if perUser { - // Get user ID for per-user lock file. - var userID string - usr, err := user.Current() - if err != nil { - log.Printf("failed to get current user: %s\n", err) - userID = "no-user" - } else { - userID = usr.Uid - } - lockFilePath = filepath.Join(dataRoot.Path, path, fmt.Sprintf("%s-%s-lock.pid", name, userID)) - } else { - lockFilePath = filepath.Join(dataRoot.Path, path, fmt.Sprintf("%s-lock.pid", name)) - } + lockFilePath := getLockFilePath(path, name, perUser) // read current pid file data, err := os.ReadFile(lockFilePath) @@ -100,7 +87,23 @@ func createInstanceLock(lockFilePath string) error { return nil } -func deleteInstanceLock(path, name string) error { - lockFilePath := filepath.Join(dataRoot.Path, path, fmt.Sprintf("%s-lock.pid", name)) - return os.Remove(lockFilePath) +func deleteInstanceLock(path, name string, perUser bool) error { + return os.Remove(getLockFilePath(path, name, perUser)) +} + +func getLockFilePath(path, name string, perUser bool) string { + if !perUser { + return filepath.Join(dataRoot.Path, path, fmt.Sprintf("%s-lock.pid", name)) + } + + // Get user ID for per-user lock file. + var userID string + usr, err := user.Current() + if err != nil { + log.Printf("failed to get current user: %s\n", err) + userID = "no-user" + } else { + userID = usr.Uid + } + return filepath.Join(dataRoot.Path, path, fmt.Sprintf("%s-%s-lock.pid", name, userID)) } diff --git a/cmds/portmaster-start/run.go b/cmds/portmaster-start/run.go index 34c9129b0..0536f30a3 100644 --- a/cmds/portmaster-start/run.go +++ b/cmds/portmaster-start/run.go @@ -172,7 +172,7 @@ func run(opts *Options, cmdArgs []string) (err error) { return fmt.Errorf("another instance of %s is already running: PID %d", opts.Name, pid) } defer func() { - err := deleteInstanceLock(opts.LockPathPrefix, opts.ShortIdentifier) + err := deleteInstanceLock(opts.LockPathPrefix, opts.ShortIdentifier, opts.LockPerUser) if err != nil { log.Printf("failed to delete instance lock: %s\n", err) } From e5a0f06f979c6c49008a2f8b464554557c4b8c7e Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 Oct 2022 14:49:57 +0200 Subject: [PATCH 3/6] Use interception config only when ready --- firewall/api.go | 2 +- firewall/config.go | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/firewall/api.go b/firewall/api.go index 99ae36b5d..447c16854 100644 --- a/firewall/api.go +++ b/firewall/api.go @@ -63,7 +63,7 @@ func startAPIAuth() { } func apiAuthenticator(r *http.Request, s *http.Server) (token *api.AuthToken, err error) { - if devMode() { + if configReady.IsSet() && devMode() { return &api.AuthToken{ Read: api.PermitSelf, Write: api.PermitSelf, diff --git a/firewall/config.go b/firewall/config.go index 5f6f92e9e..eaf3fa442 100644 --- a/firewall/config.go +++ b/firewall/config.go @@ -1,6 +1,8 @@ package firewall import ( + "github.com/tevino/abool" + "github.com/safing/portbase/api" "github.com/safing/portbase/config" "github.com/safing/portbase/notifications" @@ -119,6 +121,8 @@ var ( filterEnabled config.BoolOption tunnelEnabled config.BoolOption useCommunityNodes config.BoolOption + + configReady = abool.New() ) func getConfig() { @@ -128,4 +132,6 @@ func getConfig() { filterEnabled = config.Concurrent.GetAsBool(CfgOptionEnableFilterKey, true) tunnelEnabled = config.Concurrent.GetAsBool(captain.CfgOptionEnableSPNKey, false) useCommunityNodes = config.Concurrent.GetAsBool(captain.CfgOptionUseCommunityNodesKey, true) + + configReady.Set() } From eac91ae62742b30a24b4c1311fb10f9235e67c60 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 Oct 2022 14:51:33 +0200 Subject: [PATCH 4/6] Improve logging and context usage --- firewall/interception.go | 11 +++++++---- process/process.go | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/firewall/interception.go b/firewall/interception.go index e9476b900..85ffa01e7 100644 --- a/firewall/interception.go +++ b/firewall/interception.go @@ -116,9 +116,9 @@ func resetAllConnectionVerdicts() { // Create tracing context. ctx, tracer := log.AddTracer(context.Background()) - defer tracer.Submit() // Re-evaluate all connections. + var changedVerdicts int for _, conn := range network.GetAllConnections() { func() { conn.Lock() @@ -129,11 +129,11 @@ func resetAllConnectionVerdicts() { // - Redirected DNS requests // - SPN Uplink to Home Hub if conn.Internal { - log.Tracef("skipping internal connection %s", conn) + tracer.Tracef("filter: skipping internal connection %s", conn) return } - log.Tracer(ctx).Debugf("filter: re-evaluating verdict of %s", conn) + tracer.Debugf("filter: re-evaluating verdict of %s", conn) previousVerdict := conn.Verdict.Firewall // Apply privacy filter and check tunneling. @@ -143,7 +143,7 @@ func resetAllConnectionVerdicts() { if conn.Verdict.Active != network.VerdictRerouteToTunnel && conn.TunnelContext != nil { err := conn.TunnelContext.StopTunnel() if err != nil { - log.Debugf("filter: failed to stopped unneeded tunnel: %s", err) + tracer.Debugf("filter: failed to stopped unneeded tunnel: %s", err) } } @@ -151,11 +151,14 @@ func resetAllConnectionVerdicts() { if conn.Verdict.Firewall != previousVerdict { conn.Save() tracer.Infof("filter: verdict of connection %s changed from %s to %s", conn, previousVerdict.Verb(), conn.VerdictVerb()) + changedVerdicts++ } else { tracer.Tracef("filter: verdict to connection %s unchanged at %s", conn, conn.VerdictVerb()) } }() } + tracer.Infof("profile: changed verdict on %d connections", changedVerdicts) + tracer.Submit() err := interception.ResetVerdictOfAllConnections() if err != nil { diff --git a/process/process.go b/process/process.go index a3ff13338..9f3ad2e4b 100644 --- a/process/process.go +++ b/process/process.go @@ -238,7 +238,7 @@ func loadProcess(ctx context.Context, pid int) (*Process, error) { // Current working directory // not yet implemented for windows if runtime.GOOS != "windows" { - process.Cwd, err = pInfo.Cwd() + process.Cwd, err = pInfo.CwdWithContext(ctx) if err != nil { log.Warningf("process: failed to get Cwd: %s", err) } From 096e140ee1c72b3c91e6a59b05aa0b5178a06f6d Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 Oct 2022 14:51:45 +0200 Subject: [PATCH 5/6] Check if active profile is outdated before using --- profile/get.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/profile/get.go b/profile/get.go index ad8d018b2..9d6d1b615 100644 --- a/profile/get.go +++ b/profile/get.go @@ -221,7 +221,7 @@ profileFeed: } // Check if this profile is already active and return the active version instead. - if activeProfile := getActiveProfile(profile.ScopedID()); activeProfile != nil { + if activeProfile := getActiveProfile(profile.ScopedID()); activeProfile != nil && !activeProfile.IsOutdated() { return activeProfile, nil } From 832eb89dc5d43a3865bf6497f95f054cd51ecc34 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 Oct 2022 14:51:59 +0200 Subject: [PATCH 6/6] Update deps --- go.mod | 10 +++++----- go.sum | 23 ++++++++++------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index e27dac370..bd4f60aec 100644 --- a/go.mod +++ b/go.mod @@ -16,9 +16,9 @@ require ( github.com/jackc/puddle/v2 v2.0.0-beta.1 github.com/miekg/dns v1.1.50 github.com/oschwald/maxminddb-golang v1.10.0 - github.com/safing/jess v0.3.0 - github.com/safing/portbase v0.16.1 - github.com/safing/spn v0.5.2 + github.com/safing/jess v0.3.1 + github.com/safing/portbase v0.16.2 + github.com/safing/spn v0.5.3 github.com/shirou/gopsutil v3.21.11+incompatible github.com/spf13/cobra v1.5.0 github.com/spkg/zipfs v0.7.1 @@ -28,7 +28,7 @@ require ( github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26 golang.org/x/net v0.0.0-20221004154528-8021a29435af golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 - golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875 + golang.org/x/sys v0.0.0-20221010170243-090e33056c14 zombiezen.com/go/sqlite v0.10.1 ) @@ -80,7 +80,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect github.com/zalando/go-keyring v0.2.1 // indirect go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b // indirect + golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/tools v0.1.12 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index f747b6c34..c79ef1deb 100644 --- a/go.sum +++ b/go.sum @@ -186,17 +186,14 @@ github.com/rot256/pblind v0.0.0-20211117203330-22455f90b565 h1:jVOT0WWSrjQx6pYq4 github.com/rot256/pblind v0.0.0-20211117203330-22455f90b565/go.mod h1:SI9+Ls7HSJkgYArhh8oBPhXiNL7tJltkU1H6Pm2o8Zo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/safing/jess v0.3.0 h1:NxerZE5Vrludn00gyR4VeZaNjbDYq/qBzmcV3SLfjd4= github.com/safing/jess v0.3.0/go.mod h1:JbYsPk5iJZx0OXDZeMcjS9qEdkGVUg+DCA8Fw2LdN9s= +github.com/safing/jess v0.3.1 h1:cMZVhi2whW/YdD98MPLeLIWJndQ7o2QVt2HefQ/ByFA= +github.com/safing/jess v0.3.1/go.mod h1:aj73Eot1zm2ETkJuw9hJlIO8bRom52uBbsCHemvlZmA= github.com/safing/portbase v0.15.2/go.mod h1:5bHi99fz7Hh/wOsZUOI631WF9ePSHk57c4fdlOMS91Y= -github.com/safing/portbase v0.16.0 h1:oGu5xVuMyzkG6Fht+kKbyHvA8CEJEexuCvsYQuyh6vs= -github.com/safing/portbase v0.16.0/go.mod h1:mzNCWqPbO7vIYbbK5PElGbudwd2vx4YPNawymL8Aro8= -github.com/safing/portbase v0.16.1 h1:P3nSP76EEa1GnkruzZDau0deh64Va7J5bJQ66CB7RVk= -github.com/safing/portbase v0.16.1/go.mod h1:mzNCWqPbO7vIYbbK5PElGbudwd2vx4YPNawymL8Aro8= -github.com/safing/spn v0.5.1 h1:SPTG9S7BfUBpnrg8pmTFsaSlRowSljlZ0hT4NQFHnjE= -github.com/safing/spn v0.5.1/go.mod h1:IuQNzXhR8sSi7sq4KXIH1rK9N3Z94A3nRgItjfDB6Dg= -github.com/safing/spn v0.5.2 h1:Gl82Fhy8+tKAarLGakkug+xzuBUcjeA39Q495pfnDWk= -github.com/safing/spn v0.5.2/go.mod h1:r2Ig1VN0jTXC0kjSrK0mk8q3StkFTlQL+k2oJi+3TMY= +github.com/safing/portbase v0.16.2 h1:ZlCZBZkKmgJDR+sHSRbFc9mM8m9qYtu8agE1xCirvQU= +github.com/safing/portbase v0.16.2/go.mod h1:mzNCWqPbO7vIYbbK5PElGbudwd2vx4YPNawymL8Aro8= +github.com/safing/spn v0.5.3 h1:aebwD3RI7OqtbBDK9HoqhKHcEH/i021Klrkl+dOq1Dc= +github.com/safing/spn v0.5.3/go.mod h1:HYcGGze78wlwXZxF1UMqZ7GuA6ILqvNrO9v23EpFQvM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/seehuhn/fortuna v1.0.1 h1:lu9+CHsmR0bZnx5Ay646XvCSRJ8PJTi5UYJwDBX68H0= @@ -280,8 +277,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b h1:huxqepDufQpLLIRXiVkTvnxrzJlpwmIWAObmcCcUFr0= -golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 h1:x8vtB3zMecnlqZIwJNUUpwYKYSqCz5jXbiyv0ZJJZeI= +golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -362,8 +359,8 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875 h1:AzgQNqF+FKwyQ5LbVrVqOcuuFB67N47F9+htZYH0wFM= -golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=