Skip to content

Commit 249e16f

Browse files
jrick4a6f656c
authored andcommitted
unix: require minimum OpenBSD 6.4 for pledge, unveil
OpenBSD 7.3 and 7.4 are the only supported OpenBSD releases. This change simplifies the version detection and error handling to require at least OpenBSD 6.4 to call the Pledge and Unveil functions. Updates golang/go#63569. Change-Id: I6bd0d58807a73a532ddd2d3239687ca19a93db9d GitHub-Last-Rev: d03d157 GitHub-Pull-Request: #177 Reviewed-on: https://go-review.googlesource.com/c/sys/+/537355 TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Joel Sing <[email protected]> Reviewed-by: David Chase <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Joel Sing <[email protected]>
1 parent 1e63810 commit 249e16f

File tree

2 files changed

+44
-47
lines changed

2 files changed

+44
-47
lines changed

Diff for: unix/pledge_openbsd.go

+21-47
Original file line numberDiff line numberDiff line change
@@ -14,43 +14,28 @@ import (
1414

1515
// Pledge implements the pledge syscall.
1616
//
17-
// The pledge syscall does not accept execpromises on OpenBSD releases
18-
// before 6.3.
19-
//
20-
// execpromises must be empty when Pledge is called on OpenBSD
21-
// releases predating 6.3, otherwise an error will be returned.
17+
// This changes both the promises and execpromises; use PledgePromises or
18+
// PledgeExecpromises to only change the promises or execpromises
19+
// respectively.
2220
//
2321
// For more information see pledge(2).
2422
func Pledge(promises, execpromises string) error {
25-
maj, min, err := majmin()
26-
if err != nil {
23+
if err := pledgeAvailable(); err != nil {
2724
return err
2825
}
2926

30-
err = pledgeAvailable(maj, min, execpromises)
27+
pptr, err := syscall.BytePtrFromString(promises)
3128
if err != nil {
3229
return err
3330
}
3431

35-
pptr, err := syscall.BytePtrFromString(promises)
32+
exptr, err := syscall.BytePtrFromString(execpromises)
3633
if err != nil {
3734
return err
3835
}
3936

40-
// This variable will hold either a nil unsafe.Pointer or
41-
// an unsafe.Pointer to a string (execpromises).
42-
var expr unsafe.Pointer
43-
44-
// If we're running on OpenBSD > 6.2, pass execpromises to the syscall.
45-
if maj > 6 || (maj == 6 && min > 2) {
46-
exptr, err := syscall.BytePtrFromString(execpromises)
47-
if err != nil {
48-
return err
49-
}
50-
expr = unsafe.Pointer(exptr)
51-
}
52-
53-
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
37+
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)),
38+
uintptr(unsafe.Pointer(exptr)), 0)
5439
if e != 0 {
5540
return e
5641
}
@@ -64,13 +49,7 @@ func Pledge(promises, execpromises string) error {
6449
//
6550
// For more information see pledge(2).
6651
func PledgePromises(promises string) error {
67-
maj, min, err := majmin()
68-
if err != nil {
69-
return err
70-
}
71-
72-
err = pledgeAvailable(maj, min, "")
73-
if err != nil {
52+
if err := pledgeAvailable(); err != nil {
7453
return err
7554
}
7655

@@ -82,7 +61,8 @@ func PledgePromises(promises string) error {
8261
return err
8362
}
8463

85-
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
64+
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)),
65+
uintptr(expr), 0)
8666
if e != 0 {
8767
return e
8868
}
@@ -96,13 +76,7 @@ func PledgePromises(promises string) error {
9676
//
9777
// For more information see pledge(2).
9878
func PledgeExecpromises(execpromises string) error {
99-
maj, min, err := majmin()
100-
if err != nil {
101-
return err
102-
}
103-
104-
err = pledgeAvailable(maj, min, execpromises)
105-
if err != nil {
79+
if err := pledgeAvailable(); err != nil {
10680
return err
10781
}
10882

@@ -114,7 +88,8 @@ func PledgeExecpromises(execpromises string) error {
11488
return err
11589
}
11690

117-
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0)
91+
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr),
92+
uintptr(unsafe.Pointer(exptr)), 0)
11893
if e != 0 {
11994
return e
12095
}
@@ -147,16 +122,15 @@ func majmin() (major int, minor int, err error) {
147122

148123
// pledgeAvailable checks for availability of the pledge(2) syscall
149124
// based on the running OpenBSD version.
150-
func pledgeAvailable(maj, min int, execpromises string) error {
151-
// If OpenBSD <= 5.9, pledge is not available.
152-
if (maj == 5 && min != 9) || maj < 5 {
153-
return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min)
125+
func pledgeAvailable() error {
126+
maj, min, err := majmin()
127+
if err != nil {
128+
return err
154129
}
155130

156-
// If OpenBSD <= 6.2 and execpromises is not empty,
157-
// return an error - execpromises is not available before 6.3
158-
if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" {
159-
return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min)
131+
// Require OpenBSD 6.4 as a minimum.
132+
if maj < 6 || (maj == 6 && min <= 3) {
133+
return fmt.Errorf("cannot call Pledge on OpenBSD %d.%d", maj, min)
160134
}
161135

162136
return nil

Diff for: unix/unveil_openbsd.go

+23
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package unix
66

77
import (
8+
"fmt"
89
"syscall"
910
"unsafe"
1011
)
@@ -14,6 +15,9 @@ import (
1415
// Note that the special case of blocking further
1516
// unveil calls is handled by UnveilBlock.
1617
func Unveil(path string, flags string) error {
18+
if err := supportsUnveil(); err != nil {
19+
return err
20+
}
1721
pathPtr, err := syscall.BytePtrFromString(path)
1822
if err != nil {
1923
return err
@@ -32,6 +36,9 @@ func Unveil(path string, flags string) error {
3236
// UnveilBlock blocks future unveil calls.
3337
// For more information see unveil(2).
3438
func UnveilBlock() error {
39+
if err := supportsUnveil(); err != nil {
40+
return err
41+
}
3542
// Both pointers must be nil.
3643
var pathUnsafe, flagsUnsafe unsafe.Pointer
3744
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
@@ -40,3 +47,19 @@ func UnveilBlock() error {
4047
}
4148
return nil
4249
}
50+
51+
// supportsUnveil checks for availability of the unveil(2) system call based
52+
// on the running OpenBSD version.
53+
func supportsUnveil() error {
54+
maj, min, err := majmin()
55+
if err != nil {
56+
return err
57+
}
58+
59+
// unveil is not available before 6.4
60+
if maj < 6 || (maj == 6 && min <= 3) {
61+
return fmt.Errorf("cannot call Unveil on OpenBSD %d.%d", maj, min)
62+
}
63+
64+
return nil
65+
}

0 commit comments

Comments
 (0)