gpt4 book ai didi

go - Go,FreeBSD,iovec和syscalls

转载 作者:行者123 更新时间:2023-12-03 10:09:17 33 4
gpt4 key购买 nike

我一直在尝试对FreeBSD的jail_set进行系统调用,但没有成功。
收到系统调用时,它使用iovec数组,但始终返回“错误地址”。
这是创建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,并且flags的uintptr为1(表示CREATE)。
另外,Params是map [string] interface {},其中的键是jail配置的键,而值是配置的值(这解释了buildIovec中的循环)。
这基于 https://github.com/briandowns/jail,但我一直在进行一些更改以查看其是否有效。
谢谢。

最佳答案

您的值传递的是 byte slice 的片头的地址,而不是实际字节开始的地址。[]byte(rv.String())将创建一个小 slice header 。unsafe.Pointer(C.CString(rv.String()))可能会使您更接近有效的代码。

关于go - Go,FreeBSD,iovec和syscalls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65209964/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com