| From 2624b09c23cec4ab15b2cba21c5bcbe0af8fdd3f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 30 Sep 2025 15:16:02 +0300 |
| Subject: smack: /smack/doi must be > 0 |
| |
| From: Konstantin Andreev <andreev@swemel.ru> |
| |
| [ Upstream commit 19c013e1551bf51e1493da1270841d60e4fd3f15 ] |
| |
| /smack/doi allows writing and keeping negative doi values. |
| Correct values are 0 < doi <= (max 32-bit positive integer) |
| |
| (2008-02-04, Casey Schaufler) |
| Fixes: e114e473771c ("Smack: Simplified Mandatory Access Control Kernel") |
| |
| Signed-off-by: Konstantin Andreev <andreev@swemel.ru> |
| Signed-off-by: Casey Schaufler <casey@schaufler-ca.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| security/smack/smackfs.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c |
| index 1e35c9f807b2b..a130007397562 100644 |
| --- a/security/smack/smackfs.c |
| +++ b/security/smack/smackfs.c |
| @@ -139,7 +139,7 @@ struct smack_parsed_rule { |
| int smk_access2; |
| }; |
| |
| -static int smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT; |
| +static u32 smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT; |
| |
| /* |
| * Values for parsing cipso rules |
| @@ -1580,7 +1580,7 @@ static ssize_t smk_read_doi(struct file *filp, char __user *buf, |
| if (*ppos != 0) |
| return 0; |
| |
| - sprintf(temp, "%d", smk_cipso_doi_value); |
| + sprintf(temp, "%lu", (unsigned long)smk_cipso_doi_value); |
| rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); |
| |
| return rc; |
| @@ -1599,7 +1599,7 @@ static ssize_t smk_write_doi(struct file *file, const char __user *buf, |
| size_t count, loff_t *ppos) |
| { |
| char temp[80]; |
| - int i; |
| + unsigned long u; |
| |
| if (!smack_privileged(CAP_MAC_ADMIN)) |
| return -EPERM; |
| @@ -1612,10 +1612,12 @@ static ssize_t smk_write_doi(struct file *file, const char __user *buf, |
| |
| temp[count] = '\0'; |
| |
| - if (sscanf(temp, "%d", &i) != 1) |
| + if (kstrtoul(temp, 10, &u)) |
| return -EINVAL; |
| |
| - smk_cipso_doi_value = i; |
| + if (u == CIPSO_V4_DOI_UNKNOWN || u > U32_MAX) |
| + return -EINVAL; |
| + smk_cipso_doi_value = u; |
| |
| smk_cipso_doi(); |
| |
| -- |
| 2.51.0 |
| |