Skip to content

Commit 682dcf7

Browse files
committed
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.
1 parent 1e63810 commit 682dcf7

File tree

2 files changed

+41
-41
lines changed

2 files changed

+41
-41
lines changed

Diff for: unix/pledge_openbsd.go

+16-41
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,27 @@ 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()
23+
err := pledgeAvailable()
2624
if err != nil {
2725
return err
2826
}
2927

30-
err = pledgeAvailable(maj, min, execpromises)
28+
pptr, err := syscall.BytePtrFromString(promises)
3129
if err != nil {
3230
return err
3331
}
3432

35-
pptr, err := syscall.BytePtrFromString(promises)
33+
exptr, err := syscall.BytePtrFromString(execpromises)
3634
if err != nil {
3735
return err
3836
}
39-
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-
}
37+
expr := unsafe.Pointer(exptr)
5238

5339
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
5440
if e != 0 {
@@ -64,12 +50,7 @@ func Pledge(promises, execpromises string) error {
6450
//
6551
// For more information see pledge(2).
6652
func PledgePromises(promises string) error {
67-
maj, min, err := majmin()
68-
if err != nil {
69-
return err
70-
}
71-
72-
err = pledgeAvailable(maj, min, "")
53+
err := pledgeAvailable()
7354
if err != nil {
7455
return err
7556
}
@@ -96,12 +77,7 @@ func PledgePromises(promises string) error {
9677
//
9778
// For more information see pledge(2).
9879
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)
80+
err := pledgeAvailable()
10581
if err != nil {
10682
return err
10783
}
@@ -147,16 +123,15 @@ func majmin() (major int, minor int, err error) {
147123

148124
// pledgeAvailable checks for availability of the pledge(2) syscall
149125
// 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)
126+
func pledgeAvailable() error {
127+
maj, min, err := majmin()
128+
if err != nil {
129+
return err
154130
}
155131

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)
132+
// Require OpenBSD 6.4 as a minimum.
133+
if maj < 6 || (maj == 6 && min <= 3) {
134+
return fmt.Errorf("cannot call Pledge on OpenBSD %d.%d", maj, min)
160135
}
161136

162137
return nil

Diff for: unix/unveil_openbsd.go

+25
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,10 @@ 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+
err := supportsUnveil()
19+
if err != nil {
20+
return err
21+
}
1722
pathPtr, err := syscall.BytePtrFromString(path)
1823
if err != nil {
1924
return err
@@ -32,6 +37,10 @@ func Unveil(path string, flags string) error {
3237
// UnveilBlock blocks future unveil calls.
3338
// For more information see unveil(2).
3439
func UnveilBlock() error {
40+
err := supportsUnveil()
41+
if err != nil {
42+
return err
43+
}
3544
// Both pointers must be nil.
3645
var pathUnsafe, flagsUnsafe unsafe.Pointer
3746
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
@@ -40,3 +49,19 @@ func UnveilBlock() error {
4049
}
4150
return nil
4251
}
52+
53+
// supportsUnveil checks for availability of the unveil(2) system call based
54+
// on the running OpenBSD version.
55+
func supportsUnveil() error {
56+
maj, min, err := majmin()
57+
if err != nil {
58+
return err
59+
}
60+
61+
// unveil is not available before 6.4
62+
if maj < 6 || (maj == 6 && min <= 3) {
63+
return fmt.Errorf("cannot call Unveil on OpenBSD %d.%d", maj, min)
64+
}
65+
66+
return nil
67+
}

0 commit comments

Comments
 (0)