@@ -14,41 +14,27 @@ import (
14
14
15
15
// Pledge implements the pledge syscall.
16
16
//
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.
22
20
//
23
21
// For more information see pledge(2).
24
22
func Pledge (promises , execpromises string ) error {
25
- maj , min , err := majmin ()
23
+ err := pledgeAvailable ()
26
24
if err != nil {
27
25
return err
28
26
}
29
27
30
- err = pledgeAvailable ( maj , min , execpromises )
28
+ pptr , err := syscall . BytePtrFromString ( promises )
31
29
if err != nil {
32
30
return err
33
31
}
34
32
35
- pptr , err := syscall .BytePtrFromString (promises )
33
+ exptr , err := syscall .BytePtrFromString (execpromises )
36
34
if err != nil {
37
35
return err
38
36
}
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 )
52
38
53
39
_ , _ , e := syscall .Syscall (SYS_PLEDGE , uintptr (unsafe .Pointer (pptr )), uintptr (expr ), 0 )
54
40
if e != 0 {
@@ -64,12 +50,7 @@ func Pledge(promises, execpromises string) error {
64
50
//
65
51
// For more information see pledge(2).
66
52
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 ()
73
54
if err != nil {
74
55
return err
75
56
}
@@ -96,12 +77,7 @@ func PledgePromises(promises string) error {
96
77
//
97
78
// For more information see pledge(2).
98
79
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 ()
105
81
if err != nil {
106
82
return err
107
83
}
@@ -147,16 +123,15 @@ func majmin() (major int, minor int, err error) {
147
123
148
124
// pledgeAvailable checks for availability of the pledge(2) syscall
149
125
// 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
154
130
}
155
131
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 )
160
135
}
161
136
162
137
return nil
0 commit comments