On 6/29/2023 7:14 PM, Paul Moore wrote: > On Jun 29, 2023 Casey Schaufler <casey@xxxxxxxxxxxxxxxx> wrote: >> Implement Smack support for security_[gs]etselfattr. >> Refactor the setprocattr hook to avoid code duplication. >> >> Signed-off-by: Casey Schaufler <casey@xxxxxxxxxxxxxxxx> >> --- >> security/smack/smack_lsm.c | 106 +++++++++++++++++++++++++++++++++++-- >> 1 file changed, 101 insertions(+), 5 deletions(-) >> >> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c >> index cf847cfe5ed8..4a84639e9db9 100644 >> --- a/security/smack/smack_lsm.c >> +++ b/security/smack/smack_lsm.c > .. > >> @@ -3629,6 +3668,61 @@ static int smack_setprocattr(const char *name, void *value, size_t size) >> return size; >> } >> >> +/** >> + * smack_setselfattr - Set a Smack process attribute >> + * @attr: which attribute to set >> + * @ctx: buffer containing the data >> + * @size: size of @ctx >> + * @flags: unused >> + * >> + * Fill the passed user space @ctx with the details of the requested >> + * attribute. >> + * >> + * Returns 0 on success, an error code otherwise. >> + */ >> +static int smack_setselfattr(unsigned int attr, struct lsm_ctx __user *ctx, >> + size_t size, u32 flags) >> +{ >> + struct lsm_ctx *lctx; >> + int rc; >> + >> + lctx = kmalloc(size, GFP_KERNEL); >> + if (lctx == NULL) >> + return -ENOMEM; >> + >> + if (copy_from_user(lctx, ctx, size)) >> + rc = -EFAULT; >> + else if (lctx->ctx_len > size) >> + rc = -E2BIG; >> + else >> + rc = do_setattr(attr, lctx->ctx, lctx->ctx_len); >> + >> + kfree(lctx); >> + if (rc > 0) >> + return 0; >> + return rc; >> +} >> + >> +/** >> + * smack_setprocattr - Smack process attribute setting >> + * @name: the name of the attribute in /proc/.../attr >> + * @value: the value to set >> + * @size: the size of the value >> + * >> + * Sets the Smack value of the task. Only setting self >> + * is permitted and only with privilege >> + * >> + * Returns the length of the smack label or an error code >> + */ >> +static int smack_setprocattr(const char *name, void *value, size_t size) >> +{ >> + int attr = lsm_name_to_attr(name); >> + >> + if (attr == LSM_ATTR_UNDEF) > That should be '(attr != LSM_ATTR_UNDEF)', right? Yes, you're right. I'll fix and respin. > >> + return do_setattr(attr, value, size); >> + return -EINVAL; >> +} >> + >> /** >> * smack_unix_stream_connect - Smack access on UDS >> * @sock: one sock >> @@ -4939,6 +5033,8 @@ static struct security_hook_list smack_hooks[] __ro_after_init = { >> >> LSM_HOOK_INIT(d_instantiate, smack_d_instantiate), >> >> + LSM_HOOK_INIT(getselfattr, smack_getselfattr), >> + LSM_HOOK_INIT(setselfattr, smack_setselfattr), >> LSM_HOOK_INIT(getprocattr, smack_getprocattr), >> LSM_HOOK_INIT(setprocattr, smack_setprocattr), >> >> -- >> 2.40.1 > -- > paul-moore.com