Skip to content

Commit 661d749

Browse files
jrick4a6f656c
authored andcommitted
unix: use libc stubs for OpenBSD pledge+unveil
Future OpenBSD releases will remove the syscall(2) interface. This converts the Pledge and Unveil calls to use pledge(2) and unveil(2) from libc, rather than indirectly through syscall(2). Updates golang/go#63900. Change-Id: I61e22d8f52f16c8f5e4c0717acae0d5bf4271503 GitHub-Last-Rev: ebc0461 GitHub-Pull-Request: #146 Reviewed-on: https://go-review.googlesource.com/c/sys/+/468095 Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Mauri de Souza Meneguzzo <[email protected]> Reviewed-by: Joel Sing <[email protected]> Reviewed-by: Tobias Klauser <[email protected]> Run-TryBot: Joel Sing <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Aaron Bieber <[email protected]> Reviewed-by: Bryan Mills <[email protected]>
1 parent 1168e25 commit 661d749

17 files changed

+296
-52
lines changed

Diff for: unix/pledge_openbsd.go

+7-33
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"errors"
99
"fmt"
1010
"strconv"
11-
"syscall"
12-
"unsafe"
1311
)
1412

1513
// Pledge implements the pledge syscall.
@@ -24,23 +22,17 @@ func Pledge(promises, execpromises string) error {
2422
return err
2523
}
2624

27-
pptr, err := syscall.BytePtrFromString(promises)
25+
pptr, err := BytePtrFromString(promises)
2826
if err != nil {
2927
return err
3028
}
3129

32-
exptr, err := syscall.BytePtrFromString(execpromises)
30+
exptr, err := BytePtrFromString(execpromises)
3331
if err != nil {
3432
return err
3533
}
3634

37-
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)),
38-
uintptr(unsafe.Pointer(exptr)), 0)
39-
if e != 0 {
40-
return e
41-
}
42-
43-
return nil
35+
return pledge(pptr, exptr)
4436
}
4537

4638
// PledgePromises implements the pledge syscall.
@@ -53,21 +45,12 @@ func PledgePromises(promises string) error {
5345
return err
5446
}
5547

56-
// This variable holds the execpromises and is always nil.
57-
var expr unsafe.Pointer
58-
59-
pptr, err := syscall.BytePtrFromString(promises)
48+
pptr, err := BytePtrFromString(promises)
6049
if err != nil {
6150
return err
6251
}
6352

64-
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)),
65-
uintptr(expr), 0)
66-
if e != 0 {
67-
return e
68-
}
69-
70-
return nil
53+
return pledge(pptr, nil)
7154
}
7255

7356
// PledgeExecpromises implements the pledge syscall.
@@ -80,21 +63,12 @@ func PledgeExecpromises(execpromises string) error {
8063
return err
8164
}
8265

83-
// This variable holds the promises and is always nil.
84-
var pptr unsafe.Pointer
85-
86-
exptr, err := syscall.BytePtrFromString(execpromises)
66+
exptr, err := BytePtrFromString(execpromises)
8767
if err != nil {
8868
return err
8969
}
9070

91-
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr),
92-
uintptr(unsafe.Pointer(exptr)), 0)
93-
if e != 0 {
94-
return e
95-
}
96-
97-
return nil
71+
return pledge(nil, exptr)
9872
}
9973

10074
// majmin returns major and minor version number for an OpenBSD system.

Diff for: unix/syscall_openbsd.go

+2
Original file line numberDiff line numberDiff line change
@@ -327,3 +327,5 @@ func Uname(uname *Utsname) error {
327327
//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
328328
//sys munmap(addr uintptr, length uintptr) (err error)
329329
//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
330+
//sys pledge(promises *byte, execpromises *byte) (err error)
331+
//sys unveil(path *byte, flags *byte) (err error)

Diff for: unix/unveil_openbsd.go

+5-19
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44

55
package unix
66

7-
import (
8-
"fmt"
9-
"syscall"
10-
"unsafe"
11-
)
7+
import "fmt"
128

139
// Unveil implements the unveil syscall.
1410
// For more information see unveil(2).
@@ -18,19 +14,15 @@ func Unveil(path string, flags string) error {
1814
if err := supportsUnveil(); err != nil {
1915
return err
2016
}
21-
pathPtr, err := syscall.BytePtrFromString(path)
17+
pathPtr, err := BytePtrFromString(path)
2218
if err != nil {
2319
return err
2420
}
25-
flagsPtr, err := syscall.BytePtrFromString(flags)
21+
flagsPtr, err := BytePtrFromString(flags)
2622
if err != nil {
2723
return err
2824
}
29-
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(flagsPtr)), 0)
30-
if e != 0 {
31-
return e
32-
}
33-
return nil
25+
return unveil(pathPtr, flagsPtr)
3426
}
3527

