Skip to content

Commit d8c6e85

Browse files
committed
msg/security: Pass kern_ipc_perm not msg_queue into the msg_queue security hooks
All of the implementations of security hooks that take msg_queue only access q_perm the struct kern_ipc_perm member. This means the dependencies of the msg_queue security hooks can be simplified by passing the kern_ipc_perm member of msg_queue. Making this change will allow struct msg_queue to become private to ipc/msg.c. Signed-off-by: "Eric W. Biederman" <[email protected]>
1 parent 7191adf commit d8c6e85

File tree

6 files changed

+62
-65
lines changed

6 files changed

+62
-65
lines changed

include/linux/lsm_hooks.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,13 +1575,13 @@ union security_list_options {
15751575
int (*msg_msg_alloc_security)(struct msg_msg *msg);
15761576
void (*msg_msg_free_security)(struct msg_msg *msg);
15771577

1578-
int (*msg_queue_alloc_security)(struct msg_queue *msq);
1579-
void (*msg_queue_free_security)(struct msg_queue *msq);
1580-
int (*msg_queue_associate)(struct msg_queue *msq, int msqflg);
1581-
int (*msg_queue_msgctl)(struct msg_queue *msq, int cmd);
1582-
int (*msg_queue_msgsnd)(struct msg_queue *msq, struct msg_msg *msg,
1578+
int (*msg_queue_alloc_security)(struct kern_ipc_perm *msq);
1579+
void (*msg_queue_free_security)(struct kern_ipc_perm *msq);
1580+
int (*msg_queue_associate)(struct kern_ipc_perm *msq, int msqflg);
1581+
int (*msg_queue_msgctl)(struct kern_ipc_perm *msq, int cmd);
1582+
int (*msg_queue_msgsnd)(struct kern_ipc_perm *msq, struct msg_msg *msg,
15831583
int msqflg);
1584-
int (*msg_queue_msgrcv)(struct msg_queue *msq, struct msg_msg *msg,
1584+
int (*msg_queue_msgrcv)(struct kern_ipc_perm *msq, struct msg_msg *msg,
15851585
struct task_struct *target, long type,
15861586
int mode);
15871587

include/linux/security.h

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ struct iattr;
5050
struct fown_struct;
5151
struct file_operations;
5252
struct msg_msg;
53-
struct msg_queue;
5453
struct xattr;
5554
struct xfrm_sec_ctx;
5655
struct mm_struct;
@@ -353,13 +352,13 @@ int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag);
353352
void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid);
354353
int security_msg_msg_alloc(struct msg_msg *msg);
355354
void security_msg_msg_free(struct msg_msg *msg);
356-
int security_msg_queue_alloc(struct msg_queue *msq);
357-
void security_msg_queue_free(struct msg_queue *msq);
358-
int security_msg_queue_associate(struct msg_queue *msq, int msqflg);
359-
int security_msg_queue_msgctl(struct msg_queue *msq, int cmd);
360-
int security_msg_queue_msgsnd(struct msg_queue *msq,
355+
int security_msg_queue_alloc(struct kern_ipc_perm *msq);
356+
void security_msg_queue_free(struct kern_ipc_perm *msq);
357+
int security_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg);
358+
int security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd);
359+
int security_msg_queue_msgsnd(struct kern_ipc_perm *msq,
361360
struct msg_msg *msg, int msqflg);
362-
int security_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
361+
int security_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
363362
struct task_struct *target, long type, int mode);
364363
int security_shm_alloc(struct kern_ipc_perm *shp);
365364
void security_shm_free(struct kern_ipc_perm *shp);
@@ -1043,32 +1042,32 @@ static inline int security_msg_msg_alloc(struct msg_msg *msg)
10431042
static inline void security_msg_msg_free(struct msg_msg *msg)
10441043
{ }
10451044

1046-
static inline int security_msg_queue_alloc(struct msg_queue *msq)
1045+
static inline int security_msg_queue_alloc(struct kern_ipc_perm *msq)
10471046
{
10481047
return 0;
10491048
}
10501049

1051-
static inline void security_msg_queue_free(struct msg_queue *msq)
1050+
static inline void security_msg_queue_free(struct kern_ipc_perm *msq)
10521051
{ }
10531052

