2 つのコード サンプルがあります。
まず、正しく実行されます。
#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;
}
どちらのコード サンプルも同じだと思います。
最初のものを実行すると、正しく実行されます(構造体へのポインターを使用します)。
しかし、2 番目は失敗します (構造体のインスタンスを使用します)。
どうしてか分かりません。手伝って頂けますか?