Skip to content

Commit 61a1dcd

Browse files
cschauflerpcmoore
authored andcommitted
lsm: infrastructure management of the perf_event security blob
Move management of the perf_event->security blob out of the individual security modules and into the security infrastructure. Instead of allocating the blobs from within the modules the modules tell the infrastructure how much space is required, and the space is allocated there. There are no longer any modules that require the perf_event_free() hook. The hook definition has been removed. Signed-off-by: Casey Schaufler <[email protected]> Reviewed-by: John Johansen <[email protected]> [PM: subject tweak] Signed-off-by: Paul Moore <[email protected]>
1 parent 66de33a commit 61a1dcd

File tree

5 files changed

+29
-17
lines changed

5 files changed

+29
-17
lines changed

include/linux/lsm_hook_defs.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,6 @@ LSM_HOOK(int, 0, locked_down, enum lockdown_reason what)
439439
#ifdef CONFIG_PERF_EVENTS
440440
LSM_HOOK(int, 0, perf_event_open, struct perf_event_attr *attr, int type)
441441
LSM_HOOK(int, 0, perf_event_alloc, struct perf_event *event)
442-
LSM_HOOK(void, LSM_RET_VOID, perf_event_free, struct perf_event *event)
443442
LSM_HOOK(int, 0, perf_event_read, struct perf_event *event)
444443
LSM_HOOK(int, 0, perf_event_write, struct perf_event *event)
445444
#endif /* CONFIG_PERF_EVENTS */

include/linux/lsm_hooks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ struct lsm_blob_sizes {
7979
int lbs_ipc;
8080
int lbs_key;
8181
int lbs_msg_msg;
82+
int lbs_perf_event;
8283
int lbs_task;
8384
int lbs_xattr_count; /* number of xattr slots in new_xattrs array */
8485
int lbs_tun_dev;

security/security.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <linux/xattr.h>
2929
#include <linux/msg.h>
3030
#include <linux/overflow.h>
31+
#include <linux/perf_event.h>
3132
#include <net/flow.h>
3233
#include <net/sock.h>
3334

@@ -230,6 +231,7 @@ static void __init lsm_set_blob_sizes(struct lsm_blob_sizes *needed)
230231
lsm_set_blob_size(&needed->lbs_ipc, &blob_sizes.lbs_ipc);
231232
lsm_set_blob_size(&needed->lbs_key, &blob_sizes.lbs_key);
232233
lsm_set_blob_size(&needed->lbs_msg_msg, &blob_sizes.lbs_msg_msg);
234+
lsm_set_blob_size(&needed->lbs_perf_event, &blob_sizes.lbs_perf_event);
233235
lsm_set_blob_size(&needed->lbs_sock, &blob_sizes.lbs_sock);
234236
lsm_set_blob_size(&needed->lbs_superblock, &blob_sizes.lbs_superblock);
235237
lsm_set_blob_size(&needed->lbs_task, &blob_sizes.lbs_task);
@@ -412,6 +414,7 @@ static void __init ordered_lsm_init(void)
412414
init_debug("msg_msg blob size = %d\n", blob_sizes.lbs_msg_msg);
413415
init_debug("sock blob size = %d\n", blob_sizes.lbs_sock);
414416
init_debug("superblock blob size = %d\n", blob_sizes.lbs_superblock);
417+
init_debug("perf event blob size = %d\n", blob_sizes.lbs_perf_event);
415418
init_debug("task blob size = %d\n", blob_sizes.lbs_task);
416419
init_debug("tun device blob size = %d\n", blob_sizes.lbs_tun_dev);
417420
init_debug("xattr slots = %d\n", blob_sizes.lbs_xattr_count);
@@ -5685,7 +5688,19 @@ int security_perf_event_open(struct perf_event_attr *attr, int type)
56855688
*/
56865689
int security_perf_event_alloc(struct perf_event *event)
56875690
{
5688-
return call_int_hook(perf_event_alloc, event);
5691+
int rc;
5692+
5693+
rc = lsm_blob_alloc(&event->security, blob_sizes.lbs_perf_event,
5694+
GFP_KERNEL);
5695+
if (rc)
5696+
return rc;
5697+
5698+
rc = call_int_hook(perf_event_alloc, event);
5699+
if (rc) {
5700+
kfree(event->security);
5701+
event->security = NULL;
5702+
}
5703+
return rc;
56895704
}
56905705

56915706
/**
@@ -5696,7 +5711,8 @@ int security_perf_event_alloc(struct perf_event *event)
56965711
*/
56975712
void security_perf_event_free(struct perf_event *event)
56985713
{
5699-
call_void_hook(perf_event_free, event);
5714+
kfree(event->security);
5715+
event->security = NULL;
57005716
}
57015717

57025718
/**

security/selinux/hooks.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6955,6 +6955,9 @@ struct lsm_blob_sizes selinux_blob_sizes __ro_after_init = {
69556955
.lbs_ipc = sizeof(struct ipc_security_struct),
69566956
.lbs_key = sizeof(struct key_security_struct),
69576957
.lbs_msg_msg = sizeof(struct msg_security_struct),
6958+
#ifdef CONFIG_PERF_EVENTS
6959+
.lbs_perf_event = sizeof(struct perf_event_security_struct),
6960+
#endif
69586961
.lbs_sock = sizeof(struct sk_security_struct),
69596962
.lbs_superblock = sizeof(struct superblock_security_struct),
69606963
.lbs_xattr_count = SELINUX_INODE_INIT_XATTRS,
@@ -6986,24 +6989,12 @@ static int selinux_perf_event_alloc(struct perf_event *event)
69866989
{
69876990
struct perf_event_security_struct *perfsec;
69886991

6989-
perfsec = kzalloc(sizeof(*perfsec), GFP_KERNEL);
6990-
if (!perfsec)
6991-
return -ENOMEM;
6992-
6992+
perfsec = selinux_perf_event(event->security);
69936993
perfsec->sid = current_sid();
6994-
event->security = perfsec;
69956994

69966995
return 0;
69976996
}
69986997

6999-
static void selinux_perf_event_free(struct perf_event *event)
7000-
{
7001-
struct perf_event_security_struct *perfsec = event->security;
7002-
7003-
event->security = NULL;
7004-
kfree(perfsec);
7005-
}
7006-
70076998
static int selinux_perf_event_read(struct perf_event *event)
70086999
{
70097000
struct perf_event_security_struct *perfsec = event->security;
@@ -7316,7 +7307,6 @@ static struct security_hook_list selinux_hooks[] __ro_after_init = {
73167307

73177308
#ifdef CONFIG_PERF_EVENTS
73187309
LSM_HOOK_INIT(perf_event_open, selinux_perf_event_open),
7319-
LSM_HOOK_INIT(perf_event_free, selinux_perf_event_free),
73207310
LSM_HOOK_INIT(perf_event_read, selinux_perf_event_read),
73217311
LSM_HOOK_INIT(perf_event_write, selinux_perf_event_write),
73227312
#endif

security/selinux/include/objsec.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,10 @@ static inline struct ib_security_struct *selinux_ib(void *ib_sec)
217217
return ib_sec + selinux_blob_sizes.lbs_ib;
218218
}
219219

220+
static inline struct perf_event_security_struct *
221+
selinux_perf_event(void *perf_event)
222+
{
223+
return perf_event + selinux_blob_sizes.lbs_perf_event;
224+
}
225+
220226
#endif /* _SELINUX_OBJSEC_H_ */

0 commit comments

Comments
 (0)