我一直在尝试对FreeBSD的jail_set进行系统调用,但没有成功。
它在接收syscall时使用了一个iovec数组,但总是返回一个"Bad Address“。
下面是创建IOVEC的代码部分:
func (p Params) buildIovec() ([]unix.Iovec, error) {
iovSize := len(p) * 2
iovec := make([]unix.Iovec, iovSize)
var itr int
for paramKey, paramValue := range p {
arrayParamKey := []byte(paramKey)
// Adds a nullbyte
// Jail parameters are passed as an array
// of name-value pairs in the array iov, containing niov
// elements. Parameter names are a null-terminated
// string, and values may be strings, integers,
// or other arbitrary data.
// Ref: https://www.freebsd.org/cgi/man.cgi?query=jail&sektion=3&manpath=FreeBSD+11.1-stable
arrayParamKey = append(arrayParamKey, 0)
size := len(arrayParamKey)
iovec[itr] = unix.Iovec{
Base: (*byte)(unsafe.Pointer(&arrayParamKey)),
Len: uint64(size),
}
itr++
rv := reflect.ValueOf(paramValue)
var arrayValueBytes []byte
switch rv.Kind() {
case reflect.String:
arrayValueBytes = []byte(rv.String())
arrayValueBytes = append(arrayValueBytes, 0)
if err != nil {
return nil, err
}
default:
return nil, errors.New("invalid value passed in for key: " + paramKey)
}
arrayValueSize := len(arrayValueBytes)
iovec[itr] = unix.Iovec{
Base: (*byte)(unsafe.Pointer(&arrayValueBytes)),
Len: uint64(arrayValueSize),
}
itr++
}
return iovec, nil
}然后使用以下命令调用syscall:
_, _, e1 := unix.Syscall(uintptr(call), uintptr(unsafe.Pointer(&iov)), uintptr(len(iov)), flags)其中call表示jail_set int标志,而507是1的uintptr (表示创建)。
另外,Params是一个映射字符串接口{},其中键是监狱配置的键,值是配置的值(这解释了buildIovec中的循环)。
这是基于https://github.com/briandowns/jail的,但我一直在更改一些东西,看看它是否能工作。
谢谢。
发布于 2020-12-09 22:53:30
您的值传递的是字节切片的切片标题的地址,而不是实际字节开始的地址。
[]byte(rv.String())将创建一个较小的切片标题。
unsafe.Pointer(C.CString(rv.String()))可能会让你更接近正常工作的代码。
https://stackoverflow.com/questions/65209964
复制相似问题