• Home
  • Raw
  • Download

Lines Matching full:head

208  * @head:   Pointer to "struct tomoyo_io_buffer".
212 static bool tomoyo_flush(struct tomoyo_io_buffer *head) in tomoyo_flush() argument
214 while (head->r.w_pos) { in tomoyo_flush()
215 const char *w = head->r.w[0]; in tomoyo_flush()
218 if (len > head->read_user_buf_avail) in tomoyo_flush()
219 len = head->read_user_buf_avail; in tomoyo_flush()
222 if (copy_to_user(head->read_user_buf, w, len)) in tomoyo_flush()
224 head->read_user_buf_avail -= len; in tomoyo_flush()
225 head->read_user_buf += len; in tomoyo_flush()
228 head->r.w[0] = w; in tomoyo_flush()
232 if (head->poll) { in tomoyo_flush()
233 if (!head->read_user_buf_avail || in tomoyo_flush()
234 copy_to_user(head->read_user_buf, "", 1)) in tomoyo_flush()
236 head->read_user_buf_avail--; in tomoyo_flush()
237 head->read_user_buf++; in tomoyo_flush()
239 head->r.w_pos--; in tomoyo_flush()
240 for (len = 0; len < head->r.w_pos; len++) in tomoyo_flush()
241 head->r.w[len] = head->r.w[len + 1]; in tomoyo_flush()
243 head->r.avail = 0; in tomoyo_flush()
250 * @head: Pointer to "struct tomoyo_io_buffer".
253 * Note that @string has to be kept valid until @head is kfree()d.
257 static void tomoyo_set_string(struct tomoyo_io_buffer *head, const char *string) in tomoyo_set_string() argument
259 if (head->r.w_pos < TOMOYO_MAX_IO_READ_QUEUE) { in tomoyo_set_string()
260 head->r.w[head->r.w_pos++] = string; in tomoyo_set_string()
261 tomoyo_flush(head); in tomoyo_set_string()
266 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt,
272 * @head: Pointer to "struct tomoyo_io_buffer".
275 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, in tomoyo_io_printf() argument
280 size_t pos = head->r.avail; in tomoyo_io_printf()
281 int size = head->readbuf_size - pos; in tomoyo_io_printf()
285 len = vsnprintf(head->read_buf + pos, size, fmt, args) + 1; in tomoyo_io_printf()
287 if (pos + len >= head->readbuf_size) { in tomoyo_io_printf()
291 head->r.avail += len; in tomoyo_io_printf()
292 tomoyo_set_string(head, head->read_buf + pos); in tomoyo_io_printf()
298 * @head: Pointer to "struct tomoyo_io_buffer".
302 static void tomoyo_set_space(struct tomoyo_io_buffer *head) in tomoyo_set_space() argument
304 tomoyo_set_string(head, " "); in tomoyo_set_space()
310 * @head: Pointer to "struct tomoyo_io_buffer".
314 static bool tomoyo_set_lf(struct tomoyo_io_buffer *head) in tomoyo_set_lf() argument
316 tomoyo_set_string(head, "\n"); in tomoyo_set_lf()
317 return !head->r.w_pos; in tomoyo_set_lf()
323 * @head: Pointer to "struct tomoyo_io_buffer".
327 static void tomoyo_set_slash(struct tomoyo_io_buffer *head) in tomoyo_set_slash() argument
329 tomoyo_set_string(head, "/"); in tomoyo_set_slash()
361 * @head: Pointer to "struct tomoyo_io_buffer".
365 static void tomoyo_print_namespace(struct tomoyo_io_buffer *head) in tomoyo_print_namespace() argument
369 tomoyo_set_string(head, in tomoyo_print_namespace()
370 container_of(head->r.ns, in tomoyo_print_namespace()
373 tomoyo_set_space(head); in tomoyo_print_namespace()
379 * @head: Pointer to "struct tomoyo_io_buffer".
382 static void tomoyo_print_name_union(struct tomoyo_io_buffer *head, in tomoyo_print_name_union() argument
385 tomoyo_set_space(head); in tomoyo_print_name_union()
387 tomoyo_set_string(head, "@"); in tomoyo_print_name_union()
388 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union()
390 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union()
397 * @head: Pointer to "struct tomoyo_io_buffer".
402 static void tomoyo_print_name_union_quoted(struct tomoyo_io_buffer *head, in tomoyo_print_name_union_quoted() argument
406 tomoyo_set_string(head, "@"); in tomoyo_print_name_union_quoted()
407 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union_quoted()
409 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
410 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union_quoted()
411 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
418 * @head: Pointer to "struct tomoyo_io_buffer".
424 (struct tomoyo_io_buffer *head, const struct tomoyo_number_union *ptr) in tomoyo_print_number_union_nospace() argument
427 tomoyo_set_string(head, "@"); in tomoyo_print_number_union_nospace()
428 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_number_union_nospace()
458 tomoyo_io_printf(head, "%s", buffer); in tomoyo_print_number_union_nospace()
465 * @head: Pointer to "struct tomoyo_io_buffer".
470 static void tomoyo_print_number_union(struct tomoyo_io_buffer *head, in tomoyo_print_number_union() argument
473 tomoyo_set_space(head); in tomoyo_print_number_union()
474 tomoyo_print_number_union_nospace(head, ptr); in tomoyo_print_number_union()
657 * @head: Pointer to "struct tomoyo_io_buffer".
661 static int tomoyo_write_profile(struct tomoyo_io_buffer *head) in tomoyo_write_profile() argument
663 char *data = head->write_buf; in tomoyo_write_profile()
667 if (sscanf(data, "PROFILE_VERSION=%u", &head->w.ns->profile_version) in tomoyo_write_profile()
674 profile = tomoyo_assign_profile(head->w.ns, i); in tomoyo_write_profile()
707 * @head: Pointer to "struct tomoyo_io_buffer".
714 static void tomoyo_print_config(struct tomoyo_io_buffer *head, const u8 config) in tomoyo_print_config() argument
716 tomoyo_io_printf(head, "={ mode=%s grant_log=%s reject_log=%s }\n", in tomoyo_print_config()
725 * @head: Pointer to "struct tomoyo_io_buffer".
729 static void tomoyo_read_profile(struct tomoyo_io_buffer *head) in tomoyo_read_profile() argument
733 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_profile()
735 if (head->r.eof) in tomoyo_read_profile()
738 index = head->r.index; in tomoyo_read_profile()
740 switch (head->r.step) { in tomoyo_read_profile()
742 tomoyo_print_namespace(head); in tomoyo_read_profile()
743 tomoyo_io_printf(head, "PROFILE_VERSION=%u\n", in tomoyo_read_profile()
745 head->r.step++; in tomoyo_read_profile()
748 for ( ; head->r.index < TOMOYO_MAX_PROFILES; in tomoyo_read_profile()
749 head->r.index++) in tomoyo_read_profile()
750 if (ns->profile_ptr[head->r.index]) in tomoyo_read_profile()
752 if (head->r.index == TOMOYO_MAX_PROFILES) { in tomoyo_read_profile()
753 head->r.eof = true; in tomoyo_read_profile()
756 head->r.step++; in tomoyo_read_profile()
763 tomoyo_print_namespace(head); in tomoyo_read_profile()
764 tomoyo_io_printf(head, "%u-COMMENT=", index); in tomoyo_read_profile()
765 tomoyo_set_string(head, comment ? comment->name : ""); in tomoyo_read_profile()
766 tomoyo_set_lf(head); in tomoyo_read_profile()
767 tomoyo_print_namespace(head); in tomoyo_read_profile()
768 tomoyo_io_printf(head, "%u-PREFERENCE={ ", index); in tomoyo_read_profile()
770 tomoyo_io_printf(head, "%s=%u ", in tomoyo_read_profile()
773 tomoyo_set_string(head, "}\n"); in tomoyo_read_profile()
774 head->r.step++; in tomoyo_read_profile()
779 tomoyo_print_namespace(head); in tomoyo_read_profile()
780 tomoyo_io_printf(head, "%u-%s", index, "CONFIG"); in tomoyo_read_profile()
781 tomoyo_print_config(head, profile->default_config); in tomoyo_read_profile()
782 head->r.bit = 0; in tomoyo_read_profile()
783 head->r.step++; in tomoyo_read_profile()
787 for ( ; head->r.bit < TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
788 + TOMOYO_MAX_MAC_CATEGORY_INDEX; head->r.bit++) { in tomoyo_read_profile()
789 const u8 i = head->r.bit; in tomoyo_read_profile()
793 tomoyo_print_namespace(head); in tomoyo_read_profile()
795 tomoyo_io_printf(head, "%u-CONFIG::%s::%s", in tomoyo_read_profile()
801 tomoyo_io_printf(head, "%u-CONFIG::%s", index, in tomoyo_read_profile()
803 tomoyo_print_config(head, config); in tomoyo_read_profile()
804 head->r.bit++; in tomoyo_read_profile()
807 if (head->r.bit == TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
809 head->r.index++; in tomoyo_read_profile()
810 head->r.step = 1; in tomoyo_read_profile()
814 if (tomoyo_flush(head)) in tomoyo_read_profile()
829 return container_of(a, struct tomoyo_manager, head)->manager == in tomoyo_same_manager()
830 container_of(b, struct tomoyo_manager, head)->manager; in tomoyo_same_manager()
859 error = tomoyo_update_policy(&e.head, sizeof(e), &param, in tomoyo_update_manager_entry()
869 * @head: Pointer to "struct tomoyo_io_buffer".
875 static int tomoyo_write_manager(struct tomoyo_io_buffer *head) in tomoyo_write_manager() argument
877 char *data = head->write_buf; in tomoyo_write_manager()
880 tomoyo_manage_by_non_root = !head->w.is_delete; in tomoyo_write_manager()
883 return tomoyo_update_manager_entry(data, head->w.is_delete); in tomoyo_write_manager()
889 * @head: Pointer to "struct tomoyo_io_buffer".
893 static void tomoyo_read_manager(struct tomoyo_io_buffer *head) in tomoyo_read_manager() argument
895 if (head->r.eof) in tomoyo_read_manager()
897 list_for_each_cookie(head->r.acl, &tomoyo_kernel_namespace. in tomoyo_read_manager()
900 list_entry(head->r.acl, typeof(*ptr), head.list); in tomoyo_read_manager()
901 if (ptr->head.is_deleted) in tomoyo_read_manager()
903 if (!tomoyo_flush(head)) in tomoyo_read_manager()
905 tomoyo_set_string(head, ptr->manager->name); in tomoyo_read_manager()
906 tomoyo_set_lf(head); in tomoyo_read_manager()
908 head->r.eof = true; in tomoyo_read_manager()
937 policy_list[TOMOYO_ID_MANAGER], head.list) { in tomoyo_manager()
938 if (!ptr->head.is_deleted && in tomoyo_manager()
964 * @head: Pointer to "struct tomoyo_io_buffer".
971 static bool tomoyo_select_domain(struct tomoyo_io_buffer *head, in tomoyo_select_domain() argument
998 head->w.domain = domain; in tomoyo_select_domain()
999 /* Accessing read_buf is safe because head->io_sem is held. */ in tomoyo_select_domain()
1000 if (!head->read_buf) in tomoyo_select_domain()
1002 memset(&head->r, 0, sizeof(head->r)); in tomoyo_select_domain()
1003 head->r.print_this_domain_only = true; in tomoyo_select_domain()
1005 head->r.domain = &domain->list; in tomoyo_select_domain()
1007 head->r.eof = 1; in tomoyo_select_domain()
1008 tomoyo_io_printf(head, "# select %s\n", data); in tomoyo_select_domain()
1010 tomoyo_io_printf(head, "# This is a deleted domain.\n"); in tomoyo_select_domain()
1025 const struct tomoyo_task_acl *p1 = container_of(a, typeof(*p1), head); in tomoyo_same_task_acl()
1026 const struct tomoyo_task_acl *p2 = container_of(b, typeof(*p2), head); in tomoyo_same_task_acl()
1044 .head.type = TOMOYO_TYPE_MANUAL_TASK_ACL, in tomoyo_write_task()
1048 error = tomoyo_update_domain(&e.head, sizeof(e), param, in tomoyo_write_task()
1141 * @head: Pointer to "struct tomoyo_io_buffer".
1147 static int tomoyo_write_domain(struct tomoyo_io_buffer *head) in tomoyo_write_domain() argument
1149 char *data = head->write_buf; in tomoyo_write_domain()
1151 struct tomoyo_domain_info *domain = head->w.domain; in tomoyo_write_domain()
1152 const bool is_delete = head->w.is_delete; in tomoyo_write_domain()
1164 head->w.domain = domain; in tomoyo_write_domain()
1196 * @head: Pointer to "struct tomoyo_io_buffer".
1201 static bool tomoyo_print_condition(struct tomoyo_io_buffer *head, in tomoyo_print_condition() argument
1204 switch (head->r.cond_step) { in tomoyo_print_condition()
1206 head->r.cond_index = 0; in tomoyo_print_condition()
1207 head->r.cond_step++; in tomoyo_print_condition()
1209 tomoyo_set_space(head); in tomoyo_print_condition()
1210 tomoyo_set_string(head, cond->transit->name); in tomoyo_print_condition()
1228 for (skip = 0; skip < head->r.cond_index; skip++) { in tomoyo_print_condition()
1252 while (head->r.cond_index < condc) { in tomoyo_print_condition()
1256 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1259 head->r.cond_index++; in tomoyo_print_condition()
1260 tomoyo_set_space(head); in tomoyo_print_condition()
1263 tomoyo_io_printf(head, in tomoyo_print_condition()
1267 tomoyo_set_string(head, in tomoyo_print_condition()
1269 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1273 tomoyo_set_string(head, in tomoyo_print_condition()
1275 tomoyo_set_string(head, in tomoyo_print_condition()
1277 tomoyo_io_printf(head, "\"]%s=", envp-> in tomoyo_print_condition()
1280 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1281 tomoyo_set_string(head, envp-> in tomoyo_print_condition()
1283 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1285 tomoyo_set_string(head, in tomoyo_print_condition()
1292 (head, numbers_p++); in tomoyo_print_condition()
1295 tomoyo_set_string(head, in tomoyo_print_condition()
1299 tomoyo_set_string(head, match ? "=" : "!="); in tomoyo_print_condition()
1303 (head, names_p++); in tomoyo_print_condition()
1307 (head, numbers_p++); in tomoyo_print_condition()
1310 tomoyo_set_string(head, in tomoyo_print_condition()
1316 head->r.cond_step++; in tomoyo_print_condition()
1319 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1321 head->r.cond_step++; in tomoyo_print_condition()
1325 tomoyo_io_printf(head, " grant_log=%s", in tomoyo_print_condition()
1328 tomoyo_set_lf(head); in tomoyo_print_condition()
1337 * @head: Pointer to "struct tomoyo_io_buffer".
1342 static void tomoyo_set_group(struct tomoyo_io_buffer *head, in tomoyo_set_group() argument
1345 if (head->type == TOMOYO_EXCEPTIONPOLICY) { in tomoyo_set_group()
1346 tomoyo_print_namespace(head); in tomoyo_set_group()
1347 tomoyo_io_printf(head, "acl_group %u ", in tomoyo_set_group()
1348 head->r.acl_group_index); in tomoyo_set_group()
1350 tomoyo_set_string(head, category); in tomoyo_set_group()
1356 * @head: Pointer to "struct tomoyo_io_buffer".
1361 static bool tomoyo_print_entry(struct tomoyo_io_buffer *head, in tomoyo_print_entry() argument
1368 if (head->r.print_cond_part) in tomoyo_print_entry()
1372 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1376 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1381 if (head->r.print_transition_related_only && in tomoyo_print_entry()
1385 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1388 tomoyo_set_slash(head); in tomoyo_print_entry()
1390 tomoyo_set_string(head, tomoyo_path_keyword[bit]); in tomoyo_print_entry()
1394 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1397 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1398 tomoyo_set_group(head, "task "); in tomoyo_print_entry()
1399 tomoyo_set_string(head, "manual_domain_transition "); in tomoyo_print_entry()
1400 tomoyo_set_string(head, ptr->domainname->name); in tomoyo_print_entry()
1401 } else if (head->r.print_transition_related_only) { in tomoyo_print_entry()
1405 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1411 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1414 tomoyo_set_slash(head); in tomoyo_print_entry()
1416 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1421 tomoyo_print_name_union(head, &ptr->name1); in tomoyo_print_entry()
1422 tomoyo_print_name_union(head, &ptr->name2); in tomoyo_print_entry()
1425 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1431 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1434 tomoyo_set_slash(head); in tomoyo_print_entry()
1436 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1441 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1442 tomoyo_print_number_union(head, &ptr->number); in tomoyo_print_entry()
1445 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1451 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1454 tomoyo_set_slash(head); in tomoyo_print_entry()
1456 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1461 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1462 tomoyo_print_number_union(head, &ptr->mode); in tomoyo_print_entry()
1463 tomoyo_print_number_union(head, &ptr->major); in tomoyo_print_entry()
1464 tomoyo_print_number_union(head, &ptr->minor); in tomoyo_print_entry()
1467 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1474 tomoyo_set_group(head, "network inet "); in tomoyo_print_entry()
1475 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1477 tomoyo_set_space(head); in tomoyo_print_entry()
1480 tomoyo_set_slash(head); in tomoyo_print_entry()
1482 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1486 tomoyo_set_space(head); in tomoyo_print_entry()
1488 tomoyo_set_string(head, "@"); in tomoyo_print_entry()
1489 tomoyo_set_string(head, ptr->address.group->group_name in tomoyo_print_entry()
1494 tomoyo_io_printf(head, "%s", buf); in tomoyo_print_entry()
1496 tomoyo_print_number_union(head, &ptr->port); in tomoyo_print_entry()
1499 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1506 tomoyo_set_group(head, "network unix "); in tomoyo_print_entry()
1507 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1509 tomoyo_set_space(head); in tomoyo_print_entry()
1512 tomoyo_set_slash(head); in tomoyo_print_entry()
1514 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1518 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1521 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1522 tomoyo_set_group(head, "file mount"); in tomoyo_print_entry()
1523 tomoyo_print_name_union(head, &ptr->dev_name); in tomoyo_print_entry()
1524 tomoyo_print_name_union(head, &ptr->dir_name); in tomoyo_print_entry()
1525 tomoyo_print_name_union(head, &ptr->fs_type); in tomoyo_print_entry()
1526 tomoyo_print_number_union(head, &ptr->flags); in tomoyo_print_entry()
1529 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1531 tomoyo_set_group(head, "misc env "); in tomoyo_print_entry()
1532 tomoyo_set_string(head, ptr->env->name); in tomoyo_print_entry()
1535 head->r.print_cond_part = true; in tomoyo_print_entry()
1536 head->r.cond_step = 0; in tomoyo_print_entry()
1537 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1540 if (!tomoyo_print_condition(head, acl->cond)) in tomoyo_print_entry()
1542 head->r.print_cond_part = false; in tomoyo_print_entry()
1544 tomoyo_set_lf(head); in tomoyo_print_entry()
1552 * @head: Pointer to "struct tomoyo_io_buffer".
1559 static bool tomoyo_read_domain2(struct tomoyo_io_buffer *head, in tomoyo_read_domain2() argument
1562 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_domain2()
1564 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_domain2()
1565 if (!tomoyo_print_entry(head, ptr)) in tomoyo_read_domain2()
1568 head->r.acl = NULL; in tomoyo_read_domain2()
1575 * @head: Pointer to "struct tomoyo_io_buffer".
1579 static void tomoyo_read_domain(struct tomoyo_io_buffer *head) in tomoyo_read_domain() argument
1581 if (head->r.eof) in tomoyo_read_domain()
1583 list_for_each_cookie(head->r.domain, &tomoyo_domain_list) { in tomoyo_read_domain()
1585 list_entry(head->r.domain, typeof(*domain), list); in tomoyo_read_domain()
1586 switch (head->r.step) { in tomoyo_read_domain()
1590 !head->r.print_this_domain_only) in tomoyo_read_domain()
1593 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_domain()
1594 tomoyo_set_lf(head); in tomoyo_read_domain()
1595 tomoyo_io_printf(head, "use_profile %u\n", in tomoyo_read_domain()
1597 tomoyo_io_printf(head, "use_group %u\n", in tomoyo_read_domain()
1601 tomoyo_set_string(head, tomoyo_dif[i]); in tomoyo_read_domain()
1602 head->r.step++; in tomoyo_read_domain()
1603 tomoyo_set_lf(head); in tomoyo_read_domain()
1606 if (!tomoyo_read_domain2(head, &domain->acl_info_list)) in tomoyo_read_domain()
1608 head->r.step++; in tomoyo_read_domain()
1609 if (!tomoyo_set_lf(head)) in tomoyo_read_domain()
1613 head->r.step = 0; in tomoyo_read_domain()
1614 if (head->r.print_this_domain_only) in tomoyo_read_domain()
1619 head->r.eof = true; in tomoyo_read_domain()
1625 * @head: Pointer to "struct tomoyo_io_buffer".
1629 static int tomoyo_write_pid(struct tomoyo_io_buffer *head) in tomoyo_write_pid() argument
1631 head->r.eof = false; in tomoyo_write_pid()
1638 * @head: Pointer to "struct tomoyo_io_buffer".
1645 static void tomoyo_read_pid(struct tomoyo_io_buffer *head) in tomoyo_read_pid() argument
1647 char *buf = head->write_buf; in tomoyo_read_pid()
1653 /* Accessing write_buf is safe because head->io_sem is held. */ in tomoyo_read_pid()
1655 head->r.eof = true; in tomoyo_read_pid()
1658 if (head->r.w_pos || head->r.eof) in tomoyo_read_pid()
1660 head->r.eof = true; in tomoyo_read_pid()
1674 tomoyo_io_printf(head, "%u %u ", pid, domain->profile); in tomoyo_read_pid()
1675 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_pid()
1698 * @head: Pointer to "struct tomoyo_io_buffer".
1704 static int tomoyo_write_exception(struct tomoyo_io_buffer *head) in tomoyo_write_exception() argument
1706 const bool is_delete = head->w.is_delete; in tomoyo_write_exception()
1708 .ns = head->w.ns, in tomoyo_write_exception()
1710 .data = head->write_buf, in tomoyo_write_exception()
1727 (head->w.ns, &head->w.ns->acl_group[group], in tomoyo_write_exception()
1736 * @head: Pointer to "struct tomoyo_io_buffer".
1743 static bool tomoyo_read_group(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_group() argument
1746 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_group()
1748 list_for_each_cookie(head->r.group, list) { in tomoyo_read_group()
1750 list_entry(head->r.group, typeof(*group), head.list); in tomoyo_read_group()
1751 list_for_each_cookie(head->r.acl, &group->member_list) { in tomoyo_read_group()
1753 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_group()
1756 if (!tomoyo_flush(head)) in tomoyo_read_group()
1758 tomoyo_print_namespace(head); in tomoyo_read_group()
1759 tomoyo_set_string(head, tomoyo_group_name[idx]); in tomoyo_read_group()
1760 tomoyo_set_string(head, group->group_name->name); in tomoyo_read_group()
1762 tomoyo_set_space(head); in tomoyo_read_group()
1763 tomoyo_set_string(head, container_of in tomoyo_read_group()
1765 head)->member_name->name); in tomoyo_read_group()
1767 tomoyo_print_number_union(head, &container_of in tomoyo_read_group()
1770 head)->number); in tomoyo_read_group()
1776 head); in tomoyo_read_group()
1779 tomoyo_io_printf(head, " %s", buffer); in tomoyo_read_group()
1781 tomoyo_set_lf(head); in tomoyo_read_group()
1783 head->r.acl = NULL; in tomoyo_read_group()
1785 head->r.group = NULL; in tomoyo_read_group()
1792 * @head: Pointer to "struct tomoyo_io_buffer".
1799 static bool tomoyo_read_policy(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_policy() argument
1802 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_policy()
1804 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_policy()
1806 container_of(head->r.acl, typeof(*acl), list); in tomoyo_read_policy()
1809 if (!tomoyo_flush(head)) in tomoyo_read_policy()
1815 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1816 tomoyo_print_namespace(head); in tomoyo_read_policy()
1817 tomoyo_set_string(head, tomoyo_transition_type in tomoyo_read_policy()
1819 tomoyo_set_string(head, ptr->program ? in tomoyo_read_policy()
1821 tomoyo_set_string(head, " from "); in tomoyo_read_policy()
1822 tomoyo_set_string(head, ptr->domainname ? in tomoyo_read_policy()
1830 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1831 tomoyo_print_namespace(head); in tomoyo_read_policy()
1832 tomoyo_set_string(head, "aggregator "); in tomoyo_read_policy()
1833 tomoyo_set_string(head, in tomoyo_read_policy()
1835 tomoyo_set_space(head); in tomoyo_read_policy()
1836 tomoyo_set_string(head, in tomoyo_read_policy()
1843 tomoyo_set_lf(head); in tomoyo_read_policy()
1845 head->r.acl = NULL; in tomoyo_read_policy()
1852 * @head: Pointer to "struct tomoyo_io_buffer".
1856 static void tomoyo_read_exception(struct tomoyo_io_buffer *head) in tomoyo_read_exception() argument
1859 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_exception()
1860 if (head->r.eof) in tomoyo_read_exception()
1862 while (head->r.step < TOMOYO_MAX_POLICY && in tomoyo_read_exception()
1863 tomoyo_read_policy(head, head->r.step)) in tomoyo_read_exception()
1864 head->r.step++; in tomoyo_read_exception()
1865 if (head->r.step < TOMOYO_MAX_POLICY) in tomoyo_read_exception()
1867 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP && in tomoyo_read_exception()
1868 tomoyo_read_group(head, head->r.step - TOMOYO_MAX_POLICY)) in tomoyo_read_exception()
1869 head->r.step++; in tomoyo_read_exception()
1870 if (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP) in tomoyo_read_exception()
1872 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP in tomoyo_read_exception()
1874 head->r.acl_group_index = head->r.step - TOMOYO_MAX_POLICY in tomoyo_read_exception()
1876 if (!tomoyo_read_domain2(head, &ns->acl_group in tomoyo_read_exception()
1877 [head->r.acl_group_index])) in tomoyo_read_exception()
1879 head->r.step++; in tomoyo_read_exception()
1881 head->r.eof = true; in tomoyo_read_exception()
2136 * @head: Pointer to "struct tomoyo_io_buffer".
2138 static void tomoyo_read_query(struct tomoyo_io_buffer *head) in tomoyo_read_query() argument
2144 if (head->r.w_pos) in tomoyo_read_query()
2146 if (head->read_buf) { in tomoyo_read_query()
2147 kfree(head->read_buf); in tomoyo_read_query()
2148 head->read_buf = NULL; in tomoyo_read_query()
2153 if (pos++ != head->r.query_index) in tomoyo_read_query()
2160 head->r.query_index = 0; in tomoyo_read_query()
2170 if (pos++ != head->r.query_index) in tomoyo_read_query()
2183 head->read_buf = buf; in tomoyo_read_query()
2184 head->r.w[head->r.w_pos++] = buf; in tomoyo_read_query()
2185 head->r.query_index++; in tomoyo_read_query()
2194 * @head: Pointer to "struct tomoyo_io_buffer".
2198 static int tomoyo_write_answer(struct tomoyo_io_buffer *head) in tomoyo_write_answer() argument
2200 char *data = head->write_buf; in tomoyo_write_answer()
2230 * @head: Pointer to "struct tomoyo_io_buffer".
2234 static void tomoyo_read_version(struct tomoyo_io_buffer *head) in tomoyo_read_version() argument
2236 if (!head->r.eof) { in tomoyo_read_version()
2237 tomoyo_io_printf(head, "2.5.0"); in tomoyo_read_version()
2238 head->r.eof = true; in tomoyo_read_version()
2278 * @head: Pointer to "struct tomoyo_io_buffer".
2282 static void tomoyo_read_stat(struct tomoyo_io_buffer *head) in tomoyo_read_stat() argument
2286 if (head->r.eof) in tomoyo_read_stat()
2289 tomoyo_io_printf(head, "Policy %-30s %10u", in tomoyo_read_stat()
2295 tomoyo_io_printf(head, " (Last: %04u/%02u/%02u " in tomoyo_read_stat()
2300 tomoyo_set_lf(head); in tomoyo_read_stat()
2305 tomoyo_io_printf(head, "Memory used by %-22s %10u", in tomoyo_read_stat()
2309 tomoyo_io_printf(head, " (Quota: %10u)", used); in tomoyo_read_stat()
2310 tomoyo_set_lf(head); in tomoyo_read_stat()
2312 tomoyo_io_printf(head, "Total memory used: %10u\n", in tomoyo_read_stat()
2314 head->r.eof = true; in tomoyo_read_stat()
2320 * @head: Pointer to "struct tomoyo_io_buffer".
2324 static int tomoyo_write_stat(struct tomoyo_io_buffer *head) in tomoyo_write_stat() argument
2326 char *data = head->write_buf; in tomoyo_write_stat()
2345 struct tomoyo_io_buffer *head = kzalloc(sizeof(*head), GFP_NOFS); in tomoyo_open_control() local
2347 if (!head) in tomoyo_open_control()
2349 mutex_init(&head->io_sem); in tomoyo_open_control()
2350 head->type = type; in tomoyo_open_control()
2354 head->write = tomoyo_write_domain; in tomoyo_open_control()
2355 head->read = tomoyo_read_domain; in tomoyo_open_control()
2359 head->write = tomoyo_write_exception; in tomoyo_open_control()
2360 head->read = tomoyo_read_exception; in tomoyo_open_control()
2364 head->poll = tomoyo_poll_log; in tomoyo_open_control()
2365 head->read = tomoyo_read_log; in tomoyo_open_control()
2369 head->write = tomoyo_write_pid; in tomoyo_open_control()
2370 head->read = tomoyo_read_pid; in tomoyo_open_control()
2374 head->read = tomoyo_read_version; in tomoyo_open_control()
2375 head->readbuf_size = 128; in tomoyo_open_control()
2379 head->write = tomoyo_write_stat; in tomoyo_open_control()
2380 head->read = tomoyo_read_stat; in tomoyo_open_control()
2381 head->readbuf_size = 1024; in tomoyo_open_control()
2385 head->write = tomoyo_write_profile; in tomoyo_open_control()
2386 head->read = tomoyo_read_profile; in tomoyo_open_control()
2389 head->poll = tomoyo_poll_query; in tomoyo_open_control()
2390 head->write = tomoyo_write_answer; in tomoyo_open_control()
2391 head->read = tomoyo_read_query; in tomoyo_open_control()
2395 head->write = tomoyo_write_manager; in tomoyo_open_control()
2396 head->read = tomoyo_read_manager; in tomoyo_open_control()
2404 head->read = NULL; in tomoyo_open_control()
2405 head->poll = NULL; in tomoyo_open_control()
2406 } else if (!head->poll) { in tomoyo_open_control()
2408 if (!head->readbuf_size) in tomoyo_open_control()
2409 head->readbuf_size = 4096 * 2; in tomoyo_open_control()
2410 head->read_buf = kzalloc(head->readbuf_size, GFP_NOFS); in tomoyo_open_control()
2411 if (!head->read_buf) { in tomoyo_open_control()
2412 kfree(head); in tomoyo_open_control()
2421 head->write = NULL; in tomoyo_open_control()
2422 } else if (head->write) { in tomoyo_open_control()
2423 head->writebuf_size = 4096 * 2; in tomoyo_open_control()
2424 head->write_buf = kzalloc(head->writebuf_size, GFP_NOFS); in tomoyo_open_control()
2425 if (!head->write_buf) { in tomoyo_open_control()
2426 kfree(head->read_buf); in tomoyo_open_control()
2427 kfree(head); in tomoyo_open_control()
2439 file->private_data = head; in tomoyo_open_control()
2440 tomoyo_notify_gc(head, true); in tomoyo_open_control()
2455 struct tomoyo_io_buffer *head = file->private_data; in tomoyo_poll_control() local
2456 if (head->poll) in tomoyo_poll_control()
2457 return head->poll(file, wait) | EPOLLOUT | EPOLLWRNORM; in tomoyo_poll_control()
2464 * @head: Pointer to "struct tomoyo_io_buffer".
2468 static inline void tomoyo_set_namespace_cursor(struct tomoyo_io_buffer *head) in tomoyo_set_namespace_cursor() argument
2471 if (head->type != TOMOYO_EXCEPTIONPOLICY && in tomoyo_set_namespace_cursor()
2472 head->type != TOMOYO_PROFILE) in tomoyo_set_namespace_cursor()
2478 ns = head->r.ns; in tomoyo_set_namespace_cursor()
2479 if (!ns || (head->r.eof && ns->next != &tomoyo_namespace_list)) { in tomoyo_set_namespace_cursor()
2481 memset(&head->r, 0, sizeof(head->r)); in tomoyo_set_namespace_cursor()
2482 head->r.ns = ns ? ns->next : tomoyo_namespace_list.next; in tomoyo_set_namespace_cursor()
2489 * @head: Pointer to "struct tomoyo_io_buffer".
2493 static inline bool tomoyo_has_more_namespace(struct tomoyo_io_buffer *head) in tomoyo_has_more_namespace() argument
2495 return (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_has_more_namespace()
2496 head->type == TOMOYO_PROFILE) && head->r.eof && in tomoyo_has_more_namespace()
2497 head->r.ns->next != &tomoyo_namespace_list; in tomoyo_has_more_namespace()
2503 * @head: Pointer to "struct tomoyo_io_buffer".
2509 ssize_t tomoyo_read_control(struct tomoyo_io_buffer *head, char __user *buffer, in tomoyo_read_control() argument
2515 if (!head->read) in tomoyo_read_control()
2517 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_read_control()
2519 head->read_user_buf = buffer; in tomoyo_read_control()
2520 head->read_user_buf_avail = buffer_len; in tomoyo_read_control()
2522 if (tomoyo_flush(head)) in tomoyo_read_control()
2525 tomoyo_set_namespace_cursor(head); in tomoyo_read_control()
2526 head->read(head); in tomoyo_read_control()
2527 } while (tomoyo_flush(head) && in tomoyo_read_control()
2528 tomoyo_has_more_namespace(head)); in tomoyo_read_control()
2530 len = head->read_user_buf - buffer; in tomoyo_read_control()
2531 mutex_unlock(&head->io_sem); in tomoyo_read_control()
2538 * @head: Poiter to "struct tomoyo_io_buffer".
2545 static int tomoyo_parse_policy(struct tomoyo_io_buffer *head, char *line) in tomoyo_parse_policy() argument
2548 head->w.is_delete = !strncmp(line, "delete ", 7); in tomoyo_parse_policy()
2549 if (head->w.is_delete) in tomoyo_parse_policy()
2552 if (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_parse_policy()
2553 head->type == TOMOYO_PROFILE) { in tomoyo_parse_policy()
2558 head->w.ns = tomoyo_assign_namespace(line); in tomoyo_parse_policy()
2561 head->w.ns = NULL; in tomoyo_parse_policy()
2563 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_parse_policy()
2565 if (!head->w.ns) in tomoyo_parse_policy()
2569 return head->write(head); in tomoyo_parse_policy()
2575 * @head: Pointer to "struct tomoyo_io_buffer".
2581 ssize_t tomoyo_write_control(struct tomoyo_io_buffer *head, in tomoyo_write_control() argument
2586 char *cp0 = head->write_buf; in tomoyo_write_control()
2588 if (!head->write) in tomoyo_write_control()
2592 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_write_control()
2594 head->read_user_buf_avail = 0; in tomoyo_write_control()
2599 if (head->w.avail >= head->writebuf_size - 1) { in tomoyo_write_control()
2600 const int len = head->writebuf_size * 2; in tomoyo_write_control()
2606 memmove(cp, cp0, head->w.avail); in tomoyo_write_control()
2608 head->write_buf = cp; in tomoyo_write_control()
2610 head->writebuf_size = len; in tomoyo_write_control()
2618 cp0[head->w.avail++] = c; in tomoyo_write_control()
2621 cp0[head->w.avail - 1] = '\0'; in tomoyo_write_control()
2622 head->w.avail = 0; in tomoyo_write_control()
2625 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_write_control()
2626 head->w.domain = NULL; in tomoyo_write_control()
2627 memset(&head->r, 0, sizeof(head->r)); in tomoyo_write_control()
2631 switch (head->type) { in tomoyo_write_control()
2636 if (tomoyo_select_domain(head, cp0)) in tomoyo_write_control()
2641 head->r.print_transition_related_only = true; in tomoyo_write_control()
2651 switch (tomoyo_parse_policy(head, cp0)) { in tomoyo_write_control()
2656 switch (head->type) { in tomoyo_write_control()
2672 mutex_unlock(&head->io_sem); in tomoyo_write_control()
2679 * @head: Pointer to "struct tomoyo_io_buffer".
2681 void tomoyo_close_control(struct tomoyo_io_buffer *head) in tomoyo_close_control() argument
2687 if (head->type == TOMOYO_QUERY && in tomoyo_close_control()
2690 tomoyo_notify_gc(head, false); in tomoyo_close_control()
2743 struct tomoyo_io_buffer head = { }; in tomoyo_load_builtin_policy() local
2748 head.type = TOMOYO_PROFILE; in tomoyo_load_builtin_policy()
2749 head.write = tomoyo_write_profile; in tomoyo_load_builtin_policy()
2753 head.type = TOMOYO_EXCEPTIONPOLICY; in tomoyo_load_builtin_policy()
2754 head.write = tomoyo_write_exception; in tomoyo_load_builtin_policy()
2758 head.type = TOMOYO_DOMAINPOLICY; in tomoyo_load_builtin_policy()
2759 head.write = tomoyo_write_domain; in tomoyo_load_builtin_policy()
2763 head.type = TOMOYO_MANAGER; in tomoyo_load_builtin_policy()
2764 head.write = tomoyo_write_manager; in tomoyo_load_builtin_policy()
2768 head.type = TOMOYO_STAT; in tomoyo_load_builtin_policy()
2769 head.write = tomoyo_write_stat; in tomoyo_load_builtin_policy()
2778 head.write_buf = start; in tomoyo_load_builtin_policy()
2779 tomoyo_parse_policy(&head, start); in tomoyo_load_builtin_policy()