]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - security/tomoyo/common.h
TOMOYO: Copy directly to userspace buffer.
[net-next-2.6.git] / security / tomoyo / common.h
index 12b0c5c46c8d032889c9542c81a59b89af76318c..ef8fecddb65a11fa17792308baf5fbb8f61844e1 100644 (file)
@@ -50,8 +50,7 @@ enum tomoyo_policy_id {
        TOMOYO_ID_GROUP,
        TOMOYO_ID_PATH_GROUP,
        TOMOYO_ID_NUMBER_GROUP,
-       TOMOYO_ID_DOMAIN_INITIALIZER,
-       TOMOYO_ID_DOMAIN_KEEPER,
+       TOMOYO_ID_TRANSITION_CONTROL,
        TOMOYO_ID_AGGREGATOR,
        TOMOYO_ID_GLOBALLY_READABLE,
        TOMOYO_ID_PATTERN,
@@ -97,6 +96,15 @@ enum tomoyo_group_id {
 #define TOMOYO_VALUE_TYPE_OCTAL       2
 #define TOMOYO_VALUE_TYPE_HEXADECIMAL 3
 
+enum tomoyo_transition_type {
+       /* Do not change this order, */
+       TOMOYO_TRANSITION_CONTROL_NO_INITIALIZE,
+       TOMOYO_TRANSITION_CONTROL_INITIALIZE,
+       TOMOYO_TRANSITION_CONTROL_NO_KEEP,
+       TOMOYO_TRANSITION_CONTROL_KEEP,
+       TOMOYO_MAX_TRANSITION_TYPE
+};
+
 /* Index numbers for Access Controls. */
 enum tomoyo_acl_entry_type_index {
        TOMOYO_TYPE_PATH_ACL,
@@ -516,28 +524,11 @@ struct tomoyo_mount_acl {
        struct tomoyo_number_union flags;
 };
 
+#define TOMOYO_MAX_IO_READ_QUEUE 32
+
 /*
- * tomoyo_io_buffer is a structure which is used for reading and modifying
- * configuration via /sys/kernel/security/tomoyo/ interface.
- * It has many fields. ->read_var1 , ->read_var2 , ->write_var1 are used as
- * cursors.
- *
- * Since the content of /sys/kernel/security/tomoyo/domain_policy is a list of
- * "struct tomoyo_domain_info" entries and each "struct tomoyo_domain_info"
- * entry has a list of "struct tomoyo_acl_info", we need two cursors when
- * reading (one is for traversing tomoyo_domain_list and the other is for
- * traversing "struct tomoyo_acl_info"->acl_info_list ).
- *
- * If a line written to /sys/kernel/security/tomoyo/domain_policy starts with
- * "select ", TOMOYO seeks the cursor ->read_var1 and ->write_var1 to the
- * domain with the domainname specified by the rest of that line (NULL is set
- * if seek failed).
- * If a line written to /sys/kernel/security/tomoyo/domain_policy starts with
- * "delete ", TOMOYO deletes an entry or a domain specified by the rest of that
- * line (->write_var1 is set to NULL if a domain was deleted).
- * If a line written to /sys/kernel/security/tomoyo/domain_policy starts with
- * neither "select " nor "delete ", an entry or a domain specified by that line
- * is appended.
+ * Structure for reading/writing policy via /sys/kernel/security/tomoyo
+ * interfaces.
  */
 struct tomoyo_io_buffer {
        void (*read) (struct tomoyo_io_buffer *);
@@ -547,24 +538,27 @@ struct tomoyo_io_buffer {
        struct mutex io_sem;
        /* Index returned by tomoyo_read_lock(). */
        int reader_idx;
-       /* The position currently reading from. */
-       struct list_head *read_var1;
-       /* Extra variables for reading.         */
-       struct list_head *read_var2;
+       char __user *read_user_buf;
+       int read_user_buf_avail;
+       struct {
+               struct list_head *domain;
+               struct list_head *group;
+               struct list_head *acl;
+               int avail;
+               int step;
+               int query_index;
+               u16 index;
+               u8 bit;
+               u8 w_pos;
+               bool eof;
+               bool print_this_domain_only;
+               bool print_execute_only;
+               const char *w[TOMOYO_MAX_IO_READ_QUEUE];
+       } r;
        /* The position currently writing to.   */
        struct tomoyo_domain_info *write_var1;
-       /* The step for reading.                */
-       int read_step;
        /* Buffer for reading.                  */
        char *read_buf;
-       /* EOF flag for reading.                */
-       bool read_eof;
-       /* Read domain ACL of specified PID?    */
-       bool read_single_domain;
-       /* Extra variable for reading.          */
-       u8 read_bit;
-       /* Bytes available for reading.         */
-       int read_avail;
        /* Size of read buffer.                 */
        int readbuf_size;
        /* Buffer for writing.                  */
@@ -619,50 +613,26 @@ struct tomoyo_no_rewrite_entry {
 };
 
 /*
- * tomoyo_domain_initializer_entry is a structure which is used for holding
- * "initialize_domain" and "no_initialize_domain" entries.
+ * tomoyo_transition_control is a structure which is used for holding
+ * "initialize_domain"/"no_initialize_domain"/"keep_domain"/"no_keep_domain"
+ * entries.
  * It has following fields.
  *
  *  (1) "head" is "struct tomoyo_acl_head".
- *  (2) "is_not" is a bool which is true if "no_initialize_domain", false
- *      otherwise.
- *  (3) "is_last_name" is a bool which is true if "domainname" is "the last
- *      component of a domainname", false otherwise.
- *  (4) "domainname" which is "a domainname" or "the last component of a
- *      domainname". This field is NULL if "from" clause is not specified.
- *  (5) "program" which is a program's pathname.
- */
-struct tomoyo_domain_initializer_entry {
-       struct tomoyo_acl_head head;
-       bool is_not;       /* True if this entry is "no_initialize_domain".  */
-       /* True if the domainname is tomoyo_get_last_name(). */
-       bool is_last_name;
-       const struct tomoyo_path_info *domainname;    /* This may be NULL */
-       const struct tomoyo_path_info *program;
-};
-
-/*
- * tomoyo_domain_keeper_entry is a structure which is used for holding
- * "keep_domain" and "no_keep_domain" entries.
- * It has following fields.
- *
- *  (1) "head" is "struct tomoyo_acl_head".
- *  (2) "is_not" is a bool which is true if "no_initialize_domain", false
- *      otherwise.
+ *  (2) "type" is type of this entry.
  *  (3) "is_last_name" is a bool which is true if "domainname" is "the last
  *      component of a domainname", false otherwise.
  *  (4) "domainname" which is "a domainname" or "the last component of a
  *      domainname".
  *  (5) "program" which is a program's pathname.
- *      This field is NULL if "from" clause is not specified.
  */
-struct tomoyo_domain_keeper_entry {
+struct tomoyo_transition_control {
        struct tomoyo_acl_head head;
-       bool is_not;       /* True if this entry is "no_keep_domain".        */
+       u8 type; /* One of values in "enum tomoyo_transition_type".  */
        /* True if the domainname is tomoyo_get_last_name(). */
        bool is_last_name;
-       const struct tomoyo_path_info *domainname;
-       const struct tomoyo_path_info *program;       /* This may be NULL */
+       const struct tomoyo_path_info *domainname; /* Maybe NULL */
+       const struct tomoyo_path_info *program;    /* Maybe NULL */
 };
 
 /*
@@ -752,8 +722,7 @@ bool tomoyo_compare_name_union(const struct tomoyo_path_info *name,
 bool tomoyo_compare_number_union(const unsigned long value,
                                 const struct tomoyo_number_union *ptr);
 int tomoyo_get_mode(const u8 profile, const u8 index);
-/* Transactional sprintf() for policy dump. */
-bool tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, ...)
+void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, ...)
        __attribute__ ((format(printf, 2, 3)));
 /* Check whether the domainname is correct. */
 bool tomoyo_correct_domain(const unsigned char *domainname);
@@ -775,8 +744,6 @@ bool tomoyo_number_matches_group(const unsigned long min,
 bool tomoyo_path_matches_pattern(const struct tomoyo_path_info *filename,
                                 const struct tomoyo_path_info *pattern);
 
-bool tomoyo_print_number_union(struct tomoyo_io_buffer *head,
-                              const struct tomoyo_number_union *ptr);
 bool tomoyo_parse_number_union(char *data, struct tomoyo_number_union *num);
 /* Tokenize a line. */
 bool tomoyo_tokenize(char *buffer, char *w[], size_t size);
@@ -793,15 +760,8 @@ int tomoyo_mount_permission(char *dev_name, struct path *path, char *type,
                            unsigned long flags, void *data_page);
 /* Create "aggregator" entry in exception policy. */
 int tomoyo_write_aggregator_policy(char *data, const bool is_delete);
-/*
- * Create "initialize_domain" and "no_initialize_domain" entry
- * in exception policy.
- */
-int tomoyo_write_domain_initializer_policy(char *data, const bool is_not,
-                                          const bool is_delete);
-/* Create "keep_domain" and "no_keep_domain" entry in exception policy. */
-int tomoyo_write_domain_keeper_policy(char *data, const bool is_not,
-                                     const bool is_delete);
+int tomoyo_write_transition_control(char *data, const bool is_delete,
+                                   const u8 type);
 /*
  * Create "allow_read/write", "allow_execute", "allow_read", "allow_write",
  * "allow_create", "allow_unlink", "allow_mkdir", "allow_rmdir",
@@ -922,6 +882,7 @@ int tomoyo_update_policy(struct tomoyo_acl_head *new_entry, const int size,
 void tomoyo_check_acl(struct tomoyo_request_info *r,
                      bool (*check_entry) (const struct tomoyo_request_info *,
                                           const struct tomoyo_acl_info *));
+const char *tomoyo_last_word(const char *name);
 
 /********** External variable definitions. **********/
 
@@ -1045,19 +1006,11 @@ static inline bool tomoyo_same_number_union
 /**
  * list_for_each_cookie - iterate over a list with cookie.
  * @pos:        the &struct list_head to use as a loop cursor.
- * @cookie:     the &struct list_head to use as a cookie.
  * @head:       the head for your list.
- *
- * Same with list_for_each_rcu() except that this primitive uses @cookie
- * so that we can continue iteration.
- * @cookie must be NULL when iteration starts, and @cookie will become
- * NULL when iteration finishes.
  */
-#define list_for_each_cookie(pos, cookie, head)                                \
-       for (({ if (!cookie)                                            \
-                                    cookie = head; }),                 \
-                    pos = rcu_dereference((cookie)->next);             \
-            prefetch(pos->next), pos != (head) || ((cookie) = NULL);   \
-            (cookie) = pos, pos = rcu_dereference(pos->next))
+#define list_for_each_cookie(pos, head)                                        \
+       if (!pos)                                                       \
+               pos =  srcu_dereference((head)->next, &tomoyo_ss);      \
+       for ( ; pos != (head); pos = srcu_dereference(pos->next, &tomoyo_ss))
 
 #endif /* !defined(_SECURITY_TOMOYO_COMMON_H) */