3628
// UnveilBlock blocks future unveil calls.
@@ -39,13 +31,7 @@ func UnveilBlock() error {
3931
if err := supportsUnveil(); err != nil {
4032
return err
4133
}
42-
// Both pointers must be nil.
43-
var pathUnsafe, flagsUnsafe unsafe.Pointer
44-
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
45-
if e != 0 {
46-
return e
47-
}
48-
return nil
34+
return unveil(nil, nil)
4935
}
5036

5137
// supportsUnveil checks for availability of the unveil(2) system call based

Diff for: unix/zsyscall_openbsd_386.go

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: unix/zsyscall_openbsd_386.s

+10
Original file line numberDiff line numberDiff line change
@@ -672,3 +672,13 @@ TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
672672
JMP libc_utimensat(SB)
673673
GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4
674674
DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB)
675+
676+
TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0
677+
JMP libc_pledge(SB)
678+
GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $4
679+
DATA ·libc_pledge_trampoline_addr(SB)/4, $libc_pledge_trampoline<>(SB)
680+
681+
TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0
682+
JMP libc_unveil(SB)
683+
GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $4
684+
DATA ·libc_unveil_trampoline_addr(SB)/4, $libc_unveil_trampoline<>(SB)

Diff for: unix/zsyscall_openbsd_amd64.go

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: unix/zsyscall_openbsd_amd64.s

+10
Original file line numberDiff line numberDiff line change
@@ -672,3 +672,13 @@ TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
672672
JMP libc_utimensat(SB)
673673
GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8
674674
DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
675+
676+
TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0
677+
JMP libc_pledge(SB)
678+
GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8
679+
DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB)
680+
681+
TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0
682+
JMP libc_unveil(SB)
683+
GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8
684+
DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB)

Diff for: unix/zsyscall_openbsd_arm.go

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: unix/zsyscall_openbsd_arm.s

+10
Original file line numberDiff line numberDiff line change
@@ -672,3 +672,13 @@ TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
672672
JMP libc_utimensat(SB)
673673
GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4
674674
DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB)
675+
676+
TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0
677+
JMP libc_pledge(SB)
678+
GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $4
679+
DATA ·libc_pledge_trampoline_addr(SB)/4, $libc_pledge_trampoline<>(SB)
680+
681+
TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0
682+
JMP libc_unveil(SB)
683+
GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $4
684+
DATA ·libc_unveil_trampoline_addr(SB)/4, $libc_unveil_trampoline<>(SB)

Diff for: unix/zsyscall_openbsd_arm64.go

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: unix/zsyscall_openbsd_arm64.s

+10
Original file line numberDiff line numberDiff line change
@@ -672,3 +672,13 @@ TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
672672
JMP libc_utimensat(SB)
673673
GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8
674674
DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
675+
676+
TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0
677+
JMP libc_pledge(SB)
678+
GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8
679+
DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB)
680+
681+
TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0
682+
JMP libc_unveil(SB)
683+
GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8
684+
DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB)

Diff for: unix/zsyscall_openbsd_mips64.go

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: unix/zsyscall_openbsd_mips64.s

+10
Original file line numberDiff line numberDiff line change
@@ -672,3 +672,13 @@ TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0
672672
JMP libc_utimensat(SB)
673673
GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8
674674
DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB)
675+
676+
TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0
677+
JMP libc_pledge(SB)
678+
GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8
679+
DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB)
680+
681+
TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0
682+
JMP libc_unveil(SB)
683+
GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8
684+
DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB)

0 commit comments

Comments
 (0)