首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go、FreeBSD、iovec和syscalls

Go、FreeBSD、iovec和syscalls
EN

Stack Overflow用户
提问于 2020-12-09 10:54:18
回答 1查看 70关注 0票数 1

我一直在尝试对FreeBSD的jail_set进行系统调用,但没有成功。

它在接收syscall时使用了一个iovec数组,但总是返回一个"Bad Address“。

下面是创建IOVEC的代码部分:

代码语言:javascript
复制
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:

代码语言:javascript
复制
    _, _, 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的,但我一直在更改一些东西,看看它是否能工作。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-12-09 22:53:30

您的值传递的是字节切片的切片标题的地址,而不是实际字节开始的地址。

[]byte(rv.String())将创建一个较小的切片标题。

unsafe.Pointer(C.CString(rv.String()))可能会让你更接近正常工作的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65209964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档