summaryrefslogtreecommitdiff
path: root/security/apparmor
diff options
context:
space:
mode:
authorPaul Moore <paul@paul-moore.com>2023-10-24 14:44:00 -0400
committerPaul Moore <paul@paul-moore.com>2023-11-12 22:54:42 -0500
commitd7cf3412a9f6c547e5ee443fa7644e08898aa3e2 (patch)
treef5ab0f4687f6d7efae5ac221906a18ddf3b11330 /security/apparmor
parentfdcf699b60712ecd6e41d9fc09137279257a4bf8 (diff)
lsm: consolidate buffer size handling into lsm_fill_user_ctx()
While we have a lsm_fill_user_ctx() helper function designed to make life easier for LSMs which return lsm_ctx structs to userspace, we didn't include all of the buffer length safety checks and buffer padding adjustments in the helper. This led to code duplication across the different LSMs and the possibility for mistakes across the different LSM subsystems. In order to reduce code duplication and decrease the chances of silly mistakes, we're consolidating all of this code into the lsm_fill_user_ctx() helper. The buffer padding is also modified from a fixed 8-byte alignment to an alignment that matches the word length of the machine (BITS_PER_LONG / 8). Signed-off-by: Paul Moore <paul@paul-moore.com>
Diffstat (limited to 'security/apparmor')
-rw-r--r--security/apparmor/lsm.c15
1 files changed, 3 insertions, 12 deletions
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index 8165f80c10ff..332198e0a017 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -782,7 +782,6 @@ static int apparmor_getselfattr(unsigned int attr, struct lsm_ctx __user *lx,
int error = -ENOENT;
struct aa_task_ctx *ctx = task_ctx(current);
struct aa_label *label = NULL;
- size_t total_len = 0;
char *value;
switch (attr) {
@@ -804,22 +803,14 @@ static int apparmor_getselfattr(unsigned int attr, struct lsm_ctx __user *lx,
if (label) {
error = aa_getprocattr(label, &value, false);
- if (error > 0) {
- total_len = ALIGN(struct_size(lx, ctx, error), 8);
- if (total_len > *size)
- error = -E2BIG;
- else if (lx)
- error = lsm_fill_user_ctx(lx, value, error,
- LSM_ID_APPARMOR, 0);
- else
- error = 1;
- }
+ if (error > 0)
+ error = lsm_fill_user_ctx(lx, size, value, error,
+ LSM_ID_APPARMOR, 0);
kfree(value);
}
aa_put_label(label);
- *size = total_len;
if (error < 0)
return error;
return 1;