1 // SPDX-License-Identifier: GPL-2.0
3 * security/tomoyo/environ.c
5 * Copyright (C) 2005-2011 NTT DATA CORPORATION
11 * tomoyo_check_env_acl - Check permission for environment variable's name.
13 * @r: Pointer to "struct tomoyo_request_info".
14 * @ptr: Pointer to "struct tomoyo_acl_info".
16 * Returns true if granted, false otherwise.
18 static bool tomoyo_check_env_acl(struct tomoyo_request_info
*r
,
19 const struct tomoyo_acl_info
*ptr
)
21 const struct tomoyo_env_acl
*acl
=
22 container_of(ptr
, typeof(*acl
), head
);
24 return tomoyo_path_matches_pattern(r
->param
.environ
.name
, acl
->env
);
28 * tomoyo_audit_env_log - Audit environment variable name log.
30 * @r: Pointer to "struct tomoyo_request_info".
32 * Returns 0 on success, negative value otherwise.
34 static int tomoyo_audit_env_log(struct tomoyo_request_info
*r
)
36 return tomoyo_supervisor(r
, "misc env %s\n",
37 r
->param
.environ
.name
->name
);
41 * tomoyo_env_perm - Check permission for environment variable's name.
43 * @r: Pointer to "struct tomoyo_request_info".
44 * @env: The name of environment variable.
46 * Returns 0 on success, negative value otherwise.
48 * Caller holds tomoyo_read_lock().
50 int tomoyo_env_perm(struct tomoyo_request_info
*r
, const char *env
)
52 struct tomoyo_path_info environ
;
58 tomoyo_fill_path_info(&environ
);
59 r
->param_type
= TOMOYO_TYPE_ENV_ACL
;
60 r
->param
.environ
.name
= &environ
;
62 tomoyo_check_acl(r
, tomoyo_check_env_acl
);
63 error
= tomoyo_audit_env_log(r
);
64 } while (error
== TOMOYO_RETRY_REQUEST
);
69 * tomoyo_same_env_acl - Check for duplicated "struct tomoyo_env_acl" entry.
71 * @a: Pointer to "struct tomoyo_acl_info".
72 * @b: Pointer to "struct tomoyo_acl_info".
74 * Returns true if @a == @b, false otherwise.
76 static bool tomoyo_same_env_acl(const struct tomoyo_acl_info
*a
,
77 const struct tomoyo_acl_info
*b
)
79 const struct tomoyo_env_acl
*p1
= container_of(a
, typeof(*p1
), head
);
80 const struct tomoyo_env_acl
*p2
= container_of(b
, typeof(*p2
), head
);
82 return p1
->env
== p2
->env
;
86 * tomoyo_write_env - Write "struct tomoyo_env_acl" list.
88 * @param: Pointer to "struct tomoyo_acl_param".
90 * Returns 0 on success, negative value otherwise.
92 * Caller holds tomoyo_read_lock().
94 static int tomoyo_write_env(struct tomoyo_acl_param
*param
)
96 struct tomoyo_env_acl e
= { .head
.type
= TOMOYO_TYPE_ENV_ACL
};
98 const char *data
= tomoyo_read_token(param
);
100 if (!tomoyo_correct_word(data
) || strchr(data
, '='))
102 e
.env
= tomoyo_get_name(data
);
105 error
= tomoyo_update_domain(&e
.head
, sizeof(e
), param
,
106 tomoyo_same_env_acl
, NULL
);
107 tomoyo_put_name(e
.env
);
112 * tomoyo_write_misc - Update environment variable list.
114 * @param: Pointer to "struct tomoyo_acl_param".
116 * Returns 0 on success, negative value otherwise.
118 int tomoyo_write_misc(struct tomoyo_acl_param
*param
)
120 if (tomoyo_str_starts(¶m
->data
, "env "))
121 return tomoyo_write_env(param
);