Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 11 additions & 19 deletions internal/credman/credman_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
}
Expand Down Expand Up @@ -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)
Expand All @@ -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
}
9 changes: 5 additions & 4 deletions internal/credman/credman_windows_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
package credman

import (
"github.com/stretchr/testify/assert"
"testing"
"time"

"github.com/stretchr/testify/assert"
)

func TestWriteCredential(t *testing.T) {
Expand All @@ -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) {
Expand All @@ -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)
Expand Down Expand Up @@ -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")
}
6 changes: 4 additions & 2 deletions internal/credman/types_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
package credman

import (
syscall "golang.org/x/sys/windows"
"time"
"unsafe"

syscall "golang.org/x/sys/windows"
)

const (
Expand Down Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions internal/io/file/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down
Loading