POSIX消息队列权限被拒绝的问题

时间:2019-02-17 06:42:26

标签: unix posix ipc message-queue

我有一个server.c程序正在初始化具有以下权限的消息队列:

#define SERVER "/serverqueue"
...
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = MAX_MSGS;
attr.mq_msgsize = MAX_MSG_SIZE;
attr.mq_curmsgs = 0;
server = mq_open(SERVER, O_RDWR | O_CREAT, 666, &attr)
...

在第一次运行中,mq_open()成功,并且程序没有错误退出。在随后的执行中,我在Permission denied处遇到mq_open()错误。为什么会这样?
如果相关,我不会显式关闭/取消链接消息队列描述符,因为如果我没记错的话,操作系统会在程序退出时自动关闭/取消链接

1 个答案:

答案 0 :(得分:1)

消息队列在进程退出后仍然存在。第二次创建尝试失败的原因是,您将模式指定为666,这导致了相当奇怪的权限:

$ ls -l /dev/mqueue/serverqueue
--w--wx--T. 1 fw fw 80 Feb 17 13:13 serverqueue

没有读取权限,因此使用O_RDWR打开失败。

此外,由于队列名称是共享资源,因此如果使用O_CREAT而不是O_CREAT | O_EXCL创建队列,通常会导致安全漏洞。另一个用户可以使用不同的权限创建相同的队列,从而获得对您要对该队列执行的操作的权限。

相关问题