Commit e0e258c3 authored by Kinsbursky Stanislav's avatar Kinsbursky Stanislav Committed by Pavel Emelyanov

ipc: restore IPC objects credentials

This part was lost after update to "sysctl" interface for IPC object ID
specifying (previous, currently obsolete, interface was able to pass proper
credentials with KEY change) .
Signed-off-by: 's avatarStanislav Kinsbursky <skinsbursky@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent dae5f928
......@@ -549,6 +549,7 @@ static int prepare_ipc_sem_desc(int fd, const IpcSemEntry *sem)
{ "kernel/sem_next_id", &sem->desc->id, CTL_U32 },
{ },
};
struct semid_ds semid;
ret = sysctl_op(req, CTL_WRITE);
if (ret < 0) {
......@@ -569,6 +570,21 @@ static int prepare_ipc_sem_desc(int fd, const IpcSemEntry *sem)
return -EFAULT;
}
ret = semctl(id, sem->nsems, IPC_STAT, &semid);
if (ret == -1) {
pr_err("Failed to get sem stat structure\n");
return -EFAULT;
}
semid.sem_perm.uid = sem->desc->uid;
semid.sem_perm.gid = sem->desc->gid;
ret = semctl(id, sem->nsems, IPC_SET, &semid);
if (ret == -1) {
pr_err("Failed to set sem uid and gid\n");
return -EFAULT;
}
ret = prepare_ipc_sem_values(fd, sem);
if (ret < 0) {
pr_err("Failed to update sem pages\n");
......@@ -667,6 +683,7 @@ static int prepare_ipc_msg_queue(int fd, const IpcMsgEntry *msq)
{ "kernel/msg_next_id", &msq->desc->id, CTL_U32 },
{ },
};
struct msqid_ds msqid;
ret = sysctl_op(req, CTL_WRITE);
if (ret < 0) {
......@@ -686,6 +703,21 @@ static int prepare_ipc_msg_queue(int fd, const IpcMsgEntry *msq)
return -EFAULT;
}
ret = msgctl(id, IPC_STAT, &msqid);
if (ret == -1) {
pr_err("Failed to get msq stat structure\n");
return -EFAULT;
}
msqid.msg_perm.uid = msq->desc->uid;
msqid.msg_perm.gid = msq->desc->gid;
ret = msgctl(id, IPC_SET, &msqid);
if (ret == -1) {
pr_err("Failed to set msq queue uid and gid\n");
return -EFAULT;
}
ret = prepare_ipc_msg_queue_messages(fd, msq);
if (ret < 0) {
pr_err("Failed to update message queue messages\n");
......@@ -760,6 +792,7 @@ static int prepare_ipc_shm_seg(int fd, const IpcShmEntry *shm)
{ "kernel/shm_next_id", &shm->desc->id, CTL_U32 },
{ },
};
struct shmid_ds shmid;
ret = sysctl_op(req, CTL_WRITE);
if (ret < 0) {
......@@ -780,6 +813,21 @@ static int prepare_ipc_shm_seg(int fd, const IpcShmEntry *shm)
return -EFAULT;
}
ret = shmctl(id, IPC_STAT, &shmid);
if (ret == -1) {
pr_err("Failed to get shm stat structure\n");
return -EFAULT;
}
shmid.shm_perm.uid = shm->desc->uid;
shmid.shm_perm.gid = shm->desc->gid;
ret = shmctl(id, IPC_SET, &shmid);
if (ret == -1) {
pr_err("Failed to set shm uid and gid\n");
return -EFAULT;
}
ret = prepare_ipc_shm_pages(fd, shm);
if (ret < 0) {
pr_err("Failed to update shm pages\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment