[PATCH] tomoyo: use u64 for handling numeric values

Tetsuo Handa
2024-10-12T07:36:15Z

TOMOYO was using "unsigned long" for handling numeric values because all
possible value range fits in "unsigned long". Since Mickaël Salaün is
about to replace "ino_t" with "u64", possible value range no longer fits
in architecture-dependent "unsigned long". Therefore, replace "unsigned
long" and "ino_t" with "u64".

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
---
Please include this patch before your patch.

security/tomoyo/audit.c | 10 ++++------
security/tomoyo/common.c | 14 +++++++-------
security/tomoyo/common.h | 17 ++++++++---------
security/tomoyo/condition.c | 8 ++++----
security/tomoyo/file.c | 6 +++---
security/tomoyo/group.c | 3 +--
security/tomoyo/util.c | 28 ++++++++++++++--------------
7 files changed, 41 insertions(+), 45 deletions(-)

diff --git a/security/tomoyo/audit.c b/security/tomoyo/audit.c
index 610c1536cf70..36c9e63651b5 100644
--- a/security/tomoyo/audit.c
+++ b/security/tomoyo/audit.c
@@ -195,21 +195,19 @@ static char *tomoyo_print_header(struct tomoyo_request_info *r)
if (i & 1) {
pos += snprintf(buffer + pos,
tomoyo_buffer_len - 1 - pos,
- " path%u.parent={ uid=%u gid=%u ino=%lu perm=0%o }",
+ " path%u.parent={ uid=%u gid=%u ino=%llu perm=0%o }",
(i >> 1) + 1,
from_kuid(&init_user_ns, stat->uid),
from_kgid(&init_user_ns, stat->gid),
- (unsigned long)stat->ino,
- stat->mode & S_IALLUGO);
+ stat->ino, stat->mode & S_IALLUGO);
continue;
}
pos += snprintf(buffer + pos, tomoyo_buffer_len - 1 - pos,
- " path%u={ uid=%u gid=%u ino=%lu major=%u minor=%u perm=0%o type=%s",
+ " path%u={ uid=%u gid=%u ino=%llu major=%u minor=%u perm=0%o type=%s",
(i >> 1) + 1,
from_kuid(&init_user_ns, stat->uid),
from_kgid(&init_user_ns, stat->gid),
- (unsigned long)stat->ino,
- MAJOR(dev), MINOR(dev),
+ stat->ino, MAJOR(dev), MINOR(dev),
mode & S_IALLUGO, tomoyo_filetype(mode));
if (S_ISCHR(mode) || S_ISBLK(mode)) {
dev = stat->rdev;
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
index 5c7b059a332a..528b96c917e5 100644
--- a/security/tomoyo/common.c
+++ b/security/tomoyo/common.c
@@ -424,8 +424,8 @@ static void tomoyo_print_number_union_nospace
tomoyo_set_string(head, ptr->group->group_name->name);
} else {
int i;
- unsigned long min = ptr->values[0];
- const unsigned long max = ptr->values[1];
+ u64 min = ptr->values[0];
+ const u64 max = ptr->values[1];
u8 min_type = ptr->value_type[0];
const u8 max_type = ptr->value_type[1];
char buffer[128];
@@ -435,15 +435,15 @@ static void tomoyo_print_number_union_nospace
switch (min_type) {
case TOMOYO_VALUE_TYPE_HEXADECIMAL:
tomoyo_addprintf(buffer, sizeof(buffer),
- "0x%lX", min);
+ "0x%llX", min);
break;
case TOMOYO_VALUE_TYPE_OCTAL:
tomoyo_addprintf(buffer, sizeof(buffer),
- "0%lo", min);
+ "0%llo", min);
break;
default:
- tomoyo_addprintf(buffer, sizeof(buffer), "%lu",
- min);
+ tomoyo_addprintf(buffer, sizeof(buffer),
+ "%llu", min);
break;
}
if (min == max && min_type == max_type)
@@ -1287,7 +1287,7 @@ static bool tomoyo_print_condition(struct tomoyo_io_buffer *head,
switch (left) {
case TOMOYO_ARGV_ENTRY:
tomoyo_io_printf(head,
- "exec.argv[%lu]%s=\"",
+ "exec.argv[%llu]%s=\"",
argv->index, argv->is_not ? "!" : "");
tomoyo_set_string(head,
argv->value->name);
diff --git a/security/tomoyo/common.h b/security/tomoyo/common.h
index 0e8e2e959aef..bdbb4f0ae751 100644
--- a/security/tomoyo/common.h
+++ b/security/tomoyo/common.h
@@ -524,7 +524,7 @@ struct tomoyo_name_union {

/* Structure for holding a number. */
struct tomoyo_number_union {
- unsigned long values[2];
+ u64 values[2];
struct tomoyo_group *group; /* Maybe NULL. */
/* One of values in "enum tomoyo_value_type". */
u8 value_type[2];
@@ -567,7 +567,7 @@ struct tomoyo_address_group {
struct tomoyo_mini_stat {
kuid_t uid;
kgid_t gid;
- ino_t ino;
+ u64 ino;
umode_t mode;
dev_t dev;
dev_t rdev;
@@ -605,7 +605,7 @@ struct tomoyo_obj_info {

/* Structure for argv[]. */
struct tomoyo_argv {
- unsigned long index;
+ u64 index;
const struct tomoyo_path_info *value;
bool is_not;
};
@@ -926,7 +926,7 @@ struct tomoyo_task {

bool tomoyo_address_matches_group(const bool is_ipv6, const __be32 *address,
const struct tomoyo_group *group);
-bool tomoyo_compare_number_union(const unsigned long value,
+bool tomoyo_compare_number_union(const u64 value,
const struct tomoyo_number_union *ptr);
bool tomoyo_condition(struct tomoyo_request_info *r,
const struct tomoyo_condition *cond);
@@ -938,8 +938,7 @@ bool tomoyo_domain_quota_is_ok(struct tomoyo_request_info *r);
bool tomoyo_dump_page(struct linux_binprm *bprm, unsigned long pos,
struct tomoyo_page_dump *dump);
bool tomoyo_memory_ok(void *ptr);
-bool tomoyo_number_matches_group(const unsigned long min,
- const unsigned long max,
+bool tomoyo_number_matches_group(const u64 min, const u64 max,
const struct tomoyo_group *group);
bool tomoyo_parse_ipaddr_union(struct tomoyo_acl_param *param,
struct tomoyo_ipaddr_union *ptr);
@@ -1037,7 +1036,7 @@ struct tomoyo_policy_namespace *tomoyo_assign_namespace
(const char *domainname);
struct tomoyo_profile *tomoyo_profile(const struct tomoyo_policy_namespace *ns,
const u8 profile);
-u8 tomoyo_parse_ulong(unsigned long *result, char **str);
+u8 tomoyo_parse_u64(u64 *result, char **str);
void *tomoyo_commit_ok(void *data, const unsigned int size);
void __init tomoyo_load_builtin_policy(void);
void __init tomoyo_mm_init(void);
@@ -1055,8 +1054,8 @@ void tomoyo_normalize_line(unsigned char *buffer);
void tomoyo_notify_gc(struct tomoyo_io_buffer *head, const bool is_register);
void tomoyo_print_ip(char *buf, const unsigned int size,
const struct tomoyo_ipaddr_union *ptr);
-void tomoyo_print_ulong(char *buffer, const int buffer_len,
- const unsigned long value, const u8 type);
+void tomoyo_print_u64(char *buffer, const int buffer_len,
+ const u64 value, const u8 type);
void tomoyo_put_name_union(struct tomoyo_name_union *ptr);
void tomoyo_put_number_union(struct tomoyo_number_union *ptr);
void tomoyo_read_log(struct tomoyo_io_buffer *head);
diff --git a/security/tomoyo/condition.c b/security/tomoyo/condition.c
index f8bcc083bb0d..4a27fbf4588b 100644
--- a/security/tomoyo/condition.c
+++ b/security/tomoyo/condition.c
@@ -299,7 +299,7 @@ static bool tomoyo_parse_name_union_quoted(struct tomoyo_acl_param *param,
static bool tomoyo_parse_argv(char *left, char *right,
struct tomoyo_argv *argv)
{
- if (tomoyo_parse_ulong(&argv->index, &left) !=
+ if (tomoyo_parse_u64(&argv->index, &left) !=
TOMOYO_VALUE_TYPE_DECIMAL || *left++ != ']' || *left)
return false;
argv->value = tomoyo_get_dqword(right);
@@ -766,8 +766,8 @@ bool tomoyo_condition(struct tomoyo_request_info *r,
const struct tomoyo_condition *cond)
{
u32 i;
- unsigned long min_v[2] = { 0, 0 };
- unsigned long max_v[2] = { 0, 0 };
+ u64 min_v[2] = { 0, 0 };
+ u64 max_v[2] = { 0, 0 };
const struct tomoyo_condition_element *condp;
const struct tomoyo_number_union *numbers_p;
const struct tomoyo_name_union *names_p;
@@ -834,7 +834,7 @@ bool tomoyo_condition(struct tomoyo_request_info *r,
/* Check numeric or bit-op expressions. */
for (j = 0; j < 2; j++) {
const u8 index = j ? right : left;
- unsigned long value = 0;
+ u64 value = 0;

switch (index) {
case TOMOYO_TASK_UID:
diff --git a/security/tomoyo/file.c b/security/tomoyo/file.c
index 8f3b90b6e03d..4fa58abf5975 100644
--- a/security/tomoyo/file.c
+++ b/security/tomoyo/file.c
@@ -109,7 +109,7 @@ void tomoyo_put_number_union(struct tomoyo_number_union *ptr)
*
* Returns true if @value matches @ptr, false otherwise.
*/
-bool tomoyo_compare_number_union(const unsigned long value,
+bool tomoyo_compare_number_union(const u64 value,
const struct tomoyo_number_union *ptr)
{
if (ptr->group)
@@ -230,8 +230,8 @@ static int tomoyo_audit_path_number_log(struct tomoyo_request_info *r)
radix = TOMOYO_VALUE_TYPE_DECIMAL;
break;
}
- tomoyo_print_ulong(buffer, sizeof(buffer), r->param.path_number.number,
- radix);
+ tomoyo_print_u64(buffer, sizeof(buffer), r->param.path_number.number,
+ radix);
return tomoyo_supervisor(r, "file %s %s %s\n", tomoyo_mac_keywords
[tomoyo_pn2mac[type]],
r->param.path_number.filename->name, buffer);
diff --git a/security/tomoyo/group.c b/security/tomoyo/group.c
index 1cecdd797597..dc650eaedba3 100644
--- a/security/tomoyo/group.c
+++ b/security/tomoyo/group.c
@@ -155,8 +155,7 @@ tomoyo_path_matches_group(const struct tomoyo_path_info *pathname,
*
* Caller holds tomoyo_read_lock().
*/
-bool tomoyo_number_matches_group(const unsigned long min,
- const unsigned long max,
+bool tomoyo_number_matches_group(const u64 min, const u64 max,
const struct tomoyo_group *group)
{
struct tomoyo_number_group *member;
diff --git a/security/tomoyo/util.c b/security/tomoyo/util.c
index 6799b1122c9d..ac9535b4bdcd 100644
--- a/security/tomoyo/util.c
+++ b/security/tomoyo/util.c
@@ -172,9 +172,9 @@ const struct tomoyo_path_info *tomoyo_get_domainname
}

/**
- * tomoyo_parse_ulong - Parse an "unsigned long" value.
+ * tomoyo_parse_u64 - Parse a u64 value.
*
- * @result: Pointer to "unsigned long".
+ * @result: Pointer to u64.
* @str: Pointer to string to parse.
*
* Returns one of values in "enum tomoyo_value_type".
@@ -182,7 +182,7 @@ const struct tomoyo_path_info *tomoyo_get_domainname
* The @src is updated to point the first character after the value
* on success.
*/
-u8 tomoyo_parse_ulong(unsigned long *result, char **str)
+u8 tomoyo_parse_u64(u64 *result, char **str)
{
const char *cp = *str;
char *ep;
@@ -199,7 +199,7 @@ u8 tomoyo_parse_ulong(unsigned long *result, char **str)
cp++;
}
}
- *result = simple_strtoul(cp, &ep, base);
+ *result = (u64) simple_strtoull(cp, &ep, base);
if (cp == ep)
return TOMOYO_VALUE_TYPE_INVALID;
*str = ep;
@@ -214,24 +214,24 @@ u8 tomoyo_parse_ulong(unsigned long *result, char **str)
}

/**
- * tomoyo_print_ulong - Print an "unsigned long" value.
+ * tomoyo_print_u64 - Print a u64 value.
*
* @buffer: Pointer to buffer.
* @buffer_len: Size of @buffer.
- * @value: An "unsigned long" value.
+ * @value: A u64 value.
* @type: Type of @value.
*
* Returns nothing.
*/
-void tomoyo_print_ulong(char *buffer, const int buffer_len,
- const unsigned long value, const u8 type)
+void tomoyo_print_u64(char *buffer, const int buffer_len,
+ const u64 value, const u8 type)
{
if (type == TOMOYO_VALUE_TYPE_DECIMAL)
- snprintf(buffer, buffer_len, "%lu", value);
+ snprintf(buffer, buffer_len, "%llu", value);
else if (type == TOMOYO_VALUE_TYPE_OCTAL)
- snprintf(buffer, buffer_len, "0%lo", value);
+ snprintf(buffer, buffer_len, "0%llo", value);
else if (type == TOMOYO_VALUE_TYPE_HEXADECIMAL)
- snprintf(buffer, buffer_len, "0x%lX", value);
+ snprintf(buffer, buffer_len, "0x%llX", value);
else
snprintf(buffer, buffer_len, "type(%u)", type);
}
@@ -274,7 +274,7 @@ bool tomoyo_parse_number_union(struct tomoyo_acl_param *param,
{
char *data;
u8 type;
- unsigned long v;
+ u64 v;

memset(ptr, 0, sizeof(*ptr));
if (param->data[0] == '@') {
@@ -283,7 +283,7 @@ bool tomoyo_parse_number_union(struct tomoyo_acl_param *param,
return ptr->group != NULL;
}
data = tomoyo_read_token(param);
- type = tomoyo_parse_ulong(&v, &data);
+ type = tomoyo_parse_u64(&v, &data);
if (type == TOMOYO_VALUE_TYPE_INVALID)
return false;
ptr->values[0] = v;
@@ -295,7 +295,7 @@ bool tomoyo_parse_number_union(struct tomoyo_acl_param *param,
}
if (*data++ != '-')
return false;
- type = tomoyo_parse_ulong(&v, &data);
+ type = tomoyo_parse_u64(&v, &data);
if (type == TOMOYO_VALUE_TYPE_INVALID || *data || ptr->values[0] > v)
return false;
ptr->values[1] = v;
--
2.43.5