Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
environ.c
Go to the documentation of this file.
1 /*
2  * security/tomoyo/environ.c
3  *
4  * Copyright (C) 2005-2011 NTT DATA CORPORATION
5  */
6 
7 #include "common.h"
8 
17 static bool tomoyo_check_env_acl(struct tomoyo_request_info *r,
18  const struct tomoyo_acl_info *ptr)
19 {
20  const struct tomoyo_env_acl *acl =
21  container_of(ptr, typeof(*acl), head);
22 
23  return tomoyo_path_matches_pattern(r->param.environ.name, acl->env);
24 }
25 
33 static int tomoyo_audit_env_log(struct tomoyo_request_info *r)
34 {
35  return tomoyo_supervisor(r, "misc env %s\n",
36  r->param.environ.name->name);
37 }
38 
49 int tomoyo_env_perm(struct tomoyo_request_info *r, const char *env)
50 {
51  struct tomoyo_path_info environ;
52  int error;
53 
54  if (!env || !*env)
55  return 0;
56  environ.name = env;
57  tomoyo_fill_path_info(&environ);
59  r->param.environ.name = &environ;
60  do {
61  tomoyo_check_acl(r, tomoyo_check_env_acl);
62  error = tomoyo_audit_env_log(r);
63  } while (error == TOMOYO_RETRY_REQUEST);
64  return error;
65 }
66 
75 static bool tomoyo_same_env_acl(const struct tomoyo_acl_info *a,
76  const struct tomoyo_acl_info *b)
77 {
78  const struct tomoyo_env_acl *p1 = container_of(a, typeof(*p1), head);
79  const struct tomoyo_env_acl *p2 = container_of(b, typeof(*p2), head);
80 
81  return p1->env == p2->env;
82 }
83 
93 static int tomoyo_write_env(struct tomoyo_acl_param *param)
94 {
95  struct tomoyo_env_acl e = { .head.type = TOMOYO_TYPE_ENV_ACL };
96  int error = -ENOMEM;
97  const char *data = tomoyo_read_token(param);
98 
99  if (!tomoyo_correct_word(data) || strchr(data, '='))
100  return -EINVAL;
101  e.env = tomoyo_get_name(data);
102  if (!e.env)
103  return error;
104  error = tomoyo_update_domain(&e.head, sizeof(e), param,
105  tomoyo_same_env_acl, NULL);
106  tomoyo_put_name(e.env);
107  return error;
108 }
109 
118 {
119  if (tomoyo_str_starts(&param->data, "env "))
120  return tomoyo_write_env(param);
121  return -EINVAL;
122 }