On 6/29/2023 7:14 PM, Paul Moore wrote: > On Jun 29, 2023 Casey Schaufler <casey@xxxxxxxxxxxxxxxx> wrote: >> Add lsm_name_to_attr(), which translates a text string to a >> LSM_ATTR value if one is available. >> >> Add lsm_fill_user_ctx(), which fills a struct lsm_ctx, including >> the trailing attribute value. >> >> All are used in module specific components of LSM system calls. >> >> Signed-off-by: Casey Schaufler <casey@xxxxxxxxxxxxxxxx> >> Reviewed-by: Serge Hallyn <serge@xxxxxxxxxx> >> --- >> include/linux/security.h | 14 +++++++++++++ >> security/lsm_syscalls.c | 24 ++++++++++++++++++++++ >> security/security.c | 44 ++++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 82 insertions(+) > .. > >> diff --git a/security/security.c b/security/security.c >> index 199db23581f1..72ad7197b2c9 100644 >> --- a/security/security.c >> +++ b/security/security.c >> @@ -770,6 +770,50 @@ static int lsm_superblock_alloc(struct super_block *sb) >> return 0; >> } >> >> +/** >> + * lsm_fill_user_ctx - Fill a user space lsm_ctx structure >> + * @ctx: an LSM context to be filled >> + * @context: the new context value >> + * @context_size: the size of the new context value >> + * @id: LSM id >> + * @flags: LSM defined flags >> + * >> + * Fill all of the fields in a user space lsm_ctx structure. >> + * Caller is assumed to have verified that @ctx has enough space >> + * for @context. >> + * >> + * The total length is padded to a multiple of 64 bits to >> + * accomodate possible alignment issues. > We should drop the sentence above now that alignment is the caller's > responsibility, but since that was largely my fault I can fix this up > during the merge assuming you're okay with that Casey. I have to fix the error in patch 8/11 anyway. I can fix this, too. > >> + * Returns 0 on success, -EFAULT on a copyout error, -ENOMEM >> + * if memory can't be allocated. >> + */ >> +int lsm_fill_user_ctx(struct lsm_ctx __user *ctx, void *context, >> + size_t context_size, u64 id, u64 flags) >> +{ >> + struct lsm_ctx *lctx; >> + size_t locallen = struct_size(lctx, ctx, context_size); >> + int rc = 0; >> + >> + lctx = kzalloc(locallen, GFP_KERNEL); >> + if (lctx == NULL) >> + return -ENOMEM; >> + >> + lctx->id = id; >> + lctx->flags = flags; >> + lctx->ctx_len = context_size; >> + lctx->len = locallen; >> + >> + memcpy(lctx->ctx, context, context_size); >> + >> + if (copy_to_user(ctx, lctx, locallen)) >> + rc = -EFAULT; >> + >> + kfree(lctx); >> + >> + return rc; >> +} >> + >> /* >> * The default value of the LSM hook is defined in linux/lsm_hook_defs.h and >> * can be accessed with: >> -- >> 2.40.1 > -- > paul-moore.com