gpt4 book ai didi

capset 因指向结构的指针而失败

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:32 24 4
gpt4 key购买 nike

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

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

其次,失败:不允许操作:

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

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

最佳答案

很可能是因为结构是如何初始化的。声明局部变量时,它的值是不确定的,使用该值会导致未定义的行为

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

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

struct __user_cap_header_struct hdr = { 0 };

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

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

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

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