Skip to content

Commit 43e62db

Browse files
committed
windows: use unsafeheader.Slice
1 parent 3ce0480 commit 43e62db

File tree

5 files changed

+53
-25
lines changed

5 files changed

+53
-25
lines changed

windows/security_windows.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package windows
77
import (
88
"syscall"
99
"unsafe"
10+
11+
"golang.org/x/sys/internal/unsafeheader"
1012
)
1113

1214
const (
@@ -1230,7 +1232,13 @@ func (sd *SECURITY_DESCRIPTOR) String() string {
12301232
return ""
12311233
}
12321234
defer LocalFree(Handle(unsafe.Pointer(sddl)))
1233-
return UTF16PtrToString(sddl)
1235+
1236+
var utf16s []uint16
1237+
h := (*unsafeheader.Slice)(unsafe.Pointer(&utf16s))
1238+
h.Data = unsafe.Pointer(sddl)
1239+
h.Len = int(strLen)
1240+
h.Cap = int(strLen)
1241+
return UTF16ToString(utf16s)
12341242
}
12351243

12361244
// ToAbsolute converts a self-relative security descriptor into an absolute one.
@@ -1308,9 +1316,14 @@ func (absoluteSD *SECURITY_DESCRIPTOR) ToSelfRelative() (selfRelativeSD *SECURIT
13081316
}
13091317

13101318
func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() *SECURITY_DESCRIPTOR {
1311-
sdBytes := make([]byte, selfRelativeSD.Length())
1312-
copy(sdBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(selfRelativeSD))[:len(sdBytes):len(sdBytes)])
1313-
return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&sdBytes[0]))
1319+
var dst, src []byte
1320+
dst = make([]byte, selfRelativeSD.Length())
1321+
h := (*unsafeheader.Slice)(unsafe.Pointer(&src))
1322+
h.Data = unsafe.Pointer(selfRelativeSD)
1323+
h.Len = len(dst)
1324+
h.Cap = len(dst)
1325+
copy(dst, src)
1326+
return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&dst[0]))
13141327
}
13151328

13161329
// SecurityDescriptorFromString converts an SDDL string describing a security descriptor into a

windows/svc/mgr/mgr.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"unicode/utf16"
1818
"unsafe"
1919

20+
"golang.org/x/sys/internal/unsafeheader"
2021
"golang.org/x/sys/windows"
2122
)
2223

@@ -201,7 +202,13 @@ func (m *Mgr) ListServices() ([]string, error) {
201202
if servicesReturned == 0 {
202203
return nil, nil
203204
}
204-
services := (*[1 << 20]windows.ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(&buf[0]))[:servicesReturned:servicesReturned]
205+
206+
var services []windows.ENUM_SERVICE_STATUS_PROCESS
207+
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&services))
208+
hdr.Data = unsafe.Pointer(&buf[0])
209+
hdr.Len = int(servicesReturned)
210+
hdr.Cap = int(servicesReturned)
211+
205212
var names []string
206213
for _, s := range services {
207214
name := windows.UTF16PtrToString(s.ServiceName)

windows/svc/mgr/recovery.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"time"
1313
"unsafe"
1414

15+
"golang.org/x/sys/internal/unsafeheader"
1516
"golang.org/x/sys/windows"
1617
)
1718

@@ -68,8 +69,13 @@ func (s *Service) RecoveryActions() ([]RecoveryAction, error) {
6869
return nil, err
6970
}
7071

72+
var actions []windows.SC_ACTION
73+
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&actions))
74+
hdr.Data = unsafe.Pointer(p.Actions)
75+
hdr.Len = int(p.ActionsCount)
76+
hdr.Cap = int(p.ActionsCount)
77+
7178
var recoveryActions []RecoveryAction
72-
actions := (*[1024]windows.SC_ACTION)(unsafe.Pointer(p.Actions))[:p.ActionsCount:p.ActionsCount]
7379
for _, action := range actions {
7480
recoveryActions = append(recoveryActions, RecoveryAction{Type: int(action.Type), Delay: time.Duration(action.Delay) * time.Millisecond})
7581
}

windows/svc/service.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"syscall"
1515
"unsafe"
1616

17+
"golang.org/x/sys/internal/unsafeheader"
1718
"golang.org/x/sys/windows"
1819
)
1920

@@ -224,7 +225,13 @@ const (
224225
func (s *service) run() {
225226
s.goWaits.Wait()
226227
s.h = windows.Handle(ssHandle)
227-
argv := (*[100]*uint16)(unsafe.Pointer(sArgv))[:sArgc:sArgc]
228+
229+
var argv []*uint16
230+
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&argv))
231+
hdr.Data = unsafe.Pointer(sArgv)
232+
hdr.Len = int(sArgc)
233+
hdr.Cap = int(sArgc)
234+
228235
args := make([]string, len(argv))
229236
for i, a := range argv {
230237
args[i] = windows.UTF16PtrToString(a)

windows/syscall_windows.go

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ package windows
88

99
import (
1010
errorspkg "errors"
11-
"strings"
1211
"sync"
1312
"syscall"
1413
"time"
1514
"unicode/utf16"
1615
"unsafe"
16+
17+
"golang.org/x/sys/internal/unsafeheader"
1718
)
1819

1920
type Handle uintptr
@@ -125,25 +126,19 @@ func UTF16PtrToString(p *uint16) string {
125126
if p == nil {
126127
return ""
127128
}
128-
129-
var sb strings.Builder
130-
131-
for r := rune(*p); r != 0; r = rune(*p) {
132-
if !utf16.IsSurrogate(r) {
133-
sb.WriteRune(r)
134-
} else {
135-
p = (*uint16)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p)))
136-
sb.WriteRune(utf16.DecodeRune(r, rune(*p)))
137-
138-
if *p == 0 {
139-
break
140-
}
141-
}
142-
143-
p = (*uint16)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p)))
129+
// Find NUL terminator.
130+
n := 0
131+
for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; n++ {
132+
ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p))
144133
}
145134

146-
return sb.String()
135+
var s []uint16
136+
h := (*unsafeheader.Slice)(unsafe.Pointer(&s))
137+
h.Data = unsafe.Pointer(p)
138+
h.Len = n
139+
h.Cap = n
140+
141+
return string(utf16.Decode(s))
147142
}
148143

149144
func Getpagesize() int { return 4096 }

0 commit comments

Comments
 (0)