diff mbox series

Smack: Fix wrong semantics in smk_access_entry()

Message ID 20210715091724.45768-1-tianjia.zhang@linux.alibaba.com (mailing list archive)
State New, archived
Headers show
Series Smack: Fix wrong semantics in smk_access_entry() | expand

Commit Message

tianjia.zhang July 15, 2021, 9:17 a.m. UTC
In the smk_access_entry() function, if no matching rule is found
in the rust_list, a negative error code will be used to perform bit
operations with the MAY_ enumeration value. This is semantically
wrong. This patch fixes this issue.

Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
---
 security/smack/smack_access.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

Comments

Casey Schaufler July 15, 2021, 3:15 p.m. UTC | #1
On 7/15/2021 2:17 AM, Tianjia Zhang wrote:
> In the smk_access_entry() function, if no matching rule is found
> in the rust_list, a negative error code will be used to perform bit
> operations with the MAY_ enumeration value. This is semantically
> wrong. This patch fixes this issue.

Indeed, the code as written is functioning correctly by
sheer luck. I will take this patch. Thank you.

>
> Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
> ---
>  security/smack/smack_access.c | 17 ++++++++---------
>  1 file changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
> index 1f391f6a3d47..d2186e2757be 100644
> --- a/security/smack/smack_access.c
> +++ b/security/smack/smack_access.c
> @@ -81,23 +81,22 @@ int log_policy = SMACK_AUDIT_DENIED;
>  int smk_access_entry(char *subject_label, char *object_label,
>  			struct list_head *rule_list)
>  {
> -	int may = -ENOENT;
>  	struct smack_rule *srp;
>  
>  	list_for_each_entry_rcu(srp, rule_list, list) {
>  		if (srp->smk_object->smk_known == object_label &&
>  		    srp->smk_subject->smk_known == subject_label) {
> -			may = srp->smk_access;
> -			break;
> +			int may = srp->smk_access;
> +			/*
> +			 * MAY_WRITE implies MAY_LOCK.
> +			 */
> +			if ((may & MAY_WRITE) == MAY_WRITE)
> +				may |= MAY_LOCK;
> +			return may;
>  		}
>  	}
>  
> -	/*
> -	 * MAY_WRITE implies MAY_LOCK.
> -	 */
> -	if ((may & MAY_WRITE) == MAY_WRITE)
> -		may |= MAY_LOCK;
> -	return may;
> +	return -ENOENT;
>  }
>  
>  /**
Casey Schaufler July 20, 2021, 4:32 p.m. UTC | #2
On 7/15/2021 8:15 AM, Casey Schaufler wrote:
> On 7/15/2021 2:17 AM, Tianjia Zhang wrote:
>> In the smk_access_entry() function, if no matching rule is found
>> in the rust_list, a negative error code will be used to perform bit
>> operations with the MAY_ enumeration value. This is semantically
>> wrong. This patch fixes this issue.
> Indeed, the code as written is functioning correctly by
> sheer luck. I will take this patch. Thank you.
>
>> Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>

Added to the Smack next branch.

>> ---
>>  security/smack/smack_access.c | 17 ++++++++---------
>>  1 file changed, 8 insertions(+), 9 deletions(-)
>>
>> diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
>> index 1f391f6a3d47..d2186e2757be 100644
>> --- a/security/smack/smack_access.c
>> +++ b/security/smack/smack_access.c
>> @@ -81,23 +81,22 @@ int log_policy = SMACK_AUDIT_DENIED;
>>  int smk_access_entry(char *subject_label, char *object_label,
>>  			struct list_head *rule_list)
>>  {
>> -	int may = -ENOENT;
>>  	struct smack_rule *srp;
>>  
>>  	list_for_each_entry_rcu(srp, rule_list, list) {
>>  		if (srp->smk_object->smk_known == object_label &&
>>  		    srp->smk_subject->smk_known == subject_label) {
>> -			may = srp->smk_access;
>> -			break;
>> +			int may = srp->smk_access;
>> +			/*
>> +			 * MAY_WRITE implies MAY_LOCK.
>> +			 */
>> +			if ((may & MAY_WRITE) == MAY_WRITE)
>> +				may |= MAY_LOCK;
>> +			return may;
>>  		}
>>  	}
>>  
>> -	/*
>> -	 * MAY_WRITE implies MAY_LOCK.
>> -	 */
>> -	if ((may & MAY_WRITE) == MAY_WRITE)
>> -		may |= MAY_LOCK;
>> -	return may;
>> +	return -ENOENT;
>>  }
>>  
>>  /**
tianjia.zhang July 21, 2021, 3:10 a.m. UTC | #3
On 7/21/21 12:32 AM, Casey Schaufler wrote:
> On 7/15/2021 8:15 AM, Casey Schaufler wrote:
>> On 7/15/2021 2:17 AM, Tianjia Zhang wrote:
>>> In the smk_access_entry() function, if no matching rule is found
>>> in the rust_list, a negative error code will be used to perform bit
>>> operations with the MAY_ enumeration value. This is semantically
>>> wrong. This patch fixes this issue.
>> Indeed, the code as written is functioning correctly by
>> sheer luck. I will take this patch. Thank you.
>>
>>> Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
> 
> Added to the Smack next branch.
> 

Great, Thanks.

Tianjia
diff mbox series

Patch

diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
index 1f391f6a3d47..d2186e2757be 100644
--- a/security/smack/smack_access.c
+++ b/security/smack/smack_access.c
@@ -81,23 +81,22 @@  int log_policy = SMACK_AUDIT_DENIED;
 int smk_access_entry(char *subject_label, char *object_label,
 			struct list_head *rule_list)
 {
-	int may = -ENOENT;
 	struct smack_rule *srp;
 
 	list_for_each_entry_rcu(srp, rule_list, list) {
 		if (srp->smk_object->smk_known == object_label &&
 		    srp->smk_subject->smk_known == subject_label) {
-			may = srp->smk_access;
-			break;
+			int may = srp->smk_access;
+			/*
+			 * MAY_WRITE implies MAY_LOCK.
+			 */
+			if ((may & MAY_WRITE) == MAY_WRITE)
+				may |= MAY_LOCK;
+			return may;
 		}
 	}
 
-	/*
-	 * MAY_WRITE implies MAY_LOCK.
-	 */
-	if ((may & MAY_WRITE) == MAY_WRITE)
-		may |= MAY_LOCK;
-	return may;
+	return -ENOENT;
 }
 
 /**