1054-
static inline int security_msg_queue_associate(struct msg_queue *msq,
1053+
static inline int security_msg_queue_associate(struct kern_ipc_perm *msq,
10551054
int msqflg)
10561055
{
10571056
return 0;
10581057
}
10591058

1060-
static inline int security_msg_queue_msgctl(struct msg_queue *msq, int cmd)
1059+
static inline int security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
10611060
{
10621061
return 0;
10631062
}
10641063

1065-
static inline int security_msg_queue_msgsnd(struct msg_queue *msq,
1064+
static inline int security_msg_queue_msgsnd(struct kern_ipc_perm *msq,
10661065
struct msg_msg *msg, int msqflg)
10671066
{
10681067
return 0;
10691068
}
10701069

1071-
static inline int security_msg_queue_msgrcv(struct msg_queue *msq,
1070+
static inline int security_msg_queue_msgrcv(struct kern_ipc_perm *msq,
10721071
struct msg_msg *msg,
10731072
struct task_struct *target,
10741073
long type, int mode)

ipc/msg.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ static void msg_rcu_free(struct rcu_head *head)
101101
struct kern_ipc_perm *p = container_of(head, struct kern_ipc_perm, rcu);
102102
struct msg_queue *msq = container_of(p, struct msg_queue, q_perm);
103103

104-
security_msg_queue_free(msq);
104+
security_msg_queue_free(&msq->q_perm);
105105
kvfree(msq);
106106
}
107107

@@ -127,7 +127,7 @@ static int newque(struct ipc_namespace *ns, struct ipc_params *params)
127127
msq->q_perm.key = key;
128128

129129
msq->q_perm.security = NULL;
130-
retval = security_msg_queue_alloc(msq);
130+
retval = security_msg_queue_alloc(&msq->q_perm);
131131
if (retval) {
132132
kvfree(msq);
133133
return retval;
@@ -258,9 +258,7 @@ static void freeque(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
258258
*/
259259
static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
260260
{
261-
struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
262-
263-
return security_msg_queue_associate(msq, msgflg);
261+
return security_msg_queue_associate(ipcp, msgflg);
264262
}
265263

266264
SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
@@ -380,7 +378,7 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd,
380378

381379
msq = container_of(ipcp, struct msg_queue, q_perm);
382380

383-
err = security_msg_queue_msgctl(msq, cmd);
381+
err = security_msg_queue_msgctl(&msq->q_perm, cmd);
384382
if (err)
385383
goto out_unlock1;
386384

@@ -502,7 +500,7 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
502500
if (ipcperms(ns, &msq->q_perm, S_IRUGO))
503501
goto out_unlock;
504502

505-
err = security_msg_queue_msgctl(msq, cmd);
503+
err = security_msg_queue_msgctl(&msq->q_perm, cmd);
506504
if (err)
507505
goto out_unlock;
508506

@@ -718,7 +716,7 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
718716

719717
list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) {
720718
if (testmsg(msg, msr->r_msgtype, msr->r_mode) &&
721-
!security_msg_queue_msgrcv(msq, msg, msr->r_tsk,
719+
!security_msg_queue_msgrcv(&msq->q_perm, msg, msr->r_tsk,
722720
msr->r_msgtype, msr->r_mode)) {
723721

724722
list_del(&msr->r_list);
@@ -784,7 +782,7 @@ static long do_msgsnd(int msqid, long mtype, void __user *mtext,
784782
goto out_unlock0;
785783
}
786784

787-
err = security_msg_queue_msgsnd(msq, msg, msgflg);
785+
err = security_msg_queue_msgsnd(&msq->q_perm, msg, msgflg);
788786
if (err)
789787
goto out_unlock0;
790788

@@ -960,7 +958,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
960958

961959
list_for_each_entry(msg, &msq->q_messages, m_list) {
962960
if (testmsg(msg, *msgtyp, mode) &&
963-
!security_msg_queue_msgrcv(msq, msg, current,
961+
!security_msg_queue_msgrcv(&msq->q_perm, msg, current,
964962
*msgtyp, mode)) {
965963
if (mode == SEARCH_LESSEQUAL && msg->m_type != 1) {
966964
*msgtyp = msg->m_type - 1;

security/security.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,33 +1163,33 @@ void security_msg_msg_free(struct msg_msg *msg)
11631163
call_void_hook(msg_msg_free_security, msg);
11641164
}
11651165

1166-
int security_msg_queue_alloc(struct msg_queue *msq)
1166+
int security_msg_queue_alloc(struct kern_ipc_perm *msq)
11671167
{
11681168
return call_int_hook(msg_queue_alloc_security, 0, msq);
11691169
}
11701170

1171-
void security_msg_queue_free(struct msg_queue *msq)
1171+
void security_msg_queue_free(struct kern_ipc_perm *msq)
11721172
{
11731173
call_void_hook(msg_queue_free_security, msq);
11741174
}
11751175

1176-
int security_msg_queue_associate(struct msg_queue *msq, int msqflg)
1176+
int security_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
11771177
{
11781178
return call_int_hook(msg_queue_associate, 0, msq, msqflg);
11791179
}
11801180

1181-
int security_msg_queue_msgctl(struct msg_queue *msq, int cmd)
1181+
int security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
11821182
{
11831183
return call_int_hook(msg_queue_msgctl, 0, msq, cmd);
11841184
}
11851185

1186-
int security_msg_queue_msgsnd(struct msg_queue *msq,
1186+
int security_msg_queue_msgsnd(struct kern_ipc_perm *msq,
11871187
struct msg_msg *msg, int msqflg)
11881188
{
11891189
return call_int_hook(msg_queue_msgsnd, 0, msq, msg, msqflg);
11901190
}
11911191

1192-
int security_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
1192+
int security_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
11931193
struct task_struct *target, long type, int mode)
11941194
{
11951195
return call_int_hook(msg_queue_msgrcv, 0, msq, msg, target, type, mode);

security/selinux/hooks.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5532,52 +5532,52 @@ static void selinux_msg_msg_free_security(struct msg_msg *msg)
55325532
}
55335533

55345534
/* message queue security operations */
5535-
static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
5535+
static int selinux_msg_queue_alloc_security(struct kern_ipc_perm *msq)
55365536
{
55375537
struct ipc_security_struct *isec;
55385538
struct common_audit_data ad;
55395539
u32 sid = current_sid();
55405540
int rc;
55415541

5542-
rc = ipc_alloc_security(&msq->q_perm, SECCLASS_MSGQ);
5542+
rc = ipc_alloc_security(msq, SECCLASS_MSGQ);
55435543
if (rc)
55445544
return rc;
55455545

5546-
isec = msq->q_perm.security;
5546+
isec = msq->security;
55475547

55485548
ad.type = LSM_AUDIT_DATA_IPC;
5549-
ad.u.ipc_id = msq->q_perm.key;
5549+
ad.u.ipc_id = msq->key;
55505550

55515551
rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
55525552
MSGQ__CREATE, &ad);
55535553
if (rc) {
5554-
ipc_free_security(&msq->q_perm);
5554+
ipc_free_security(msq);
55555555
return rc;
55565556
}
55575557
return 0;
55585558
}
55595559

5560-
static void selinux_msg_queue_free_security(struct msg_queue *msq)
5560+
static void selinux_msg_queue_free_security(struct kern_ipc_perm *msq)
55615561
{
5562-
ipc_free_security(&msq->q_perm);
5562+
ipc_free_security(msq);
55635563
}
55645564

5565-
static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
5565+
static int selinux_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
55665566
{
55675567
struct ipc_security_struct *isec;
55685568
struct common_audit_data ad;
55695569
u32 sid = current_sid();
55705570

5571-
isec = msq->q_perm.security;
5571+
isec = msq->security;
55725572

55735573
ad.type = LSM_AUDIT_DATA_IPC;
5574-
ad.u.ipc_id = msq->q_perm.key;
5574+
ad.u.ipc_id = msq->key;
55755575

55765576
return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
55775577
MSGQ__ASSOCIATE, &ad);
55785578
}
55795579

5580-
static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
5580+
static int selinux_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
55815581
{
55825582
int err;
55835583
int perms;
@@ -5602,19 +5602,19 @@ static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
56025602
return 0;
56035603
}
56045604

5605-
err = ipc_has_perm(&msq->q_perm, perms);
5605+
err = ipc_has_perm(msq, perms);
56065606
return err;
56075607
}
56085608

5609-
static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
5609+
static int selinux_msg_queue_msgsnd(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)
56105610
{
56115611
struct ipc_security_struct *isec;
56125612
struct msg_security_struct *msec;
56135613
struct common_audit_data ad;
56145614
u32 sid = current_sid();
56155615
int rc;
56165616

5617-
isec = msq->q_perm.security;
5617+
isec = msq->security;
56185618
msec = msg->security;
56195619

56205620
/*
@@ -5632,7 +5632,7 @@ static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg,
56325632
}
56335633

56345634
ad.type = LSM_AUDIT_DATA_IPC;
5635-
ad.u.ipc_id = msq->q_perm.key;
5635+
ad.u.ipc_id = msq->key;
56365636

56375637
/* Can this process write to the queue? */
56385638
rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
@@ -5649,7 +5649,7 @@ static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg,
56495649
return rc;
56505650
}
56515651

5652-
static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
5652+
static int selinux_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
56535653
struct task_struct *target,
56545654
long type, int mode)
56555655
{
@@ -5659,11 +5659,11 @@ static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
56595659
u32 sid = task_sid(target);
56605660
int rc;
56615661

5662-
isec = msq->q_perm.security;
5662+
isec = msq->security;
56635663
msec = msg->security;
56645664

56655665
ad.type = LSM_AUDIT_DATA_IPC;
5666-
ad.u.ipc_id = msq->q_perm.key;
5666+
ad.u.ipc_id = msq->key;
56675667

56685668
rc = avc_has_perm(sid, isec->sid,
56695669
SECCLASS_MSGQ, MSGQ__READ, &ad);

0 commit comments

Comments
 (0)