【问题标题】:capset fails with pointer to structcapset 因指向 struct 的指针而失败
【发布时间】:2013-08-13 06:53:31
【问题描述】:

我有两个代码示例:
一、运行正确:

#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;
}

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

【问题讨论】:

    标签: c struct linux-capabilities


    【解决方案1】:

    很可能是因为结构的初始化方式。当声明一个局部变量时,它的值是indeterminate,使用那个值会导致未定义的行为

    局部结构变量也是如此。成员字段值只是未定义的,所以当你这样做时,例如data.effective &amp;= ~CAP_TO_MASK(CAP_IPC_LOCK); 你为操作使用了一个不确定的(并且看似随机的)值。

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

    struct __user_cap_header_struct hdr = { 0 };
    

    上面会将结构中的所有字段设置为零。

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

    【讨论】:

    • 对。谢谢约阿希姆!
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多