[PATCH] smack: deduplicate access to string conversion

Casey Schaufler casey at schaufler-ca.com
Sat Dec 7 18:18:04 UTC 2024


On 9/13/2024 7:46 AM, Konstantin Andreev wrote:
> Signed-off-by: Konstantin Andreev <andreev at swemel.ru>
> ---

Applied to smack-next for v6.14. Thank you.

> Currently, access bitfield is converted to string in 3 different places.
> This patch consolidates conversion in one place.
> The patch is against `next' branch at https://github.com/cschaufler/smack-next
> The patch does not hurt `Smack kernel test suite' https://github.com/smack-team/smack-testsuite.git
>
>  security/smack/smack.h        |  1 +
>  security/smack/smack_access.c | 10 ++++++++--
>  security/smack/smack_lsm.c    | 18 +-----------------
>  security/smack/smackfs.c      | 26 +++++---------------------
>  4 files changed, 15 insertions(+), 40 deletions(-)
>
> diff --git a/security/smack/smack.h b/security/smack/smack.h
> index 041688e5a77a..9e17e813fd1f 100644
> --- a/security/smack/smack.h
> +++ b/security/smack/smack.h
> @@ -280,6 +280,7 @@ int smk_access(struct smack_known *, struct smack_known *,
>  int smk_tskacc(struct task_smack *, struct smack_known *,
>  	       u32, struct smk_audit_info *);
>  int smk_curacc(struct smack_known *, u32, struct smk_audit_info *);
> +int smack_str_from_perm(char *string, int access);
>  struct smack_known *smack_from_secid(const u32);
>  char *smk_parse_smack(const char *string, int len);
>  int smk_netlbl_mls(int, char *, struct netlbl_lsm_secattr *, int);
> diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
> index 585e5e35710b..3727379623e2 100644
> --- a/security/smack/smack_access.c
> +++ b/security/smack/smack_access.c
> @@ -275,7 +275,6 @@ int smk_curacc(struct smack_known *obj_known,
>  	return smk_tskacc(tsp, obj_known, mode, a);
>  }
>  
> -#ifdef CONFIG_AUDIT
>  /**
>   * smack_str_from_perm : helper to transalate an int to a
>   * readable string
> @@ -283,7 +282,7 @@ int smk_curacc(struct smack_known *obj_known,
>   * @access : the int
>   *
>   */
> -static inline void smack_str_from_perm(char *string, int access)
> +int smack_str_from_perm(char *string, int access)
>  {
>  	int i = 0;
>  
> @@ -299,8 +298,15 @@ static inline void smack_str_from_perm(char *string, int access)
>  		string[i++] = 't';
>  	if (access & MAY_LOCK)
>  		string[i++] = 'l';
> +	if (access & MAY_BRINGUP)
> +		string[i++] = 'b';
> +	if (i == 0)
> +		string[i++] = '-';
>  	string[i] = '\0';
> +	return i;
>  }
> +
> +#ifdef CONFIG_AUDIT
>  /**
>   * smack_log_callback - SMACK specific information
>   * will be called by generic audit code
> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
> index 4164699cd4f6..e0c2a2c6add3 100644
> --- a/security/smack/smack_lsm.c
> +++ b/security/smack/smack_lsm.c
> @@ -107,23 +107,7 @@ static char *smk_bu_mess[] = {
>  
>  static void smk_bu_mode(int mode, char *s)
>  {
> -	int i = 0;
> -
> -	if (mode & MAY_READ)
> -		s[i++] = 'r';
> -	if (mode & MAY_WRITE)
> -		s[i++] = 'w';
> -	if (mode & MAY_EXEC)
> -		s[i++] = 'x';
> -	if (mode & MAY_APPEND)
> -		s[i++] = 'a';
> -	if (mode & MAY_TRANSMUTE)
> -		s[i++] = 't';
> -	if (mode & MAY_LOCK)
> -		s[i++] = 'l';
> -	if (i == 0)
> -		s[i++] = '-';
> -	s[i] = '\0';
> +	smack_str_from_perm(s, mode);
>  }
>  #endif
>  
> diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
> index 5dd1e164f9b1..cd5327253d1c 100644
> --- a/security/smack/smackfs.c
> +++ b/security/smack/smackfs.c
> @@ -564,6 +564,7 @@ static void smk_seq_stop(struct seq_file *s, void *v)
>  
>  static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max)
>  {
> +	char acc[SMK_NUM_ACCESS_TYPE + 1];
>  	/*
>  	 * Don't show any rules with label names too long for
>  	 * interface file (/smack/load or /smack/load2)
> @@ -577,28 +578,11 @@ static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max)
>  	if (srp->smk_access == 0)
>  		return;
>  
> -	seq_printf(s, "%s %s",
> +	smack_str_from_perm(acc, srp->smk_access);
> +	seq_printf(s, "%s %s %s\n",
>  		   srp->smk_subject->smk_known,
> -		   srp->smk_object->smk_known);
> -
> -	seq_putc(s, ' ');
> -
> -	if (srp->smk_access & MAY_READ)
> -		seq_putc(s, 'r');
> -	if (srp->smk_access & MAY_WRITE)
> -		seq_putc(s, 'w');
> -	if (srp->smk_access & MAY_EXEC)
> -		seq_putc(s, 'x');
> -	if (srp->smk_access & MAY_APPEND)
> -		seq_putc(s, 'a');
> -	if (srp->smk_access & MAY_TRANSMUTE)
> -		seq_putc(s, 't');
> -	if (srp->smk_access & MAY_LOCK)
> -		seq_putc(s, 'l');
> -	if (srp->smk_access & MAY_BRINGUP)
> -		seq_putc(s, 'b');
> -
> -	seq_putc(s, '\n');
> +		   srp->smk_object->smk_known,
> +		   acc);
>  }
>  
>  /*



More information about the Linux-security-module-archive mailing list