Skip to content

Commit d953ece

Browse files
refactor: replace deprecated reflect.SliceHeader with unsafe.Slice
Replace reflect.SliceHeader usage with unsafe.Slice (available since Go 1.17) in credman_windows.go. Change CREDENTIAL.CredentialBlob from uintptr to unsafe.Pointer to eliminate go vet warnings. Explicitly discard credFree.Call return values.
1 parent 72dd34e commit d953ece

3 files changed

Lines changed: 13 additions & 20 deletions

File tree

internal/credman/credman_windows.go

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package credman
88

99
import (
10-
"reflect"
1110
"time"
1211
"unsafe"
1312

@@ -59,7 +58,7 @@ func DeleteCredential(credential *Credential, credentialType CredentialType) err
5958
// Credential Manager
6059
func EnumerateCredentials(filter string, all bool) ([]*Credential, error) {
6160
var count int
62-
var systemCredential uintptr
61+
var systemCredential unsafe.Pointer
6362
var filterPtr *uint16
6463
if !all {
6564
filterPtr, _ = syscall.UTF16PtrFromString(filter)
@@ -73,12 +72,8 @@ func EnumerateCredentials(filter string, all bool) ([]*Credential, error) {
7372
if ret == 0 {
7473
return nil, err
7574
}
76-
defer credFree.Call(systemCredential)
77-
systemCredentials := *(*[]*CREDENTIAL)(unsafe.Pointer(&reflect.SliceHeader{
78-
Data: systemCredential,
79-
Len: count,
80-
Cap: count,
81-
}))
75+
defer func() { _, _, _ = credFree.Call(uintptr(systemCredential)) }()
76+
systemCredentials := unsafe.Slice((**CREDENTIAL)(systemCredential), count)
8277
credentials := make([]*Credential, count)
8378
for i, c := range systemCredentials {
8479
credentials[i] = convertFromSystemCredential(c)
@@ -118,9 +113,9 @@ func convertToSystemCredential(cred *Credential) (result *CREDENTIAL) {
118113
result.LastWritten = syscall.NsecToFiletime(cred.LastWritten.UnixNano())
119114
result.CredentialBlobSize = uint32(len(cred.CredentialBlob))
120115
if len(cred.CredentialBlob) > 0 {
121-
result.CredentialBlob = uintptr(unsafe.Pointer(&cred.CredentialBlob[0]))
116+
result.CredentialBlob = unsafe.Pointer(&cred.CredentialBlob[0])
122117
} else {
123-
result.CredentialBlob = 0
118+
result.CredentialBlob = nil
124119
}
125120
result.Persist = uint32(cred.Persist)
126121
result.TargetAlias, _ = syscall.UTF16PtrFromString(cred.TargetAlias)
@@ -129,15 +124,11 @@ func convertToSystemCredential(cred *Credential) (result *CREDENTIAL) {
129124
return
130125
}
131126

132-
func copyBytesToSlice(src uintptr, len uint32) (bytes []byte) {
133-
if src == uintptr(0) {
127+
func copyBytesToSlice(src unsafe.Pointer, len uint32) (bytes []byte) {
128+
if src == nil {
134129
return []byte{}
135130
}
136131
bytes = make([]byte, len)
137-
copy(bytes, *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
138-
Data: src,
139-
Len: int(len),
140-
Cap: int(len),
141-
})))
132+
copy(bytes, unsafe.Slice((*byte)(src), len))
142133
return
143134
}

internal/credman/credman_windows_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,6 @@ func TestNegConvertToSystemCredential(t *testing.T) {
8080
}
8181

8282
func TestNegcopyBytesToSlice(t *testing.T) {
83-
b := copyBytesToSlice(uintptr(0), 0)
83+
b := copyBytesToSlice(nil, 0)
8484
assert.Len(t, b, 0, "bytes should be empty")
8585
}

internal/credman/types_windows.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
package credman
55

66
import (
7-
syscall "golang.org/x/sys/windows"
87
"time"
8+
"unsafe"
9+
10+
syscall "golang.org/x/sys/windows"
911
)
1012

1113
const (
@@ -56,7 +58,7 @@ type CREDENTIAL struct {
5658
Comment *uint16
5759
LastWritten syscall.Filetime
5860
CredentialBlobSize uint32
59-
CredentialBlob uintptr
61+
CredentialBlob unsafe.Pointer
6062
Persist uint32
6163
AttributeCount uint32
6264
Attributes uintptr

0 commit comments

Comments
 (0)