From 89efed68b0a30a316b6990844a0f09ce6e80a359 Mon Sep 17 00:00:00 2001 From: marco Date: Fri, 24 May 2024 11:44:02 +0200 Subject: [PATCH 1/2] replace syscall with unix/windows packages where possible from the 1.22 release notes: The syscall package has been frozen since Go 1.4 and was marked as deprecated in Go 1.11 [...] However, some non-deprecated functionality requires use of the syscall package [...] To avoid unnecessary complaints[...] no longer marked as deprecated. The package remains frozen to most new functionality, and new code remains encouraged to use golang.org/x/sys/unix or golang.org/x/sys/windows where possible. --- cmd/crowdsec-cli/dashboard.go | 6 +++--- cmd/crowdsec/win_service.go | 3 +-- .../modules/wineventlog/wineventlog_windows.go | 5 ++--- pkg/csplugin/utils.go | 12 +++++++----- pkg/csplugin/utils_windows.go | 6 +++--- pkg/types/getfstype_freebsd.go | 9 +++++---- pkg/types/getfstype_windows.go | 12 +++++++----- 7 files changed, 28 insertions(+), 25 deletions(-) diff --git a/cmd/crowdsec-cli/dashboard.go b/cmd/crowdsec-cli/dashboard.go index 96a2fa38cb7..a6e82bf1532 100644 --- a/cmd/crowdsec-cli/dashboard.go +++ b/cmd/crowdsec-cli/dashboard.go @@ -12,13 +12,13 @@ import ( "path/filepath" "strconv" "strings" - "syscall" "unicode" "github.com/AlecAivazis/survey/v2" "github.com/pbnjay/memory" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "golang.org/x/sys/unix" "github.com/crowdsecurity/crowdsec/cmd/crowdsec-cli/require" "github.com/crowdsecurity/crowdsec/pkg/metabase" @@ -457,7 +457,7 @@ func (cli *cliDashboard) chownDatabase(gid string) error { if stat, err := os.Stat(cfg.DbConfig.DbPath); !os.IsNotExist(err) { info := stat.Sys() - if err := os.Chown(cfg.DbConfig.DbPath, int(info.(*syscall.Stat_t).Uid), intID); err != nil { + if err := os.Chown(cfg.DbConfig.DbPath, int(info.(*unix.Stat_t).Uid), intID); err != nil { return fmt.Errorf("unable to chown sqlite db file '%s': %s", cfg.DbConfig.DbPath, err) } } @@ -467,7 +467,7 @@ func (cli *cliDashboard) chownDatabase(gid string) error { file := cfg.DbConfig.DbPath + ext if stat, err := os.Stat(file); !os.IsNotExist(err) { info := stat.Sys() - if err := os.Chown(file, int(info.(*syscall.Stat_t).Uid), intID); err != nil { + if err := os.Chown(file, int(info.(*unix.Stat_t).Uid), intID); err != nil { return fmt.Errorf("unable to chown sqlite db file '%s': %s", file, err) } } diff --git a/cmd/crowdsec/win_service.go b/cmd/crowdsec/win_service.go index 6aa363ca3a7..f2effbff4bc 100644 --- a/cmd/crowdsec/win_service.go +++ b/cmd/crowdsec/win_service.go @@ -8,7 +8,6 @@ package main import ( "fmt" - "syscall" "time" log "github.com/sirupsen/logrus" @@ -67,7 +66,7 @@ func runService(name string) error { // All the calls to logging before the logger is configured are pretty much useless, but we keep them for clarity err := eventlog.InstallAsEventCreate("CrowdSec", eventlog.Error|eventlog.Warning|eventlog.Info) if err != nil { - if errno, ok := err.(syscall.Errno); ok { + if errno, ok := err.(windows.Errno); ok { if errno == windows.ERROR_ACCESS_DENIED { log.Warnf("Access denied when installing event source, running as non-admin ?") } else { diff --git a/pkg/acquisition/modules/wineventlog/wineventlog_windows.go b/pkg/acquisition/modules/wineventlog/wineventlog_windows.go index c6b10b7c38c..9cd4913c7b8 100644 --- a/pkg/acquisition/modules/wineventlog/wineventlog_windows.go +++ b/pkg/acquisition/modules/wineventlog/wineventlog_windows.go @@ -6,7 +6,6 @@ import ( "fmt" "runtime" "strings" - "syscall" "time" "github.com/google/winops/winlog" @@ -180,7 +179,7 @@ func (w *WinEventLogSource) getEvents(out chan types.Event, t *tomb.Tomb) error w.logger.Errorf("WaitForSingleObject failed: %s", err) return err } - if status == syscall.WAIT_OBJECT_0 { + if status == windows.WAIT_OBJECT_0 { renderedEvents, err := w.getXMLEvents(w.evtConfig, publisherCache, subscription, 500) if err == windows.ERROR_NO_MORE_ITEMS { windows.ResetEvent(w.evtConfig.SignalEvent) @@ -225,7 +224,7 @@ func (w *WinEventLogSource) generateConfig(query string) (*winlog.SubscribeConfi return &config, fmt.Errorf("windows.CreateEvent failed: %v", err) } config.Flags = wevtapi.EvtSubscribeToFutureEvents - config.Query, err = syscall.UTF16PtrFromString(query) + config.Query, err = windows.UTF16PtrFromString(query) if err != nil { return &config, fmt.Errorf("syscall.UTF16PtrFromString failed: %v", err) } diff --git a/pkg/csplugin/utils.go b/pkg/csplugin/utils.go index 2e7f0c80528..ec6373e682b 100644 --- a/pkg/csplugin/utils.go +++ b/pkg/csplugin/utils.go @@ -14,10 +14,12 @@ import ( "strconv" "strings" "syscall" + + "golang.org/x/sys/unix" ) -func CheckCredential(uid int, gid int) *syscall.SysProcAttr { - return &syscall.SysProcAttr{ +func CheckCredential(uid int, gid int) *unix.SysProcAttr { + return &unix.SysProcAttr{ Credential: &syscall.Credential{ Uid: uint32(uid), Gid: uint32(gid), @@ -80,7 +82,7 @@ func getPluginTypeAndSubtypeFromPath(path string) (string, string, error) { return strings.Join(parts[:len(parts)-1], "-"), parts[len(parts)-1], nil } -func getProcessAttr(username string, groupname string) (*syscall.SysProcAttr, error) { +func getProcessAttr(username string, groupname string) (*unix.SysProcAttr, error) { uid, err := getUID(username) if err != nil { return nil, err @@ -90,7 +92,7 @@ func getProcessAttr(username string, groupname string) (*syscall.SysProcAttr, er return nil, err } - return &syscall.SysProcAttr{ + return &unix.SysProcAttr{ Credential: &syscall.Credential{ Uid: uid, Gid: gid, @@ -116,7 +118,7 @@ func pluginIsValid(path string) error { if err != nil { return fmt.Errorf("while looking up the current uid: %w", err) } - stat := details.Sys().(*syscall.Stat_t) + stat := details.Sys().(*unix.Stat_t) if stat.Uid != currentUID { return fmt.Errorf("plugin at %s is not owned by user '%s'", path, currentUser.Username) } diff --git a/pkg/csplugin/utils_windows.go b/pkg/csplugin/utils_windows.go index 8d4956ceeeb..220d960f904 100644 --- a/pkg/csplugin/utils_windows.go +++ b/pkg/csplugin/utils_windows.go @@ -19,7 +19,7 @@ import ( ) var ( - advapi32 = syscall.NewLazyDLL("advapi32.dll") + advapi32 = windows.NewLazyDLL("advapi32.dll") procGetAce = advapi32.NewProc("GetAce") ) @@ -149,7 +149,7 @@ func CheckPerms(path string) error { return nil } -func getProcessAtr() (*syscall.SysProcAttr, error) { +func getProcessAtr() (*windows.SysProcAttr, error) { var procToken, token windows.Token proc := windows.CurrentProcess() @@ -195,7 +195,7 @@ func getProcessAtr() (*syscall.SysProcAttr, error) { } return &windows.SysProcAttr{ - CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, + CreationFlags: windows.CREATE_NEW_PROCESS_GROUP, Token: syscall.Token(token), }, nil } diff --git a/pkg/types/getfstype_freebsd.go b/pkg/types/getfstype_freebsd.go index 8fbe3dd7cc4..ce412704357 100644 --- a/pkg/types/getfstype_freebsd.go +++ b/pkg/types/getfstype_freebsd.go @@ -3,14 +3,15 @@ package types import ( - "fmt" - "syscall" + "fmt" + + "golang.org/x/sys/unix" ) func GetFSType(path string) (string, error) { - var fsStat syscall.Statfs_t + var fsStat unix.Statfs_t - if err := syscall.Statfs(path, &fsStat); err != nil { + if err := unix.Statfs(path, &fsStat); err != nil { return "", fmt.Errorf("failed to get filesystem type: %w", err) } diff --git a/pkg/types/getfstype_windows.go b/pkg/types/getfstype_windows.go index 03d8fffd48d..6c6cb3989d3 100644 --- a/pkg/types/getfstype_windows.go +++ b/pkg/types/getfstype_windows.go @@ -4,16 +4,18 @@ import ( "path/filepath" "syscall" "unsafe" + + "golang.org/x/sys/windows" ) func GetFSType(path string) (string, error) { - kernel32, err := syscall.LoadLibrary("kernel32.dll") + kernel32, err := windows.LoadLibrary("kernel32.dll") if err != nil { return "", err } - defer syscall.FreeLibrary(kernel32) + defer windows.FreeLibrary(kernel32) - getVolumeInformation, err := syscall.GetProcAddress(kernel32, "GetVolumeInformationW") + getVolumeInformation, err := windows.GetProcAddress(kernel32, "GetVolumeInformationW") if err != nil { return "", err } @@ -27,7 +29,7 @@ func GetFSType(path string) (string, error) { // Get the root path of the volume volumeRoot := filepath.VolumeName(absPath) + "\\" - volumeRootPtr, _ := syscall.UTF16PtrFromString(volumeRoot) + volumeRootPtr, _ := windows.UTF16PtrFromString(volumeRoot) var ( fileSystemNameBuffer = make([]uint16, 260) @@ -49,5 +51,5 @@ func GetFSType(path string) (string, error) { return "", err } - return syscall.UTF16ToString(fileSystemNameBuffer), nil + return windows.UTF16ToString(fileSystemNameBuffer), nil } From f70f1ad2afae3bc63b26041bfcd664fac93e04c7 Mon Sep 17 00:00:00 2001 From: marco Date: Thu, 30 May 2024 13:34:15 +0200 Subject: [PATCH 2/2] interface conversion: interface {} is *syscall.Stat_t, not *unix.Stat_t --- pkg/csplugin/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/csplugin/utils.go b/pkg/csplugin/utils.go index ec6373e682b..2c7d21db412 100644 --- a/pkg/csplugin/utils.go +++ b/pkg/csplugin/utils.go @@ -118,7 +118,7 @@ func pluginIsValid(path string) error { if err != nil { return fmt.Errorf("while looking up the current uid: %w", err) } - stat := details.Sys().(*unix.Stat_t) + stat := details.Sys().(*syscall.Stat_t) if stat.Uid != currentUID { return fmt.Errorf("plugin at %s is not owned by user '%s'", path, currentUser.Username) }