diff --git a/internal/credman/credman_windows.go b/internal/credman/credman_windows.go index 0fb1c68f..73a20568 100644 --- a/internal/credman/credman_windows.go +++ b/internal/credman/credman_windows.go @@ -7,10 +7,10 @@ package credman import ( - syscall "golang.org/x/sys/windows" - "reflect" "time" "unsafe" + + syscall "golang.org/x/sys/windows" ) // Load the Windows DLL "advapi32.dll", then set up Go wrapper functions for @@ -58,7 +58,7 @@ func DeleteCredential(credential *Credential, credentialType CredentialType) err // Credential Manager func EnumerateCredentials(filter string, all bool) ([]*Credential, error) { var count int - var systemCredential uintptr + var systemCredential unsafe.Pointer var filterPtr *uint16 if !all { filterPtr, _ = syscall.UTF16PtrFromString(filter) @@ -72,13 +72,9 @@ func EnumerateCredentials(filter string, all bool) ([]*Credential, error) { if ret == 0 { return nil, err } - defer credFree.Call(systemCredential) - systemCredentials := *(*[]*CREDENTIAL)(unsafe.Pointer(&reflect.SliceHeader{ - Data: systemCredential, - Len: count, - Cap: count, - })) - credentials := make([]*Credential, count, count) + defer func() { _, _, _ = credFree.Call(uintptr(systemCredential)) }() + systemCredentials := unsafe.Slice((**CREDENTIAL)(systemCredential), count) + credentials := make([]*Credential, count) for i, c := range systemCredentials { credentials[i] = convertFromSystemCredential(c) } @@ -117,9 +113,9 @@ func convertToSystemCredential(cred *Credential) (result *CREDENTIAL) { result.LastWritten = syscall.NsecToFiletime(cred.LastWritten.UnixNano()) result.CredentialBlobSize = uint32(len(cred.CredentialBlob)) if len(cred.CredentialBlob) > 0 { - result.CredentialBlob = uintptr(unsafe.Pointer(&cred.CredentialBlob[0])) + result.CredentialBlob = unsafe.Pointer(&cred.CredentialBlob[0]) } else { - result.CredentialBlob = 0 + result.CredentialBlob = nil } result.Persist = uint32(cred.Persist) result.TargetAlias, _ = syscall.UTF16PtrFromString(cred.TargetAlias) @@ -128,15 +124,11 @@ func convertToSystemCredential(cred *Credential) (result *CREDENTIAL) { return } -func copyBytesToSlice(src uintptr, len uint32) (bytes []byte) { - if src == uintptr(0) { +func copyBytesToSlice(src unsafe.Pointer, len uint32) (bytes []byte) { + if src == nil { return []byte{} } bytes = make([]byte, len) - copy(bytes, *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ - Data: src, - Len: int(len), - Cap: int(len), - }))) + copy(bytes, unsafe.Slice((*byte)(src), len)) return } diff --git a/internal/credman/credman_windows_test.go b/internal/credman/credman_windows_test.go index c3223d96..24b670d0 100644 --- a/internal/credman/credman_windows_test.go +++ b/internal/credman/credman_windows_test.go @@ -4,9 +4,10 @@ package credman import ( - "github.com/stretchr/testify/assert" "testing" "time" + + "github.com/stretchr/testify/assert" ) func TestWriteCredential(t *testing.T) { @@ -31,7 +32,7 @@ func TestWriteCredential(t *testing.T) { assert.Equal(t, credentials[0].Persist, PersistSession, "WriteCredential wrote incorrect Persist, got: %d, want: %d", credentials[0].Persist, PersistSession) // Cleanup the written credential - DeleteCredential(credential, CredTypeGeneric) + _ = DeleteCredential(credential, CredTypeGeneric) } func TestDeleteCredential(t *testing.T) { @@ -44,7 +45,7 @@ func TestDeleteCredential(t *testing.T) { } // Write the credential first - WriteCredential(credential, CredTypeGeneric) + _ = WriteCredential(credential, CredTypeGeneric) err := DeleteCredential(credential, CredTypeGeneric) assert.NoErrorf(t, err, "DeleteCredential returned an error: %v", err) @@ -79,6 +80,6 @@ func TestNegConvertToSystemCredential(t *testing.T) { } func TestNegcopyBytesToSlice(t *testing.T) { - b := copyBytesToSlice(uintptr(0), 0) + b := copyBytesToSlice(nil, 0) assert.Len(t, b, 0, "bytes should be empty") } diff --git a/internal/credman/types_windows.go b/internal/credman/types_windows.go index 1b4e5ee4..90988ca5 100644 --- a/internal/credman/types_windows.go +++ b/internal/credman/types_windows.go @@ -4,8 +4,10 @@ package credman import ( - syscall "golang.org/x/sys/windows" "time" + "unsafe" + + syscall "golang.org/x/sys/windows" ) const ( @@ -56,7 +58,7 @@ type CREDENTIAL struct { Comment *uint16 LastWritten syscall.Filetime CredentialBlobSize uint32 - CredentialBlob uintptr + CredentialBlob unsafe.Pointer Persist uint32 AttributeCount uint32 Attributes uintptr diff --git a/internal/io/file/file.go b/internal/io/file/file.go index 7f0b2360..f390b775 100644 --- a/internal/io/file/file.go +++ b/internal/io/file/file.go @@ -4,10 +4,10 @@ package file import ( - "github.com/microsoft/go-sqlcmd/internal/io/folder" - "io/ioutil" "os" "path/filepath" + + "github.com/microsoft/go-sqlcmd/internal/io/folder" ) func CloseFile(f *os.File) { @@ -55,7 +55,7 @@ func Exists(filename string) (exists bool) { } func GetContents(filename string) string { - b, err := ioutil.ReadFile(filename) + b, err := os.ReadFile(filename) checkErr(err) return string(b)