mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-01 22:57:29 -04:00
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: d03d157e76d1d861fa8bd9be179f9dc4fb91f8d2 GitHub-Pull-Request: golang/sys#177 Reviewed-on: https://go-review.googlesource.com/c/sys/+/537355 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Joel Sing <joel@sing.id.au> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Joel Sing <joel@sing.id.au>
This commit is contained in:
+22
-48
@@ -14,21 +14,13 @@ import (
|
|||||||
|
|
||||||
// Pledge implements the pledge syscall.
|
// Pledge implements the pledge syscall.
|
||||||
//
|
//
|
||||||
// The pledge syscall does not accept execpromises on OpenBSD releases
|
// This changes both the promises and execpromises; use PledgePromises or
|
||||||
// before 6.3.
|
// PledgeExecpromises to only change the promises or execpromises
|
||||||
//
|
// respectively.
|
||||||
// execpromises must be empty when Pledge is called on OpenBSD
|
|
||||||
// releases predating 6.3, otherwise an error will be returned.
|
|
||||||
//
|
//
|
||||||
// For more information see pledge(2).
|
// For more information see pledge(2).
|
||||||
func Pledge(promises, execpromises string) error {
|
func Pledge(promises, execpromises string) error {
|
||||||
maj, min, err := majmin()
|
if err := pledgeAvailable(); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = pledgeAvailable(maj, min, execpromises)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,20 +29,13 @@ func Pledge(promises, execpromises string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// This variable will hold either a nil unsafe.Pointer or
|
exptr, err := syscall.BytePtrFromString(execpromises)
|
||||||
// an unsafe.Pointer to a string (execpromises).
|
if err != nil {
|
||||||
var expr unsafe.Pointer
|
return err
|
||||||
|
|
||||||
// If we're running on OpenBSD > 6.2, pass execpromises to the syscall.
|
|
||||||
if maj > 6 || (maj == 6 && min > 2) {
|
|
||||||
exptr, err := syscall.BytePtrFromString(execpromises)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
expr = unsafe.Pointer(exptr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
|
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)),
|
||||||
|
uintptr(unsafe.Pointer(exptr)), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@@ -64,13 +49,7 @@ func Pledge(promises, execpromises string) error {
|
|||||||
//
|
//
|
||||||
// For more information see pledge(2).
|
// For more information see pledge(2).
|
||||||
func PledgePromises(promises string) error {
|
func PledgePromises(promises string) error {
|
||||||
maj, min, err := majmin()
|
if err := pledgeAvailable(); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = pledgeAvailable(maj, min, "")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +61,8 @@ func PledgePromises(promises string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0)
|
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)),
|
||||||
|
uintptr(expr), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@@ -96,13 +76,7 @@ func PledgePromises(promises string) error {
|
|||||||
//
|
//
|
||||||
// For more information see pledge(2).
|
// For more information see pledge(2).
|
||||||
func PledgeExecpromises(execpromises string) error {
|
func PledgeExecpromises(execpromises string) error {
|
||||||
maj, min, err := majmin()
|
if err := pledgeAvailable(); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = pledgeAvailable(maj, min, execpromises)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +88,8 @@ func PledgeExecpromises(execpromises string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0)
|
_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr),
|
||||||
|
uintptr(unsafe.Pointer(exptr)), 0)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@@ -147,16 +122,15 @@ func majmin() (major int, minor int, err error) {
|
|||||||
|
|
||||||
// pledgeAvailable checks for availability of the pledge(2) syscall
|
// pledgeAvailable checks for availability of the pledge(2) syscall
|
||||||
// based on the running OpenBSD version.
|
// based on the running OpenBSD version.
|
||||||
func pledgeAvailable(maj, min int, execpromises string) error {
|
func pledgeAvailable() error {
|
||||||
// If OpenBSD <= 5.9, pledge is not available.
|
maj, min, err := majmin()
|
||||||
if (maj == 5 && min != 9) || maj < 5 {
|
if err != nil {
|
||||||
return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// If OpenBSD <= 6.2 and execpromises is not empty,
|
// Require OpenBSD 6.4 as a minimum.
|
||||||
// return an error - execpromises is not available before 6.3
|
if maj < 6 || (maj == 6 && min <= 3) {
|
||||||
if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" {
|
return fmt.Errorf("cannot call Pledge on OpenBSD %d.%d", maj, min)
|
||||||
return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
@@ -14,6 +15,9 @@ import (
|
|||||||
// Note that the special case of blocking further
|
// Note that the special case of blocking further
|
||||||
// unveil calls is handled by UnveilBlock.
|
// unveil calls is handled by UnveilBlock.
|
||||||
func Unveil(path string, flags string) error {
|
func Unveil(path string, flags string) error {
|
||||||
|
if err := supportsUnveil(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
pathPtr, err := syscall.BytePtrFromString(path)
|
pathPtr, err := syscall.BytePtrFromString(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -32,6 +36,9 @@ func Unveil(path string, flags string) error {
|
|||||||
// UnveilBlock blocks future unveil calls.
|
// UnveilBlock blocks future unveil calls.
|
||||||
// For more information see unveil(2).
|
// For more information see unveil(2).
|
||||||
func UnveilBlock() error {
|
func UnveilBlock() error {
|
||||||
|
if err := supportsUnveil(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
// Both pointers must be nil.
|
// Both pointers must be nil.
|
||||||
var pathUnsafe, flagsUnsafe unsafe.Pointer
|
var pathUnsafe, flagsUnsafe unsafe.Pointer
|
||||||
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
|
_, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0)
|
||||||
@@ -40,3 +47,19 @@ func UnveilBlock() error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// supportsUnveil checks for availability of the unveil(2) system call based
|
||||||
|
// on the running OpenBSD version.
|
||||||
|
func supportsUnveil() error {
|
||||||
|
maj, min, err := majmin()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// unveil is not available before 6.4
|
||||||
|
if maj < 6 || (maj == 6 && min <= 3) {
|
||||||
|
return fmt.Errorf("cannot call Unveil on OpenBSD %d.%d", maj, min)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user