Lines Matching refs:head
204 static bool tomoyo_flush(struct tomoyo_io_buffer *head) in tomoyo_flush() argument
206 while (head->r.w_pos) { in tomoyo_flush()
207 const char *w = head->r.w[0]; in tomoyo_flush()
211 if (len > head->read_user_buf_avail) in tomoyo_flush()
212 len = head->read_user_buf_avail; in tomoyo_flush()
215 if (copy_to_user(head->read_user_buf, w, len)) in tomoyo_flush()
217 head->read_user_buf_avail -= len; in tomoyo_flush()
218 head->read_user_buf += len; in tomoyo_flush()
221 head->r.w[0] = w; in tomoyo_flush()
225 if (head->poll) { in tomoyo_flush()
226 if (!head->read_user_buf_avail || in tomoyo_flush()
227 copy_to_user(head->read_user_buf, "", 1)) in tomoyo_flush()
229 head->read_user_buf_avail--; in tomoyo_flush()
230 head->read_user_buf++; in tomoyo_flush()
232 head->r.w_pos--; in tomoyo_flush()
233 for (len = 0; len < head->r.w_pos; len++) in tomoyo_flush()
234 head->r.w[len] = head->r.w[len + 1]; in tomoyo_flush()
236 head->r.avail = 0; in tomoyo_flush()
250 static void tomoyo_set_string(struct tomoyo_io_buffer *head, const char *string) in tomoyo_set_string() argument
252 if (head->r.w_pos < TOMOYO_MAX_IO_READ_QUEUE) { in tomoyo_set_string()
253 head->r.w[head->r.w_pos++] = string; in tomoyo_set_string()
254 tomoyo_flush(head); in tomoyo_set_string()
259 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt,
268 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, in tomoyo_io_printf() argument
273 size_t pos = head->r.avail; in tomoyo_io_printf()
274 int size = head->readbuf_size - pos; in tomoyo_io_printf()
279 len = vsnprintf(head->read_buf + pos, size, fmt, args) + 1; in tomoyo_io_printf()
281 if (pos + len >= head->readbuf_size) { in tomoyo_io_printf()
285 head->r.avail += len; in tomoyo_io_printf()
286 tomoyo_set_string(head, head->read_buf + pos); in tomoyo_io_printf()
296 static void tomoyo_set_space(struct tomoyo_io_buffer *head) in tomoyo_set_space() argument
298 tomoyo_set_string(head, " "); in tomoyo_set_space()
308 static bool tomoyo_set_lf(struct tomoyo_io_buffer *head) in tomoyo_set_lf() argument
310 tomoyo_set_string(head, "\n"); in tomoyo_set_lf()
311 return !head->r.w_pos; in tomoyo_set_lf()
321 static void tomoyo_set_slash(struct tomoyo_io_buffer *head) in tomoyo_set_slash() argument
323 tomoyo_set_string(head, "/"); in tomoyo_set_slash()
360 static void tomoyo_print_namespace(struct tomoyo_io_buffer *head) in tomoyo_print_namespace() argument
364 tomoyo_set_string(head, in tomoyo_print_namespace()
365 container_of(head->r.ns, in tomoyo_print_namespace()
368 tomoyo_set_space(head); in tomoyo_print_namespace()
377 static void tomoyo_print_name_union(struct tomoyo_io_buffer *head, in tomoyo_print_name_union() argument
380 tomoyo_set_space(head); in tomoyo_print_name_union()
382 tomoyo_set_string(head, "@"); in tomoyo_print_name_union()
383 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union()
385 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union()
397 static void tomoyo_print_name_union_quoted(struct tomoyo_io_buffer *head, in tomoyo_print_name_union_quoted() argument
401 tomoyo_set_string(head, "@"); in tomoyo_print_name_union_quoted()
402 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union_quoted()
404 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
405 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union_quoted()
406 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
419 (struct tomoyo_io_buffer *head, const struct tomoyo_number_union *ptr) in tomoyo_print_number_union_nospace() argument
422 tomoyo_set_string(head, "@"); in tomoyo_print_number_union_nospace()
423 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_number_union_nospace()
454 tomoyo_io_printf(head, "%s", buffer); in tomoyo_print_number_union_nospace()
466 static void tomoyo_print_number_union(struct tomoyo_io_buffer *head, in tomoyo_print_number_union() argument
469 tomoyo_set_space(head); in tomoyo_print_number_union()
470 tomoyo_print_number_union_nospace(head, ptr); in tomoyo_print_number_union()
665 static int tomoyo_write_profile(struct tomoyo_io_buffer *head) in tomoyo_write_profile() argument
667 char *data = head->write_buf; in tomoyo_write_profile()
672 if (sscanf(data, "PROFILE_VERSION=%u", &head->w.ns->profile_version) in tomoyo_write_profile()
679 profile = tomoyo_assign_profile(head->w.ns, i); in tomoyo_write_profile()
720 static void tomoyo_print_config(struct tomoyo_io_buffer *head, const u8 config) in tomoyo_print_config() argument
722 tomoyo_io_printf(head, "={ mode=%s grant_log=%s reject_log=%s }\n", in tomoyo_print_config()
735 static void tomoyo_read_profile(struct tomoyo_io_buffer *head) in tomoyo_read_profile() argument
739 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_profile()
742 if (head->r.eof) in tomoyo_read_profile()
745 index = head->r.index; in tomoyo_read_profile()
747 switch (head->r.step) { in tomoyo_read_profile()
749 tomoyo_print_namespace(head); in tomoyo_read_profile()
750 tomoyo_io_printf(head, "PROFILE_VERSION=%u\n", in tomoyo_read_profile()
752 head->r.step++; in tomoyo_read_profile()
755 for ( ; head->r.index < TOMOYO_MAX_PROFILES; in tomoyo_read_profile()
756 head->r.index++) in tomoyo_read_profile()
757 if (ns->profile_ptr[head->r.index]) in tomoyo_read_profile()
759 if (head->r.index == TOMOYO_MAX_PROFILES) { in tomoyo_read_profile()
760 head->r.eof = true; in tomoyo_read_profile()
763 head->r.step++; in tomoyo_read_profile()
771 tomoyo_print_namespace(head); in tomoyo_read_profile()
772 tomoyo_io_printf(head, "%u-COMMENT=", index); in tomoyo_read_profile()
773 tomoyo_set_string(head, comment ? comment->name : ""); in tomoyo_read_profile()
774 tomoyo_set_lf(head); in tomoyo_read_profile()
775 tomoyo_print_namespace(head); in tomoyo_read_profile()
776 tomoyo_io_printf(head, "%u-PREFERENCE={ ", index); in tomoyo_read_profile()
778 tomoyo_io_printf(head, "%s=%u ", in tomoyo_read_profile()
781 tomoyo_set_string(head, "}\n"); in tomoyo_read_profile()
782 head->r.step++; in tomoyo_read_profile()
787 tomoyo_print_namespace(head); in tomoyo_read_profile()
788 tomoyo_io_printf(head, "%u-%s", index, "CONFIG"); in tomoyo_read_profile()
789 tomoyo_print_config(head, profile->default_config); in tomoyo_read_profile()
790 head->r.bit = 0; in tomoyo_read_profile()
791 head->r.step++; in tomoyo_read_profile()
795 for ( ; head->r.bit < TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
796 + TOMOYO_MAX_MAC_CATEGORY_INDEX; head->r.bit++) { in tomoyo_read_profile()
797 const u8 i = head->r.bit; in tomoyo_read_profile()
802 tomoyo_print_namespace(head); in tomoyo_read_profile()
804 tomoyo_io_printf(head, "%u-CONFIG::%s::%s", in tomoyo_read_profile()
810 tomoyo_io_printf(head, "%u-CONFIG::%s", index, in tomoyo_read_profile()
812 tomoyo_print_config(head, config); in tomoyo_read_profile()
813 head->r.bit++; in tomoyo_read_profile()
816 if (head->r.bit == TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
818 head->r.index++; in tomoyo_read_profile()
819 head->r.step = 1; in tomoyo_read_profile()
823 if (tomoyo_flush(head)) in tomoyo_read_profile()
838 return container_of(a, struct tomoyo_manager, head)->manager == in tomoyo_same_manager()
839 container_of(b, struct tomoyo_manager, head)->manager; in tomoyo_same_manager()
868 error = tomoyo_update_policy(&e.head, sizeof(e), ¶m, in tomoyo_update_manager_entry()
884 static int tomoyo_write_manager(struct tomoyo_io_buffer *head) in tomoyo_write_manager() argument
886 char *data = head->write_buf; in tomoyo_write_manager()
889 tomoyo_manage_by_non_root = !head->w.is_delete; in tomoyo_write_manager()
892 return tomoyo_update_manager_entry(data, head->w.is_delete); in tomoyo_write_manager()
902 static void tomoyo_read_manager(struct tomoyo_io_buffer *head) in tomoyo_read_manager() argument
904 if (head->r.eof) in tomoyo_read_manager()
906 list_for_each_cookie(head->r.acl, &tomoyo_kernel_namespace.policy_list[TOMOYO_ID_MANAGER]) { in tomoyo_read_manager()
908 list_entry(head->r.acl, typeof(*ptr), head.list); in tomoyo_read_manager()
910 if (ptr->head.is_deleted) in tomoyo_read_manager()
912 if (!tomoyo_flush(head)) in tomoyo_read_manager()
914 tomoyo_set_string(head, ptr->manager->name); in tomoyo_read_manager()
915 tomoyo_set_lf(head); in tomoyo_read_manager()
917 head->r.eof = true; in tomoyo_read_manager()
945 list_for_each_entry_rcu(ptr, &tomoyo_kernel_namespace.policy_list[TOMOYO_ID_MANAGER], head.list, in tomoyo_manager()
947 if (!ptr->head.is_deleted && in tomoyo_manager()
981 static bool tomoyo_select_domain(struct tomoyo_io_buffer *head, in tomoyo_select_domain() argument
1010 head->w.domain = domain; in tomoyo_select_domain()
1012 if (!head->read_buf) in tomoyo_select_domain()
1014 memset(&head->r, 0, sizeof(head->r)); in tomoyo_select_domain()
1015 head->r.print_this_domain_only = true; in tomoyo_select_domain()
1017 head->r.domain = &domain->list; in tomoyo_select_domain()
1019 head->r.eof = true; in tomoyo_select_domain()
1020 tomoyo_io_printf(head, "# select %s\n", data); in tomoyo_select_domain()
1022 tomoyo_io_printf(head, "# This is a deleted domain.\n"); in tomoyo_select_domain()
1037 const struct tomoyo_task_acl *p1 = container_of(a, typeof(*p1), head); in tomoyo_same_task_acl()
1038 const struct tomoyo_task_acl *p2 = container_of(b, typeof(*p2), head); in tomoyo_same_task_acl()
1058 .head.type = TOMOYO_TYPE_MANUAL_TASK_ACL, in tomoyo_write_task()
1063 error = tomoyo_update_domain(&e.head, sizeof(e), param, in tomoyo_write_task()
1163 static int tomoyo_write_domain(struct tomoyo_io_buffer *head) in tomoyo_write_domain() argument
1165 char *data = head->write_buf; in tomoyo_write_domain()
1167 struct tomoyo_domain_info *domain = head->w.domain; in tomoyo_write_domain()
1168 const bool is_delete = head->w.is_delete; in tomoyo_write_domain()
1182 head->w.domain = domain; in tomoyo_write_domain()
1223 static bool tomoyo_print_condition(struct tomoyo_io_buffer *head, in tomoyo_print_condition() argument
1226 switch (head->r.cond_step) { in tomoyo_print_condition()
1228 head->r.cond_index = 0; in tomoyo_print_condition()
1229 head->r.cond_step++; in tomoyo_print_condition()
1231 tomoyo_set_space(head); in tomoyo_print_condition()
1232 tomoyo_set_string(head, cond->transit->name); in tomoyo_print_condition()
1251 for (skip = 0; skip < head->r.cond_index; skip++) { in tomoyo_print_condition()
1276 while (head->r.cond_index < condc) { in tomoyo_print_condition()
1281 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1284 head->r.cond_index++; in tomoyo_print_condition()
1285 tomoyo_set_space(head); in tomoyo_print_condition()
1288 tomoyo_io_printf(head, in tomoyo_print_condition()
1291 tomoyo_set_string(head, in tomoyo_print_condition()
1293 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1297 tomoyo_set_string(head, in tomoyo_print_condition()
1299 tomoyo_set_string(head, in tomoyo_print_condition()
1301 tomoyo_io_printf(head, "\"]%s=", envp->is_not ? "!" : ""); in tomoyo_print_condition()
1303 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1304 tomoyo_set_string(head, envp->value->name); in tomoyo_print_condition()
1305 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1307 tomoyo_set_string(head, in tomoyo_print_condition()
1314 (head, numbers_p++); in tomoyo_print_condition()
1317 tomoyo_set_string(head, in tomoyo_print_condition()
1321 tomoyo_set_string(head, match ? "=" : "!="); in tomoyo_print_condition()
1325 (head, names_p++); in tomoyo_print_condition()
1329 (head, numbers_p++); in tomoyo_print_condition()
1332 tomoyo_set_string(head, in tomoyo_print_condition()
1338 head->r.cond_step++; in tomoyo_print_condition()
1341 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1343 head->r.cond_step++; in tomoyo_print_condition()
1347 tomoyo_io_printf(head, " grant_log=%s", in tomoyo_print_condition()
1350 tomoyo_set_lf(head); in tomoyo_print_condition()
1364 static void tomoyo_set_group(struct tomoyo_io_buffer *head, in tomoyo_set_group() argument
1367 if (head->type == TOMOYO_EXCEPTIONPOLICY) { in tomoyo_set_group()
1368 tomoyo_print_namespace(head); in tomoyo_set_group()
1369 tomoyo_io_printf(head, "acl_group %u ", in tomoyo_set_group()
1370 head->r.acl_group_index); in tomoyo_set_group()
1372 tomoyo_set_string(head, category); in tomoyo_set_group()
1383 static bool tomoyo_print_entry(struct tomoyo_io_buffer *head, in tomoyo_print_entry() argument
1390 if (head->r.print_cond_part) in tomoyo_print_entry()
1394 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1398 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1404 if (head->r.print_transition_related_only && in tomoyo_print_entry()
1408 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1411 tomoyo_set_slash(head); in tomoyo_print_entry()
1413 tomoyo_set_string(head, tomoyo_path_keyword[bit]); in tomoyo_print_entry()
1417 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1420 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1422 tomoyo_set_group(head, "task "); in tomoyo_print_entry()
1423 tomoyo_set_string(head, "manual_domain_transition "); in tomoyo_print_entry()
1424 tomoyo_set_string(head, ptr->domainname->name); in tomoyo_print_entry()
1425 } else if (head->r.print_transition_related_only) { in tomoyo_print_entry()
1429 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1436 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1439 tomoyo_set_slash(head); in tomoyo_print_entry()
1441 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1446 tomoyo_print_name_union(head, &ptr->name1); in tomoyo_print_entry()
1447 tomoyo_print_name_union(head, &ptr->name2); in tomoyo_print_entry()
1450 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1457 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1460 tomoyo_set_slash(head); in tomoyo_print_entry()
1462 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1467 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1468 tomoyo_print_number_union(head, &ptr->number); in tomoyo_print_entry()
1471 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1478 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1481 tomoyo_set_slash(head); in tomoyo_print_entry()
1483 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1488 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1489 tomoyo_print_number_union(head, &ptr->mode); in tomoyo_print_entry()
1490 tomoyo_print_number_union(head, &ptr->major); in tomoyo_print_entry()
1491 tomoyo_print_number_union(head, &ptr->minor); in tomoyo_print_entry()
1494 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1501 tomoyo_set_group(head, "network inet "); in tomoyo_print_entry()
1502 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1504 tomoyo_set_space(head); in tomoyo_print_entry()
1507 tomoyo_set_slash(head); in tomoyo_print_entry()
1509 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1513 tomoyo_set_space(head); in tomoyo_print_entry()
1515 tomoyo_set_string(head, "@"); in tomoyo_print_entry()
1516 tomoyo_set_string(head, ptr->address.group->group_name in tomoyo_print_entry()
1522 tomoyo_io_printf(head, "%s", buf); in tomoyo_print_entry()
1524 tomoyo_print_number_union(head, &ptr->port); in tomoyo_print_entry()
1527 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1534 tomoyo_set_group(head, "network unix "); in tomoyo_print_entry()
1535 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1537 tomoyo_set_space(head); in tomoyo_print_entry()
1540 tomoyo_set_slash(head); in tomoyo_print_entry()
1542 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1546 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1549 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1551 tomoyo_set_group(head, "file mount"); in tomoyo_print_entry()
1552 tomoyo_print_name_union(head, &ptr->dev_name); in tomoyo_print_entry()
1553 tomoyo_print_name_union(head, &ptr->dir_name); in tomoyo_print_entry()
1554 tomoyo_print_name_union(head, &ptr->fs_type); in tomoyo_print_entry()
1555 tomoyo_print_number_union(head, &ptr->flags); in tomoyo_print_entry()
1558 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1560 tomoyo_set_group(head, "misc env "); in tomoyo_print_entry()
1561 tomoyo_set_string(head, ptr->env->name); in tomoyo_print_entry()
1564 head->r.print_cond_part = true; in tomoyo_print_entry()
1565 head->r.cond_step = 0; in tomoyo_print_entry()
1566 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1569 if (!tomoyo_print_condition(head, acl->cond)) in tomoyo_print_entry()
1571 head->r.print_cond_part = false; in tomoyo_print_entry()
1573 tomoyo_set_lf(head); in tomoyo_print_entry()
1588 static bool tomoyo_read_domain2(struct tomoyo_io_buffer *head, in tomoyo_read_domain2() argument
1591 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_domain2()
1593 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_domain2()
1595 if (!tomoyo_print_entry(head, ptr)) in tomoyo_read_domain2()
1598 head->r.acl = NULL; in tomoyo_read_domain2()
1609 static void tomoyo_read_domain(struct tomoyo_io_buffer *head) in tomoyo_read_domain() argument
1611 if (head->r.eof) in tomoyo_read_domain()
1613 list_for_each_cookie(head->r.domain, &tomoyo_domain_list) { in tomoyo_read_domain()
1615 list_entry(head->r.domain, typeof(*domain), list); in tomoyo_read_domain()
1618 switch (head->r.step) { in tomoyo_read_domain()
1621 !head->r.print_this_domain_only) in tomoyo_read_domain()
1624 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_domain()
1625 tomoyo_set_lf(head); in tomoyo_read_domain()
1626 tomoyo_io_printf(head, "use_profile %u\n", in tomoyo_read_domain()
1630 tomoyo_set_string(head, tomoyo_dif[i]); in tomoyo_read_domain()
1631 head->r.index = 0; in tomoyo_read_domain()
1632 head->r.step++; in tomoyo_read_domain()
1635 while (head->r.index < TOMOYO_MAX_ACL_GROUPS) { in tomoyo_read_domain()
1636 i = head->r.index++; in tomoyo_read_domain()
1639 tomoyo_io_printf(head, "use_group %u\n", i); in tomoyo_read_domain()
1640 if (!tomoyo_flush(head)) in tomoyo_read_domain()
1643 head->r.index = 0; in tomoyo_read_domain()
1644 head->r.step++; in tomoyo_read_domain()
1645 tomoyo_set_lf(head); in tomoyo_read_domain()
1648 if (!tomoyo_read_domain2(head, &domain->acl_info_list)) in tomoyo_read_domain()
1650 head->r.step++; in tomoyo_read_domain()
1651 if (!tomoyo_set_lf(head)) in tomoyo_read_domain()
1655 head->r.step = 0; in tomoyo_read_domain()
1656 if (head->r.print_this_domain_only) in tomoyo_read_domain()
1661 head->r.eof = true; in tomoyo_read_domain()
1671 static int tomoyo_write_pid(struct tomoyo_io_buffer *head) in tomoyo_write_pid() argument
1673 head->r.eof = false; in tomoyo_write_pid()
1687 static void tomoyo_read_pid(struct tomoyo_io_buffer *head) in tomoyo_read_pid() argument
1689 char *buf = head->write_buf; in tomoyo_read_pid()
1697 head->r.eof = true; in tomoyo_read_pid()
1700 if (head->r.w_pos || head->r.eof) in tomoyo_read_pid()
1702 head->r.eof = true; in tomoyo_read_pid()
1717 tomoyo_io_printf(head, "%u %u ", pid, domain->profile); in tomoyo_read_pid()
1718 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_pid()
1747 static int tomoyo_write_exception(struct tomoyo_io_buffer *head) in tomoyo_write_exception() argument
1749 const bool is_delete = head->w.is_delete; in tomoyo_write_exception()
1751 .ns = head->w.ns, in tomoyo_write_exception()
1753 .data = head->write_buf, in tomoyo_write_exception()
1772 (head->w.ns, &head->w.ns->acl_group[group], in tomoyo_write_exception()
1788 static bool tomoyo_read_group(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_group() argument
1791 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_group()
1794 list_for_each_cookie(head->r.group, list) { in tomoyo_read_group()
1796 list_entry(head->r.group, typeof(*group), head.list); in tomoyo_read_group()
1798 list_for_each_cookie(head->r.acl, &group->member_list) { in tomoyo_read_group()
1800 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_group()
1804 if (!tomoyo_flush(head)) in tomoyo_read_group()
1806 tomoyo_print_namespace(head); in tomoyo_read_group()
1807 tomoyo_set_string(head, tomoyo_group_name[idx]); in tomoyo_read_group()
1808 tomoyo_set_string(head, group->group_name->name); in tomoyo_read_group()
1810 tomoyo_set_space(head); in tomoyo_read_group()
1811 tomoyo_set_string(head, container_of in tomoyo_read_group()
1813 head)->member_name->name); in tomoyo_read_group()
1815 tomoyo_print_number_union(head, &container_of in tomoyo_read_group()
1818 head)->number); in tomoyo_read_group()
1823 head); in tomoyo_read_group()
1827 tomoyo_io_printf(head, " %s", buffer); in tomoyo_read_group()
1829 tomoyo_set_lf(head); in tomoyo_read_group()
1831 head->r.acl = NULL; in tomoyo_read_group()
1833 head->r.group = NULL; in tomoyo_read_group()
1847 static bool tomoyo_read_policy(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_policy() argument
1850 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_policy()
1853 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_policy()
1855 container_of(head->r.acl, typeof(*acl), list); in tomoyo_read_policy()
1858 if (!tomoyo_flush(head)) in tomoyo_read_policy()
1864 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1866 tomoyo_print_namespace(head); in tomoyo_read_policy()
1867 tomoyo_set_string(head, tomoyo_transition_type in tomoyo_read_policy()
1869 tomoyo_set_string(head, ptr->program ? in tomoyo_read_policy()
1871 tomoyo_set_string(head, " from "); in tomoyo_read_policy()
1872 tomoyo_set_string(head, ptr->domainname ? in tomoyo_read_policy()
1880 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1882 tomoyo_print_namespace(head); in tomoyo_read_policy()
1883 tomoyo_set_string(head, "aggregator "); in tomoyo_read_policy()
1884 tomoyo_set_string(head, in tomoyo_read_policy()
1886 tomoyo_set_space(head); in tomoyo_read_policy()
1887 tomoyo_set_string(head, in tomoyo_read_policy()
1894 tomoyo_set_lf(head); in tomoyo_read_policy()
1896 head->r.acl = NULL; in tomoyo_read_policy()
1907 static void tomoyo_read_exception(struct tomoyo_io_buffer *head) in tomoyo_read_exception() argument
1910 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_exception()
1912 if (head->r.eof) in tomoyo_read_exception()
1914 while (head->r.step < TOMOYO_MAX_POLICY && in tomoyo_read_exception()
1915 tomoyo_read_policy(head, head->r.step)) in tomoyo_read_exception()
1916 head->r.step++; in tomoyo_read_exception()
1917 if (head->r.step < TOMOYO_MAX_POLICY) in tomoyo_read_exception()
1919 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP && in tomoyo_read_exception()
1920 tomoyo_read_group(head, head->r.step - TOMOYO_MAX_POLICY)) in tomoyo_read_exception()
1921 head->r.step++; in tomoyo_read_exception()
1922 if (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP) in tomoyo_read_exception()
1924 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP in tomoyo_read_exception()
1926 head->r.acl_group_index = head->r.step - TOMOYO_MAX_POLICY in tomoyo_read_exception()
1928 if (!tomoyo_read_domain2(head, &ns->acl_group in tomoyo_read_exception()
1929 [head->r.acl_group_index])) in tomoyo_read_exception()
1931 head->r.step++; in tomoyo_read_exception()
1933 head->r.eof = true; in tomoyo_read_exception()
2193 static void tomoyo_read_query(struct tomoyo_io_buffer *head) in tomoyo_read_query() argument
2200 if (head->r.w_pos) in tomoyo_read_query()
2202 kfree(head->read_buf); in tomoyo_read_query()
2203 head->read_buf = NULL; in tomoyo_read_query()
2208 if (pos++ != head->r.query_index) in tomoyo_read_query()
2215 head->r.query_index = 0; in tomoyo_read_query()
2226 if (pos++ != head->r.query_index) in tomoyo_read_query()
2239 head->read_buf = buf; in tomoyo_read_query()
2240 head->r.w[head->r.w_pos++] = buf; in tomoyo_read_query()
2241 head->r.query_index++; in tomoyo_read_query()
2254 static int tomoyo_write_answer(struct tomoyo_io_buffer *head) in tomoyo_write_answer() argument
2256 char *data = head->write_buf; in tomoyo_write_answer()
2293 static void tomoyo_read_version(struct tomoyo_io_buffer *head) in tomoyo_read_version() argument
2295 if (!head->r.eof) { in tomoyo_read_version()
2296 tomoyo_io_printf(head, "2.6.0"); in tomoyo_read_version()
2297 head->r.eof = true; in tomoyo_read_version()
2341 static void tomoyo_read_stat(struct tomoyo_io_buffer *head) in tomoyo_read_stat() argument
2346 if (head->r.eof) in tomoyo_read_stat()
2349 tomoyo_io_printf(head, "Policy %-30s %10u", in tomoyo_read_stat()
2356 tomoyo_io_printf(head, " (Last: %04u/%02u/%02u %02u:%02u:%02u)", in tomoyo_read_stat()
2360 tomoyo_set_lf(head); in tomoyo_read_stat()
2366 tomoyo_io_printf(head, "Memory used by %-22s %10u", in tomoyo_read_stat()
2370 tomoyo_io_printf(head, " (Quota: %10u)", used); in tomoyo_read_stat()
2371 tomoyo_set_lf(head); in tomoyo_read_stat()
2373 tomoyo_io_printf(head, "Total memory used: %10u\n", in tomoyo_read_stat()
2375 head->r.eof = true; in tomoyo_read_stat()
2385 static int tomoyo_write_stat(struct tomoyo_io_buffer *head) in tomoyo_write_stat() argument
2387 char *data = head->write_buf; in tomoyo_write_stat()
2407 struct tomoyo_io_buffer *head = kzalloc(sizeof(*head), GFP_NOFS); in tomoyo_open_control() local
2409 if (!head) in tomoyo_open_control()
2411 mutex_init(&head->io_sem); in tomoyo_open_control()
2412 head->type = type; in tomoyo_open_control()
2416 head->write = tomoyo_write_domain; in tomoyo_open_control()
2417 head->read = tomoyo_read_domain; in tomoyo_open_control()
2421 head->write = tomoyo_write_exception; in tomoyo_open_control()
2422 head->read = tomoyo_read_exception; in tomoyo_open_control()
2426 head->poll = tomoyo_poll_log; in tomoyo_open_control()
2427 head->read = tomoyo_read_log; in tomoyo_open_control()
2431 head->write = tomoyo_write_pid; in tomoyo_open_control()
2432 head->read = tomoyo_read_pid; in tomoyo_open_control()
2436 head->read = tomoyo_read_version; in tomoyo_open_control()
2437 head->readbuf_size = 128; in tomoyo_open_control()
2441 head->write = tomoyo_write_stat; in tomoyo_open_control()
2442 head->read = tomoyo_read_stat; in tomoyo_open_control()
2443 head->readbuf_size = 1024; in tomoyo_open_control()
2447 head->write = tomoyo_write_profile; in tomoyo_open_control()
2448 head->read = tomoyo_read_profile; in tomoyo_open_control()
2451 head->poll = tomoyo_poll_query; in tomoyo_open_control()
2452 head->write = tomoyo_write_answer; in tomoyo_open_control()
2453 head->read = tomoyo_read_query; in tomoyo_open_control()
2457 head->write = tomoyo_write_manager; in tomoyo_open_control()
2458 head->read = tomoyo_read_manager; in tomoyo_open_control()
2466 head->read = NULL; in tomoyo_open_control()
2467 head->poll = NULL; in tomoyo_open_control()
2468 } else if (!head->poll) { in tomoyo_open_control()
2470 if (!head->readbuf_size) in tomoyo_open_control()
2471 head->readbuf_size = 4096 * 2; in tomoyo_open_control()
2472 head->read_buf = kzalloc(head->readbuf_size, GFP_NOFS); in tomoyo_open_control()
2473 if (!head->read_buf) { in tomoyo_open_control()
2474 kfree(head); in tomoyo_open_control()
2483 head->write = NULL; in tomoyo_open_control()
2484 } else if (head->write) { in tomoyo_open_control()
2485 head->writebuf_size = 4096 * 2; in tomoyo_open_control()
2486 head->write_buf = kzalloc(head->writebuf_size, GFP_NOFS); in tomoyo_open_control()
2487 if (!head->write_buf) { in tomoyo_open_control()
2488 kfree(head->read_buf); in tomoyo_open_control()
2489 kfree(head); in tomoyo_open_control()
2501 file->private_data = head; in tomoyo_open_control()
2502 tomoyo_notify_gc(head, true); in tomoyo_open_control()
2517 struct tomoyo_io_buffer *head = file->private_data; in tomoyo_poll_control() local
2519 if (head->poll) in tomoyo_poll_control()
2520 return head->poll(file, wait) | EPOLLOUT | EPOLLWRNORM; in tomoyo_poll_control()
2531 static inline void tomoyo_set_namespace_cursor(struct tomoyo_io_buffer *head) in tomoyo_set_namespace_cursor() argument
2535 if (head->type != TOMOYO_EXCEPTIONPOLICY && in tomoyo_set_namespace_cursor()
2536 head->type != TOMOYO_PROFILE) in tomoyo_set_namespace_cursor()
2542 ns = head->r.ns; in tomoyo_set_namespace_cursor()
2543 if (!ns || (head->r.eof && ns->next != &tomoyo_namespace_list)) { in tomoyo_set_namespace_cursor()
2545 memset(&head->r, 0, sizeof(head->r)); in tomoyo_set_namespace_cursor()
2546 head->r.ns = ns ? ns->next : tomoyo_namespace_list.next; in tomoyo_set_namespace_cursor()
2557 static inline bool tomoyo_has_more_namespace(struct tomoyo_io_buffer *head) in tomoyo_has_more_namespace() argument
2559 return (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_has_more_namespace()
2560 head->type == TOMOYO_PROFILE) && head->r.eof && in tomoyo_has_more_namespace()
2561 head->r.ns->next != &tomoyo_namespace_list; in tomoyo_has_more_namespace()
2573 ssize_t tomoyo_read_control(struct tomoyo_io_buffer *head, char __user *buffer, in tomoyo_read_control() argument
2579 if (!head->read) in tomoyo_read_control()
2581 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_read_control()
2583 head->read_user_buf = buffer; in tomoyo_read_control()
2584 head->read_user_buf_avail = buffer_len; in tomoyo_read_control()
2586 if (tomoyo_flush(head)) in tomoyo_read_control()
2589 tomoyo_set_namespace_cursor(head); in tomoyo_read_control()
2590 head->read(head); in tomoyo_read_control()
2591 } while (tomoyo_flush(head) && in tomoyo_read_control()
2592 tomoyo_has_more_namespace(head)); in tomoyo_read_control()
2594 len = head->read_user_buf - buffer; in tomoyo_read_control()
2595 mutex_unlock(&head->io_sem); in tomoyo_read_control()
2609 static int tomoyo_parse_policy(struct tomoyo_io_buffer *head, char *line) in tomoyo_parse_policy() argument
2612 head->w.is_delete = !strncmp(line, "delete ", 7); in tomoyo_parse_policy()
2613 if (head->w.is_delete) in tomoyo_parse_policy()
2616 if (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_parse_policy()
2617 head->type == TOMOYO_PROFILE) { in tomoyo_parse_policy()
2623 head->w.ns = tomoyo_assign_namespace(line); in tomoyo_parse_policy()
2626 head->w.ns = NULL; in tomoyo_parse_policy()
2628 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_parse_policy()
2630 if (!head->w.ns) in tomoyo_parse_policy()
2634 return head->write(head); in tomoyo_parse_policy()
2646 ssize_t tomoyo_write_control(struct tomoyo_io_buffer *head, in tomoyo_write_control() argument
2651 char *cp0 = head->write_buf; in tomoyo_write_control()
2654 if (!head->write) in tomoyo_write_control()
2656 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_write_control()
2658 head->read_user_buf_avail = 0; in tomoyo_write_control()
2664 if (head->w.avail >= head->writebuf_size - 1) { in tomoyo_write_control()
2665 const int len = head->writebuf_size * 2; in tomoyo_write_control()
2672 memmove(cp, cp0, head->w.avail); in tomoyo_write_control()
2674 head->write_buf = cp; in tomoyo_write_control()
2676 head->writebuf_size = len; in tomoyo_write_control()
2684 cp0[head->w.avail++] = c; in tomoyo_write_control()
2687 cp0[head->w.avail - 1] = '\0'; in tomoyo_write_control()
2688 head->w.avail = 0; in tomoyo_write_control()
2691 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_write_control()
2692 head->w.domain = NULL; in tomoyo_write_control()
2693 memset(&head->r, 0, sizeof(head->r)); in tomoyo_write_control()
2697 switch (head->type) { in tomoyo_write_control()
2702 if (tomoyo_select_domain(head, cp0)) in tomoyo_write_control()
2707 head->r.print_transition_related_only = true; in tomoyo_write_control()
2717 switch (tomoyo_parse_policy(head, cp0)) { in tomoyo_write_control()
2722 switch (head->type) { in tomoyo_write_control()
2738 mutex_unlock(&head->io_sem); in tomoyo_write_control()
2747 void tomoyo_close_control(struct tomoyo_io_buffer *head) in tomoyo_close_control() argument
2753 if (head->type == TOMOYO_QUERY && in tomoyo_close_control()
2756 tomoyo_notify_gc(head, false); in tomoyo_close_control()
2824 struct tomoyo_io_buffer head = { }; in tomoyo_load_builtin_policy() local
2830 head.type = TOMOYO_PROFILE; in tomoyo_load_builtin_policy()
2831 head.write = tomoyo_write_profile; in tomoyo_load_builtin_policy()
2835 head.type = TOMOYO_EXCEPTIONPOLICY; in tomoyo_load_builtin_policy()
2836 head.write = tomoyo_write_exception; in tomoyo_load_builtin_policy()
2840 head.type = TOMOYO_DOMAINPOLICY; in tomoyo_load_builtin_policy()
2841 head.write = tomoyo_write_domain; in tomoyo_load_builtin_policy()
2845 head.type = TOMOYO_MANAGER; in tomoyo_load_builtin_policy()
2846 head.write = tomoyo_write_manager; in tomoyo_load_builtin_policy()
2850 head.type = TOMOYO_STAT; in tomoyo_load_builtin_policy()
2851 head.write = tomoyo_write_stat; in tomoyo_load_builtin_policy()
2861 head.write_buf = start; in tomoyo_load_builtin_policy()
2862 tomoyo_parse_policy(&head, start); in tomoyo_load_builtin_policy()