capset因指向struct而失败

时间:2013-08-13 06:53:32

标签: c struct linux-capabilities

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

#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的实例) 我不知道为什么。你能救我吗?

1 个答案:

答案 0 :(得分:5)

最有可能的原因是结构是如何初始化的。声明局部变量时,其值为 indeterminate ,使用该值会导致未定义的行为

本地结构变量也是如此。成员字段值是未定义的,因此当您执行此操作时,例如data.effective &= ~CAP_TO_MASK(CAP_IPC_LOCK);您使用不确定(且看似随机)的值进行操作。

在使用之前,您需要将结构初始化为众所周知的值。像

struct __user_cap_header_struct hdr = { 0 };

以上将结构中的所有字段都设置为零。

当您使用new(它是C ++而不是C!)进行分配时,对于没有默认构造函数的结构(或类),所有成员字段都是默认构造,对于整数字段,意味着他们被归零。如果您使用malloc在第一个示例中分配了结构(因为这是分配内存的C方式),那么您将获得与第二个示例相同的结果,因为分配的内存根本不会被初始化。 / p>

相关问题