我有两个代码示例:
首先,正确运行:

#include <sys/capability.h>
#include <unistd.h>
#include <cstdio>

int main()
{
    __user_cap_header_struct *hdr = new __user_cap_header_struct;
    __user_cap_data_struct *data = new __user_cap_data_struct;
    hdr->pid = getpid();
    hdr->version = _LINUX_CAPABILITY_VERSION;
    data->effective &= ~CAP_TO_MASK(CAP_IPC_LOCK);
    data->permitted &= ~CAP_TO_MASK(CAP_IPC_LOCK);
    data->inheritable = 0;
    if (capset(hdr, data) < 0)
        printf("capset failed: %m");

    return 0
}

其次,fail: Operation not permitted
#include <sys/capability.h>
#include <unistd.h>
#include <cstdio>

int main()
{
    struct __user_cap_header_struct hdr;
    hdr.pid = getpid();
    hdr.version = _LINUX_CAPABILITY_VERSION;
    struct __user_cap_data_struct data;
    data.effective &= ~CAP_TO_MASK(CAP_IPC_LOCK);
    data.permitted &= ~CAP_TO_MASK(CAP_IPC_LOCK);
    if(capset(&hdr, &data))
        printf("capset failed: %m");

    return 0;
}

我认为两个代码示例都是相同的。
当我运行第一个时,它会正确执行(使用指向struct的指针)。
但第二个失败(使用struct的实例)。
我不知道为什么你能帮助我吗?

最佳答案

很可能是因为结构是如何初始化的声明局部变量时,其值是不确定的,使用该值将导致未定义的行为。
局部结构变量也是如此成员字段值只是未定义的,因此当您这样做时(例如data.effective &= ~CAP_TO_MASK(CAP_IPC_LOCK);时),您将使用一个不确定的(看起来是随机的)值进行操作。
在使用该结构之前,需要将其初始化为一个众所周知的值喜欢

struct __user_cap_header_struct hdr = { 0 };

上面将把结构中的所有字段设置为零。
当你分配给new(这是C++而不是C!)然后对于没有默认构造函数的结构(或类),所有成员字段都是默认构造的,而对于整型字段,这意味着它们是零的。如果您使用malloc分配第一个示例中的结构(因为这是分配内存的C方式),那么您将得到与第二个示例相同的结果,因为这样分配的内存根本不会初始化。

关于c - capset失败,指向结构的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18202504/

10-17 02:48