#include <linux/init.h>
#include <linux/vmalloc.h>
#include <rsbac/rkmem.h>
Go to the source code of this file.
|
Definition at line 51 of file lists.h. Referenced by init_module(), register_dev_lists(), register_user_lists(), rsbac_init_acl(), rsbac_init_pm(), rsbac_init_rc(), rsbac_init_um(), rsbac_list_destroy(), rsbac_list_detach(), rsbac_list_lol_destroy(), rsbac_list_lol_detach(), rsbac_list_lol_register(), and rsbac_list_register(). |
|
|
Definition at line 62 of file lists.h. Referenced by create_lol_reg(), and rsbac_init_rc(). |
|
Definition at line 39 of file lists.h. Referenced by read_list(), and read_lol_list(). |
|
Definition at line 45 of file lists.h. Referenced by read_list(), and read_lol_list(). |
|
Definition at line 27 of file lists.h. Referenced by rsbac_list_lol_register(), rsbac_list_register(), rsbac_ta_list_add_ttl(), rsbac_ta_list_lol_add_ttl(), and rsbac_ta_list_lol_subadd_ttl(). |
|
Definition at line 24 of file lists.h. Referenced by create_lol_reg(), create_reg(), fill_buffer(), fill_lol_buffer(), lookup_lol_reg_name(), and lookup_reg_name(). |
|
Definition at line 30 of file lists.h. Referenced by rsbac_list_lol_register(), and rsbac_list_register(). |
|
Definition at line 48 of file lists.h. Referenced by create_lol_reg(), and create_reg(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 7099 of file gen_lists.c. References RSBAC_LIST_TTL_KEEP, and rsbac_ta_list_add_ttl(). Referenced by need_overwrite_func(), register_user_lists(), request_func(), rsbac_adf_log_switch(), rsbac_do_init(), rsbac_init(), rsbac_init_acl(), rsbac_init_rc(), rsbac_kthread_notify(), set_attr_func(), syscall_func(), and write_func(). 07103 { 07104 return rsbac_ta_list_add_ttl(0, handle, RSBAC_LIST_TTL_KEEP, desc, data); 07105 }
|
|
Definition at line 7087 of file gen_lists.c. References rsbac_ta_list_add_ttl(). Referenced by set_attr_fd(). 07092 { 07093 return rsbac_ta_list_add_ttl(0, handle, ttl, desc, data); 07094 }
|
|
Definition at line 5651 of file gen_lists.c. References rsbac_list_reg_item_t::count, rsbac_list_info_t::data_size, rsbac_list_reg_item_t::def_data, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::device, rsbac_list_reg_item_t::dirty, do_remove_item(), rsbac_list_reg_item_t::head, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, rsbac_list_item_t::max_age, rsbac_list_reg_item_t::name, rsbac_list_item_t::next, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_printk(), rsbac_list_reg_item_t::self, and TRUE. 05654 { 05655 struct rsbac_list_reg_item_t * list; 05656 struct rsbac_list_item_t * item_p; 05657 struct rsbac_list_item_t * next_item_p; 05658 u_long lock_flags; 05659 u_long rlock_flags; 05660 u_long tmp_count; 05661 05662 if(!handle) 05663 return -RSBAC_EINVALIDVALUE; 05664 if(!list_initialized) 05665 return -RSBAC_ENOTINITIALIZED; 05666 05667 list = (struct rsbac_list_reg_item_t *) handle; 05668 if(!list || (list->self != list)) 05669 return -RSBAC_EINVALIDVALUE; 05670 05671 rsbac_read_lock(®_head.lock, &rlock_flags); 05672 #ifdef CONFIG_RSBAC_DEBUG 05673 if(rsbac_debug_lists) 05674 rsbac_printk(KERN_DEBUG "rsbac_list_check: checking list %s.\n", 05675 list->name); 05676 #endif 05677 rsbac_write_lock(&list->lock, &lock_flags); 05678 tmp_count = 0; 05679 item_p = list->head; 05680 while(item_p) 05681 { 05682 if( ( item_p->max_age 05683 && (item_p->max_age <= RSBAC_CURRENT_TIME) 05684 ) 05685 || ( list->def_data 05686 && !memcmp(((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 05687 list->def_data, 05688 list->info.data_size) 05689 ) 05690 ) 05691 { 05692 next_item_p = item_p->next; 05693 do_remove_item(list, item_p); 05694 item_p = next_item_p; 05695 list->dirty = TRUE; 05696 } 05697 else 05698 { 05699 tmp_count++; 05700 item_p = item_p->next; 05701 } 05702 } 05703 if(tmp_count != list->count) 05704 { 05705 if(correct) 05706 { 05707 rsbac_printk(KERN_WARNING 05708 "rsbac_list_check(): correcting count mismatch for list %s on device %02u:%02u - was %u, counted %lu!\n", 05709 list->name, RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device), list->count, tmp_count); 05710 list->count = tmp_count; 05711 list->dirty = TRUE; 05712 } 05713 else 05714 { 05715 rsbac_printk(KERN_WARNING 05716 "rsbac_list_check(): count mismatch for list %s on device %02u:%02u - is %u, counted %lu!\n", 05717 list->name, RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device), list->count, tmp_count); 05718 } 05719 } 05720 rsbac_write_unlock(&list->lock, &lock_flags); 05721 rsbac_read_unlock(®_head.lock, &rlock_flags); 05722 return 0; 05723 }
|
|
Definition at line 5055 of file gen_lists.c. Referenced by acl_register_fd_lists(), auth_register_fd_lists(), mac_register_fd_lists(), register_fd_lists(), register_process_lists(), register_user_lists(), rsbac_init_acl(), rsbac_init_pm(), rsbac_init_rc(), and rsbac_list_init(). 05056 { 05057 if( *((__u32*) desc1) < *((__u32*) desc2)) 05058 return -1; 05059 return( *((__u32*) desc1) != *((__u32*) desc2)); 05060 }
|
|
Definition at line 9533 of file gen_lists.c. References rsbac_ta_list_count(). Referenced by register_user_lists(), rsbac_check_acl(), rsbac_init_acl(), rsbac_init_rc(), rsbac_stats(), rsbac_stats_acl(), rsbac_stats_pm(), rsbac_stats_rc(), and rsbac_stats_um(). 09534 { 09535 return rsbac_ta_list_count(0, handle); 09536 }
|
|
Definition at line 6297 of file gen_lists.c. References rsbac_list_reg_item_t::flags, rsbac_list_reg_item_t::info, rsbac_list_info_t::key, list_initialized, rsbac_list_reg_head_t::lock, lookup_reg(), rsbac_list_reg_item_t::name, NULL, proc_rsbac_backup_p, remove_reg(), RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_BACKUP, RSBAC_LIST_PERSIST, and rsbac_printk(). 06298 { 06299 struct rsbac_list_reg_item_t * reg_item_p; 06300 u_long lock_flags; 06301 int err = 0; 06302 06303 if(!handle_p) 06304 return -RSBAC_EINVALIDPOINTER; 06305 if(!*handle_p) 06306 return -RSBAC_EINVALIDVALUE; 06307 if(!list_initialized) 06308 return -RSBAC_ENOTINITIALIZED; 06309 06310 rsbac_write_lock(®_head.lock, &lock_flags); 06311 reg_item_p = lookup_reg((struct rsbac_list_reg_item_t *) *handle_p); 06312 if(!reg_item_p) 06313 { 06314 rsbac_write_unlock(®_head.lock, &lock_flags); 06315 rsbac_printk(KERN_WARNING "rsbac_list_destroy: destroying list failed due to invalid handle!\n"); 06316 return -RSBAC_EINVALIDVALUE; 06317 } 06318 if(reg_item_p->info.key != key) 06319 { 06320 rsbac_write_unlock(®_head.lock, &lock_flags); 06321 rsbac_printk(KERN_WARNING "rsbac_list_destroy: destroying list %s denied due to invalid key!\n", 06322 reg_item_p->name); 06323 return -EPERM; 06324 } 06325 #ifdef CONFIG_RSBAC_DEBUG 06326 if(rsbac_debug_lists) 06327 { 06328 rsbac_printk(KERN_DEBUG "rsbac_list_destroy: destroying list %s.\n", 06329 reg_item_p->name); 06330 } 06331 #endif 06332 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS) 06333 /* delete proc entry, if it exists */ 06334 if( (reg_item_p->flags & RSBAC_LIST_BACKUP) 06335 && reg_item_p->proc_entry_p 06336 ) 06337 { 06338 remove_proc_entry(reg_item_p->name, proc_rsbac_backup_p); 06339 reg_item_p->proc_entry_p = NULL; 06340 } 06341 #endif 06342 06343 #if 0 06344 if(reg_item_p->flags & RSBAC_LIST_PERSIST) 06345 err = unlink_list(reg_item_p); 06346 #endif 06347 06348 remove_reg(reg_item_p); 06349 *handle_p = NULL; 06350 rsbac_write_unlock(®_head.lock, &lock_flags); 06351 return err; 06352 }
|
|
Definition at line 6419 of file gen_lists.c. References rsbac_list_write_item_t::buflen, rsbac_list_write_head_t::count, rsbac_list_reg_item_t::dirty, FALSE, fill_buffer(), rsbac_list_reg_item_t::flags, rsbac_list_write_head_t::head, rsbac_list_reg_item_t::info, rsbac_list_info_t::key, list_initialized, rsbac_list_reg_head_t::lock, lookup_reg(), rsbac_list_reg_item_t::name, rsbac_list_reg_item_t::no_write, NULL, proc_rsbac_backup_p, remove_reg(), RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_ENOTWRITABLE, RSBAC_LIST_BACKUP, RSBAC_LIST_PERSIST, rsbac_list_write_buffers(), rsbac_printk(), rsbac_list_write_head_t::tail, rsbac_list_write_head_t::total, and TRUE. Referenced by aci_detach_fd_lists(), cleanup_module(), and init_module(). 06420 { 06421 struct rsbac_list_reg_item_t * reg_item_p; 06422 u_long lock_flags; 06423 int err = 0; 06424 06425 if(!handle_p) 06426 return -RSBAC_EINVALIDPOINTER; 06427 if(!*handle_p) 06428 return -RSBAC_EINVALIDVALUE; 06429 if(!list_initialized) 06430 return -RSBAC_ENOTINITIALIZED; 06431 06432 rsbac_read_lock(®_head.lock, &lock_flags); 06433 reg_item_p = lookup_reg((struct rsbac_list_reg_item_t *) *handle_p); 06434 if(!reg_item_p) 06435 { 06436 rsbac_read_unlock(®_head.lock, &lock_flags); 06437 rsbac_printk(KERN_WARNING "rsbac_list_detach: detaching list failed due to invalid handle!\n"); 06438 return -RSBAC_EINVALIDVALUE; 06439 } 06440 if(reg_item_p->info.key != key) 06441 { 06442 rsbac_read_unlock(®_head.lock, &lock_flags); 06443 rsbac_printk(KERN_WARNING "rsbac_list_detach: detaching list %s denied due to invalid key %u!\n", 06444 reg_item_p->name, 06445 key); 06446 return -EPERM; 06447 } 06448 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS) 06449 /* delete proc entry, if it exists */ 06450 if( (reg_item_p->flags & RSBAC_LIST_BACKUP) 06451 && reg_item_p->proc_entry_p 06452 ) 06453 { 06454 remove_proc_entry(reg_item_p->name, proc_rsbac_backup_p); 06455 reg_item_p->proc_entry_p = NULL; 06456 } 06457 #endif 06458 #ifndef CONFIG_RSBAC_NO_WRITE 06459 /* final write, if dirty etc. */ 06460 if( (reg_item_p->flags & RSBAC_LIST_PERSIST) 06461 && reg_item_p->dirty 06462 && !reg_item_p->no_write 06463 ) 06464 { 06465 struct rsbac_list_write_head_t write_head; 06466 struct rsbac_list_write_item_t * write_item_p; 06467 06468 reg_item_p->dirty = FALSE; 06469 err = fill_buffer(reg_item_p, &write_item_p); 06470 if(!err) 06471 { 06472 write_head.head = write_item_p; 06473 write_head.tail = write_item_p; 06474 write_head.total = write_item_p->buflen; 06475 write_head.count = 1; 06476 rsbac_read_unlock(®_head.lock, &lock_flags); 06477 rsbac_list_write_buffers(write_head, TRUE); 06478 } 06479 else 06480 { 06481 rsbac_read_unlock(®_head.lock, &lock_flags); 06482 if(err != -RSBAC_ENOTWRITABLE) 06483 { 06484 rsbac_printk(KERN_WARNING 06485 "rsbac_list_detach(): fill_buffer() for list %s returned error %i\n", 06486 reg_item_p->name, err); 06487 } 06488 } 06489 } 06490 else 06491 rsbac_read_unlock(®_head.lock, &lock_flags); 06492 #else 06493 rsbac_read_unlock(®_head.lock, &lock_flags); 06494 #endif 06495 /* disable handle */ 06496 *handle_p = NULL; 06497 /* too bad that the list might have been changed again - we do not care anymore */ 06498 rsbac_write_lock(®_head.lock, &lock_flags); 06499 remove_reg(reg_item_p); 06500 rsbac_write_unlock(®_head.lock, &lock_flags); 06501 return err; 06502 }
|
|
Definition at line 9058 of file gen_lists.c. References rsbac_ta_list_exist(). Referenced by init_module(), rsbac_check_acl(), and rsbac_init_rc(). 09061 { 09062 return rsbac_ta_list_exist(0, handle, desc); 09063 }
|
|
Definition at line 10039 of file gen_lists.c. References rsbac_ta_list_get_all_data(). 10042 { 10043 return rsbac_ta_list_get_all_data(0, handle, array_p); 10044 }
|
|
Definition at line 9659 of file gen_lists.c. References rsbac_ta_list_get_all_desc(). 09662 { 09663 return rsbac_ta_list_get_all_desc(0, handle, array_p); 09664 }
|
|
Definition at line 10494 of file gen_lists.c. References NULL, and rsbac_ta_list_get_all_items_ttl(). 10495 { 10496 return rsbac_ta_list_get_all_items_ttl(0, handle, array_p, NULL); 10497 }
|
|
Definition at line 10483 of file gen_lists.c. References rsbac_ta_list_get_all_items_ttl(). 10487 { 10488 return rsbac_ta_list_get_all_items_ttl(0, handle, array_p, ttl_array_p); 10489 }
|
|
Definition at line 8320 of file gen_lists.c. References NULL, and rsbac_ta_list_get_data_ttl(). Referenced by init_module(), rsbac_do_init(), rsbac_init(), and rsbac_init_debug(). 08321 { 08322 return rsbac_ta_list_get_data_ttl(0, handle, NULL, desc, data); 08323 }
|
|
Definition at line 8309 of file gen_lists.c. References rsbac_ta_list_get_data_ttl(). 08313 { 08314 return rsbac_ta_list_get_data_ttl(0, handle, ttl_p, desc, data); 08315 }
|
|
Definition at line 8901 of file gen_lists.c. References rsbac_ta_list_get_desc(). Referenced by rsbac_rc_get_boot_role(). 08906 { 08907 return rsbac_ta_list_get_desc(0, handle, desc, data, compare); 08908 }
|
|
Definition at line 10287 of file gen_lists.c. References rsbac_list_info_t::data_size, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::info, list_initialized, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, and rsbac_list_reg_item_t::self. 10288 { 10289 struct rsbac_list_reg_item_t * list; 10290 10291 if(!handle) 10292 return -RSBAC_EINVALIDVALUE; 10293 if(!list_initialized) 10294 return -RSBAC_ENOTINITIALIZED; 10295 10296 list = (struct rsbac_list_reg_item_t *) handle; 10297 if(list->self != list) 10298 return -RSBAC_EINVALIDVALUE; 10299 return list->info.desc_size + list->info.data_size; 10300 }
|
|
Definition at line 8643 of file gen_lists.c. References rsbac_ta_list_get_max_desc(). Referenced by rsbac_init_acl(). 08644 { 08645 return rsbac_ta_list_get_max_desc(0, handle, desc); 08646 }
|
|
Definition at line 8728 of file gen_lists.c. References rsbac_ta_list_get_next_desc(). 08729 { 08730 return rsbac_ta_list_get_next_desc(0, handle, old_desc, next_desc); 08731 }
|
|
Definition at line 7482 of file gen_lists.c. References RSBAC_LIST_TTL_KEEP, and rsbac_ta_list_lol_add_ttl(). Referenced by rsbac_init_acl(), rsbac_init_rc(), rsbac_pm_pp_intersec(), and rsbac_pm_pp_union(). 07486 { 07487 return rsbac_ta_list_lol_add_ttl(0, handle, RSBAC_LIST_TTL_KEEP, desc, data); 07488 }
|
|
Definition at line 7470 of file gen_lists.c. References rsbac_ta_list_lol_add_ttl(). 07475 { 07476 return rsbac_ta_list_lol_add_ttl(0, handle, ttl, desc, data); 07477 }
|
|
Definition at line 9442 of file gen_lists.c. References rsbac_ta_list_lol_all_subcount(). Referenced by rsbac_stats_acl(), rsbac_stats_auth(), rsbac_stats_mac(), rsbac_stats_pm(), and rsbac_stats_um(). 09443 { 09444 return rsbac_ta_list_lol_all_subcount(0, handle); 09445 }
|
|
Definition at line 5728 of file gen_lists.c. References rsbac_list_lol_reg_item_t::count, rsbac_list_lol_item_t::count, rsbac_list_lol_info_t::data_size, rsbac_list_lol_reg_item_t::def_data, rsbac_list_lol_reg_item_t::def_subdata, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::device, do_remove_lol_item(), do_remove_lol_subitem(), rsbac_list_lol_reg_item_t::flags, rsbac_list_lol_reg_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, rsbac_list_item_t::max_age, rsbac_list_lol_item_t::max_age, rsbac_list_lol_reg_item_t::name, rsbac_list_item_t::next, rsbac_list_lol_item_t::next, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_DEF_DATA, rsbac_printk(), rsbac_list_lol_reg_item_t::self, rsbac_list_lol_info_t::subdata_size, and rsbac_list_lol_info_t::subdesc_size. 05731 { 05732 struct rsbac_list_lol_reg_item_t * lol_list; 05733 struct rsbac_list_lol_item_t * lol_item_p; 05734 struct rsbac_list_lol_item_t * next_lol_item_p; 05735 struct rsbac_list_item_t * lol_subitem_p; 05736 struct rsbac_list_item_t * next_lol_subitem_p; 05737 u_long lock_flags; 05738 u_long rlock_flags; 05739 u_long tmp_count; 05740 u_long tmp_subcount; 05741 05742 if(!handle) 05743 return -RSBAC_EINVALIDVALUE; 05744 if(!list_initialized) 05745 return -RSBAC_ENOTINITIALIZED; 05746 05747 lol_list = (struct rsbac_list_lol_reg_item_t *) handle; 05748 if(!lol_list || (lol_list->self != lol_list)) 05749 return -RSBAC_EINVALIDVALUE; 05750 05751 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 05752 #ifdef CONFIG_RSBAC_DEBUG 05753 if(rsbac_debug_lists) 05754 rsbac_printk(KERN_DEBUG "rsbac_list_lol_check: checking list %s.\n", 05755 lol_list->name); 05756 #endif 05757 rsbac_write_lock(&lol_list->lock, &lock_flags); 05758 tmp_count = 0; 05759 lol_item_p = lol_list->head; 05760 while(lol_item_p) 05761 { 05762 if( ( lol_item_p->max_age 05763 && (lol_item_p->max_age <= RSBAC_CURRENT_TIME) 05764 ) 05765 || ( lol_list->def_data 05766 && !lol_item_p->count 05767 && !memcmp(((char *) lol_item_p) + sizeof(*lol_item_p) + lol_list->info.desc_size, 05768 lol_list->def_data, 05769 lol_list->info.data_size) 05770 ) 05771 || ( !lol_list->info.data_size 05772 && (lol_list->flags & RSBAC_LIST_DEF_DATA) 05773 && !lol_item_p->count 05774 ) 05775 ) 05776 { 05777 next_lol_item_p = lol_item_p->next; 05778 do_remove_lol_item(lol_list, lol_item_p); 05779 lol_item_p = next_lol_item_p; 05780 } 05781 else 05782 { 05783 tmp_count++; 05784 tmp_subcount = 0; 05785 lol_subitem_p = lol_item_p->head; 05786 while(lol_subitem_p) 05787 { 05788 if( ( lol_subitem_p->max_age 05789 && (lol_subitem_p->max_age <= RSBAC_CURRENT_TIME) 05790 ) 05791 || ( lol_list->def_subdata 05792 && !memcmp(((char *) lol_subitem_p) + sizeof(*lol_subitem_p) + lol_list->info.subdesc_size, 05793 lol_list->def_subdata, 05794 lol_list->info.subdata_size) 05795 ) 05796 ) 05797 { 05798 next_lol_subitem_p = lol_subitem_p->next; 05799 do_remove_lol_subitem(lol_item_p, lol_subitem_p); 05800 lol_subitem_p = next_lol_subitem_p; 05801 } 05802 else 05803 { 05804 tmp_subcount++; 05805 lol_subitem_p = lol_subitem_p->next; 05806 } 05807 } 05808 if(tmp_subcount != lol_item_p->count) 05809 { 05810 if(correct) 05811 { 05812 rsbac_printk(KERN_WARNING 05813 "rsbac_list_lol_check(): correcting count mismatch for list of lists %s sublist on %02u:%02u - was %lu, counted %lu!\n", 05814 lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_item_p->count, tmp_subcount); 05815 lol_item_p->count = tmp_subcount; 05816 } 05817 else 05818 { 05819 rsbac_printk(KERN_WARNING 05820 "rsbac_list_lol_check(): count mismatch for list of lists %s sublist on %02u:%02u - is %lu, counted %lu!\n", 05821 lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_item_p->count, tmp_subcount); 05822 } 05823 } 05824 lol_item_p = lol_item_p->next; 05825 } 05826 } 05827 if(tmp_count != lol_list->count) 05828 { 05829 if(correct) 05830 { 05831 rsbac_printk(KERN_WARNING 05832 "rsbac_list_lol_check(): correcting count mismatch for list of lists %s on %02u:%02u - was %u, counted %lu!\n", 05833 lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_list->count, tmp_count); 05834 lol_list->count = tmp_count; 05835 } 05836 else 05837 { 05838 rsbac_printk(KERN_WARNING 05839 "rsbac_list_lol_check(): count mismatch for list of lists %s on %02u:%02u - is %u, counted %lu!\n", 05840 lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_list->count, tmp_count); 05841 } 05842 } 05843 rsbac_write_unlock(&lol_list->lock, &lock_flags); 05844 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 05845 return 0; 05846 }
|
|
Definition at line 9491 of file gen_lists.c. References rsbac_ta_list_lol_count(). Referenced by rsbac_check_acl(), rsbac_init_acl(), rsbac_stats_acl(), rsbac_stats_auth(), rsbac_stats_mac(), rsbac_stats_pm(), and rsbac_stats_um(). 09492 { 09493 return rsbac_ta_list_lol_count(0, handle); 09494 }
|
|
Definition at line 6357 of file gen_lists.c. References rsbac_list_lol_reg_item_t::flags, rsbac_list_lol_reg_item_t::info, rsbac_list_lol_info_t::key, list_initialized, rsbac_list_lol_reg_head_t::lock, lookup_lol_reg(), rsbac_list_lol_reg_item_t::name, NULL, proc_rsbac_backup_p, remove_lol_reg(), RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_BACKUP, RSBAC_LIST_PERSIST, and rsbac_printk(). 06358 { 06359 struct rsbac_list_lol_reg_item_t * reg_item_p; 06360 u_long lock_flags; 06361 int err = 0; 06362 06363 if(!handle_p) 06364 return -RSBAC_EINVALIDPOINTER; 06365 if(!*handle_p) 06366 return -RSBAC_EINVALIDVALUE; 06367 if(!list_initialized) 06368 return -RSBAC_ENOTINITIALIZED; 06369 06370 rsbac_write_lock(&lol_reg_head.lock, &lock_flags); 06371 reg_item_p = lookup_lol_reg((struct rsbac_list_lol_reg_item_t *) *handle_p); 06372 if(!reg_item_p) 06373 { 06374 rsbac_write_unlock(&lol_reg_head.lock, &lock_flags); 06375 rsbac_printk(KERN_WARNING "rsbac_list_lol_destroy: destroying list failed due to invalid handle!\n"); 06376 return -RSBAC_EINVALIDVALUE; 06377 } 06378 if(reg_item_p->info.key != key) 06379 { 06380 rsbac_write_unlock(&lol_reg_head.lock, &lock_flags); 06381 rsbac_printk(KERN_WARNING "rsbac_list_lol_destroy: destroying list %s denied due to invalid key %u!\n", 06382 reg_item_p->name, 06383 key); 06384 return -EPERM; 06385 } 06386 #ifdef CONFIG_RSBAC_DEBUG 06387 if(rsbac_debug_lists) 06388 { 06389 rsbac_printk(KERN_DEBUG "rsbac_list_lol_destroy: destroying list %s.\n", 06390 reg_item_p->name); 06391 } 06392 #endif 06393 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS) 06394 /* delete proc entry, if it exists */ 06395 if( (reg_item_p->flags & RSBAC_LIST_BACKUP) 06396 && reg_item_p->proc_entry_p 06397 ) 06398 { 06399 remove_proc_entry(reg_item_p->name, proc_rsbac_backup_p); 06400 reg_item_p->proc_entry_p = NULL; 06401 } 06402 #endif 06403 #if 0 06404 if(reg_item_p->flags & RSBAC_LIST_PERSIST) 06405 err = unlink_lol_list(reg_item_p); 06406 #endif 06407 06408 remove_lol_reg(reg_item_p); 06409 *handle_p = NULL; 06410 rsbac_write_unlock(&lol_reg_head.lock, &lock_flags); 06411 return err; 06412 }
|
|
Definition at line 6507 of file gen_lists.c. References rsbac_list_lol_write_item_t::buflen, rsbac_list_lol_write_head_t::count, rsbac_list_lol_reg_item_t::dirty, FALSE, fill_lol_buffer(), rsbac_list_lol_reg_item_t::flags, rsbac_list_lol_write_head_t::head, rsbac_list_lol_reg_item_t::info, rsbac_list_lol_info_t::key, list_initialized, rsbac_list_lol_reg_head_t::lock, lookup_lol_reg(), rsbac_list_lol_reg_item_t::name, rsbac_list_lol_reg_item_t::no_write, NULL, proc_rsbac_backup_p, remove_lol_reg(), RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_ENOTWRITABLE, RSBAC_LIST_BACKUP, RSBAC_LIST_PERSIST, rsbac_list_write_lol_buffers(), rsbac_printk(), rsbac_list_lol_write_head_t::tail, rsbac_list_lol_write_head_t::total, and TRUE. Referenced by acl_detach_fd_lists(), auth_detach_fd_lists(), and mac_detach_fd_lists(). 06508 { 06509 struct rsbac_list_lol_reg_item_t * reg_item_p; 06510 u_long lock_flags; 06511 int err = 0; 06512 06513 if(!handle_p) 06514 return -RSBAC_EINVALIDPOINTER; 06515 if(!*handle_p) 06516 return -RSBAC_EINVALIDVALUE; 06517 if(!list_initialized) 06518 return -RSBAC_ENOTINITIALIZED; 06519 06520 rsbac_read_lock(&lol_reg_head.lock, &lock_flags); 06521 reg_item_p = lookup_lol_reg((struct rsbac_list_lol_reg_item_t *) *handle_p); 06522 if(!reg_item_p) 06523 { 06524 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06525 rsbac_printk(KERN_WARNING "rsbac_list_lol_detach: detaching list failed due to invalid handle!\n"); 06526 return -RSBAC_EINVALIDVALUE; 06527 } 06528 if(reg_item_p->info.key != key) 06529 { 06530 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06531 rsbac_printk(KERN_WARNING "rsbac_list_lol_detach: detaching list %s denied due to invalid key %u!\n", 06532 reg_item_p->name, 06533 key); 06534 return -EPERM; 06535 } 06536 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS) 06537 /* delete proc entry, if it exists */ 06538 if( (reg_item_p->flags & RSBAC_LIST_BACKUP) 06539 && reg_item_p->proc_entry_p 06540 ) 06541 { 06542 remove_proc_entry(reg_item_p->name, proc_rsbac_backup_p); 06543 reg_item_p->proc_entry_p = NULL; 06544 } 06545 #endif 06546 #ifndef CONFIG_RSBAC_NO_WRITE 06547 /* final write, if dirty etc. */ 06548 if( (reg_item_p->flags & RSBAC_LIST_PERSIST) 06549 && reg_item_p->dirty 06550 && !reg_item_p->no_write 06551 ) 06552 { 06553 struct rsbac_list_lol_write_head_t write_head; 06554 struct rsbac_list_lol_write_item_t * write_item_p; 06555 06556 reg_item_p->dirty = FALSE; 06557 err = fill_lol_buffer(reg_item_p, &write_item_p); 06558 if(!err) 06559 { 06560 write_head.head = write_item_p; 06561 write_head.tail = write_item_p; 06562 write_head.total = write_item_p->buflen; 06563 write_head.count = 1; 06564 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06565 rsbac_list_write_lol_buffers(write_head, TRUE); 06566 } 06567 else 06568 { 06569 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06570 if(err != -RSBAC_ENOTWRITABLE) 06571 { 06572 rsbac_printk(KERN_WARNING 06573 "rsbac_list_lol_detach(): fill_buffer() for list %s returned error %i\n", 06574 reg_item_p->name, err); 06575 } 06576 } 06577 } 06578 else 06579 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06580 #else 06581 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06582 #endif 06583 /* disable handle */ 06584 *handle_p = NULL; 06585 /* too bad that the list might have been changed again - we do not care anymore */ 06586 rsbac_write_lock(&lol_reg_head.lock, &lock_flags); 06587 remove_lol_reg(reg_item_p); 06588 rsbac_write_unlock(&lol_reg_head.lock, &lock_flags); 06589 return err; 06590 }
|
|
Definition at line 9306 of file gen_lists.c. References rsbac_ta_list_lol_exist(). Referenced by rsbac_pm_pp_intersec(), rsbac_pm_pp_subset(), rsbac_pm_pp_superset(), and rsbac_pm_pp_union(). 09309 { 09310 return rsbac_ta_list_lol_exist(0, handle, desc); 09311 }
|
|
Definition at line 10275 of file gen_lists.c. References rsbac_ta_list_lol_get_all_data(). 10278 { 10279 return rsbac_ta_list_lol_get_all_data(0, handle, array_p); 10280 }
|
|
Definition at line 9905 of file gen_lists.c. References rsbac_ta_list_lol_get_all_desc(). Referenced by rsbac_check_acl(), and rsbac_init_rc(). 09906 { 09907 return rsbac_ta_list_lol_get_all_desc(0, handle, array_p); 09908 }
|
|
Definition at line 10735 of file gen_lists.c. References rsbac_ta_list_lol_get_all_items(). 10738 { 10739 return rsbac_ta_list_lol_get_all_items(0, handle, array_p); 10740 }
|
|
Definition at line 10143 of file gen_lists.c. References rsbac_ta_list_lol_get_all_subdata(). 10147 { 10148 return rsbac_ta_list_lol_get_all_subdata(0, handle, desc, array_p); 10149 }
|
|
Definition at line 9784 of file gen_lists.c. References NULL, and rsbac_ta_list_lol_get_all_subdesc_ttl(). Referenced by rsbac_check_acl(), rsbac_pm_pp_intersec(), rsbac_pm_pp_subset(), rsbac_pm_pp_superset(), and rsbac_pm_pp_union(). 09785 { 09786 return rsbac_ta_list_lol_get_all_subdesc_ttl(0, handle, 09787 desc, array_p, NULL); 09788 }
|
|
Definition at line 9768 of file gen_lists.c. References rsbac_ta_list_lol_get_all_subdesc_ttl(). Referenced by copy_fp_cap_set_item(), copy_fp_tru_set_item(), copy_pp_cap_set_item_handle(), and copy_pp_tru_set_item_handle(). 09773 { 09774 return rsbac_ta_list_lol_get_all_subdesc_ttl(0, 09775 handle, 09776 desc, 09777 array_p, 09778 ttl_array_p); 09779 }
|
|
Definition at line 10614 of file gen_lists.c. References NULL, and rsbac_ta_list_lol_get_all_subitems_ttl(). 10615 { 10616 return rsbac_ta_list_lol_get_all_subitems_ttl(0, handle, desc, 10617 array_p, NULL); 10618 }
|
|
Definition at line 10601 of file gen_lists.c. References rsbac_ta_list_lol_get_all_subitems_ttl(). 10606 { 10607 return rsbac_ta_list_lol_get_all_subitems_ttl(0, handle, desc, 10608 array_p, ttl_array_p); 10609 }
|
|
Definition at line 8571 of file gen_lists.c. References NULL, and rsbac_ta_list_lol_get_data_ttl(). 08574 { 08575 return rsbac_ta_list_lol_get_data_ttl(0, handle, NULL, desc, data); 08576 }
|
|
Definition at line 8560 of file gen_lists.c. References rsbac_ta_list_lol_get_data_ttl(). 08564 { 08565 return rsbac_ta_list_lol_get_data_ttl(0, handle, ttl_p, desc, data); 08566 }
|
|
Definition at line 8982 of file gen_lists.c. References rsbac_ta_list_lol_get_desc(). 08987 { 08988 return rsbac_ta_list_lol_get_desc(0, handle, desc, data, compare); 08989 }
|
|
Definition at line 10323 of file gen_lists.c. References rsbac_list_lol_info_t::data_size, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::info, list_initialized, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, and rsbac_list_lol_reg_item_t::self. 10324 { 10325 struct rsbac_list_lol_reg_item_t * list; 10326 10327 if(!handle) 10328 return -RSBAC_EINVALIDVALUE; 10329 if(!list_initialized) 10330 return -RSBAC_ENOTINITIALIZED; 10331 10332 list = (struct rsbac_list_lol_reg_item_t *) handle; 10333 if(list->self != list) 10334 return -RSBAC_EINVALIDVALUE; 10335 return list->info.desc_size + list->info.data_size; 10336 }
|
|
Definition at line 8813 of file gen_lists.c. References rsbac_ta_list_lol_get_next_desc(). 08817 { 08818 return rsbac_ta_list_lol_get_next_desc(0, handle, old_desc, next_desc); 08819 }
|
|
Definition at line 8455 of file gen_lists.c. References NULL, and rsbac_ta_list_lol_get_subdata_ttl(). Referenced by rsbac_rc_check_comp(). 08460 { 08461 return rsbac_ta_list_lol_get_subdata_ttl(0, handle, NULL, desc, subdesc, subdata); 08462 }
|
|
Definition at line 8441 of file gen_lists.c. References rsbac_ta_list_lol_get_subdata_ttl(). 08447 { 08448 return rsbac_ta_list_lol_get_subdata_ttl(0, handle, 08449 ttl_p, desc, subdesc, subdata); 08450 }
|
|
Definition at line 10305 of file gen_lists.c. References rsbac_list_lol_reg_item_t::info, list_initialized, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_list_lol_reg_item_t::self, rsbac_list_lol_info_t::subdata_size, and rsbac_list_lol_info_t::subdesc_size. Referenced by rsbac_rc_copy_role(). 10306 { 10307 struct rsbac_list_lol_reg_item_t * list; 10308 10309 if(!handle) 10310 return -RSBAC_EINVALIDVALUE; 10311 if(!list_initialized) 10312 return -RSBAC_ENOTINITIALIZED; 10313 10314 list = (struct rsbac_list_lol_reg_item_t *) handle; 10315 if(list->self != list) 10316 return -RSBAC_EINVALIDVALUE; 10317 return list->info.subdesc_size + list->info.subdata_size; 10318 }
|
|
Definition at line 6635 of file gen_lists.c. References FALSE, rsbac_list_lol_reg_item_t::info, rsbac_list_lol_info_t::key, list_initialized, rsbac_list_lol_reg_head_t::lock, lookup_lol_reg(), rsbac_list_lol_reg_item_t::name, rsbac_list_lol_reg_item_t::no_write, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_printk(), and TRUE. 06636 { 06637 struct rsbac_list_lol_reg_item_t * reg_item_p; 06638 u_long lock_flags; 06639 06640 if( !handle 06641 || ( (no_write != FALSE ) 06642 && (no_write != TRUE ) 06643 ) 06644 ) 06645 return -RSBAC_EINVALIDVALUE; 06646 if(!list_initialized) 06647 return -RSBAC_ENOTINITIALIZED; 06648 06649 rsbac_read_lock(&lol_reg_head.lock, &lock_flags); 06650 reg_item_p = lookup_lol_reg((struct rsbac_list_lol_reg_item_t *) handle); 06651 if(!reg_item_p) 06652 { 06653 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06654 rsbac_printk(KERN_WARNING "rsbac_list_lol_no_write: setting no_write for list denied due to invalid handle!\n"); 06655 return -RSBAC_EINVALIDVALUE; 06656 } 06657 if(reg_item_p->info.key != key) 06658 { 06659 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06660 rsbac_printk(KERN_WARNING "rsbac_list_lol_no_write: setting no_write for list %s denied due to invalid key %u!\n", 06661 reg_item_p->name, 06662 key); 06663 return -EPERM; 06664 } 06665 reg_item_p->no_write = no_write; 06666 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06667 return 0; 06668 }
|
|
Definition at line 6108 of file gen_lists.c. References add_lol_reg(), clear_lol_reg(), create_lol_reg(), rsbac_list_lol_info_t::data_size, rsbac_list_lol_info_t::desc_size, get_error_name(), rsbac_list_lol_info_t::key, list_initialized, rsbac_list_reg_head_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_reg_name(), lookup_reg_name(), rsbac_list_lol_info_t::max_age, rsbac_list_lol_reg_item_t::name, NULL, proc_rsbac_backup_p, read_lol_list(), RSBAC_ECOULDNOTADDITEM, RSBAC_EEXISTS, RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDVALUE, RSBAC_EINVALIDVERSION, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_kfree(), rsbac_kmalloc(), RSBAC_LIST_BACKUP, RSBAC_LIST_MAX_AGE_LIMIT, RSBAC_LIST_MAX_ITEM_SIZE, RSBAC_LIST_PERSIST, RSBAC_LIST_VERSION, RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_root_dev, rsbac_list_lol_info_t::subdata_size, rsbac_list_lol_info_t::subdesc_size, and rsbac_list_lol_info_t::version. Referenced by acl_register_fd_lists(), auth_register_fd_lists(), mac_register_fd_lists(), rsbac_init_acl(), rsbac_init_auth(), rsbac_init_mac(), rsbac_init_pm(), rsbac_init_rc(), and rsbac_init_um(). 06121 { 06122 struct rsbac_list_lol_reg_item_t * reg_item_p; 06123 struct rsbac_list_lol_reg_item_t * new_reg_item_p; 06124 u_long lock_flags; 06125 int err = 0; 06126 06127 if(ds_version != RSBAC_LIST_VERSION) 06128 return -RSBAC_EINVALIDVERSION; 06129 if(!handle_p) 06130 return -RSBAC_EINVALIDPOINTER; 06131 *handle_p = NULL; 06132 if(!info_p->key || !info_p->version || !info_p->desc_size) 06133 return -RSBAC_EINVALIDVALUE; 06134 if(info_p->max_age > RSBAC_LIST_MAX_AGE_LIMIT) 06135 return -RSBAC_EINVALIDVALUE; 06136 if(info_p->desc_size + info_p->data_size > RSBAC_LIST_MAX_ITEM_SIZE) 06137 return -RSBAC_EINVALIDVALUE; 06138 if(info_p->subdesc_size + info_p->subdata_size > RSBAC_LIST_MAX_ITEM_SIZE) 06139 return -RSBAC_EINVALIDVALUE; 06140 if(!list_initialized) 06141 return -RSBAC_ENOTINITIALIZED; 06142 if(name) 06143 { 06144 struct rsbac_list_reg_item_t * std_reg_item_p; 06145 06146 rsbac_read_lock(&lol_reg_head.lock, &lock_flags); 06147 reg_item_p = lookup_lol_reg_name(name, device); 06148 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 06149 if(reg_item_p) 06150 { 06151 #ifdef CONFIG_RSBAC_DEBUG 06152 if(rsbac_debug_lists) 06153 { 06154 rsbac_printk(KERN_DEBUG "rsbac_list_lol_register: list name %s already exists on device %02u:%02u!\n", 06155 name, RSBAC_MAJOR(device), RSBAC_MINOR(device)); 06156 } 06157 #endif 06158 return -RSBAC_EEXISTS; 06159 } 06160 rsbac_read_lock(®_head.lock, &lock_flags); 06161 std_reg_item_p = lookup_reg_name(name, device); 06162 rsbac_read_unlock(®_head.lock, &lock_flags); 06163 if(std_reg_item_p) 06164 { 06165 #ifdef CONFIG_RSBAC_DEBUG 06166 if(rsbac_debug_lists) 06167 { 06168 rsbac_printk(KERN_DEBUG "rsbac_list_register: list name %s already exists on device %02u:%02u!\n", 06169 name, RSBAC_MAJOR(device), RSBAC_MINOR(device)); 06170 } 06171 #endif 06172 return -RSBAC_EEXISTS; 06173 } 06174 } 06175 else 06176 if(flags & RSBAC_LIST_PERSIST) 06177 { 06178 rsbac_printk(KERN_WARNING 06179 "rsbac_list_lol_register: trial to register persistent list of lists without name.\n"); 06180 return -RSBAC_EINVALIDVALUE; 06181 } 06182 06183 if(flags & RSBAC_LIST_PERSIST) 06184 { 06185 if(RSBAC_IS_AUTO_DEV(device)) 06186 device = rsbac_root_dev; 06187 if(!RSBAC_MAJOR(device)) 06188 flags &= ~RSBAC_LIST_PERSIST; 06189 } 06190 06191 #ifdef CONFIG_RSBAC_DEBUG 06192 if(rsbac_debug_lists) 06193 { 06194 rsbac_printk(KERN_DEBUG "rsbac_list_lol_register: registering list of lists %s.\n", 06195 name); 06196 } 06197 #endif 06198 new_reg_item_p = create_lol_reg(info_p, flags, compare, subcompare, 06199 get_conv, get_subconv, 06200 def_data, def_subdata, 06201 name, device); 06202 if(!new_reg_item_p) 06203 { 06204 return -RSBAC_ECOULDNOTADDITEM; 06205 } 06206 /* Restore from disk */ 06207 if(flags & RSBAC_LIST_PERSIST) 06208 { 06209 #ifdef CONFIG_RSBAC_DEBUG 06210 if(rsbac_debug_lists) 06211 { 06212 rsbac_printk(KERN_DEBUG "rsbac_list_lol_register: restoring list %s from device %02u:%02u.\n", 06213 name, RSBAC_MAJOR(device), RSBAC_MINOR(device)); 06214 } 06215 #endif 06216 err = read_lol_list(new_reg_item_p); 06217 /* not found is no error */ 06218 if(err == -RSBAC_ENOTFOUND) 06219 err = 0; 06220 else 06221 if(err) 06222 { 06223 #ifdef CONFIG_RSBAC_DEBUG 06224 if(rsbac_debug_lists) 06225 { 06226 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN); 06227 06228 if(tmp) 06229 { 06230 get_error_name(tmp, err); 06231 rsbac_printk(KERN_DEBUG "rsbac_list_lol_register: restoring list %s from device %02u:%02u failed with error %s, unregistering list.\n", 06232 name, 06233 RSBAC_MAJOR(device),RSBAC_MINOR(device), 06234 tmp); 06235 rsbac_kfree(tmp); 06236 } 06237 } 06238 #endif 06239 clear_lol_reg(new_reg_item_p); 06240 return err; 06241 } 06242 #ifdef CONFIG_RSBAC_DEBUG 06243 else 06244 { 06245 if(rsbac_debug_lists) 06246 { 06247 rsbac_printk(KERN_DEBUG "rsbac_list_lol_register: restoring list %s from device %02u:%02u was successful.\n", 06248 name, 06249 RSBAC_MAJOR(device),RSBAC_MINOR(device)); 06250 } 06251 } 06252 #endif 06253 } 06254 06255 rsbac_write_lock(&lol_reg_head.lock, &lock_flags); 06256 reg_item_p = add_lol_reg(new_reg_item_p); 06257 rsbac_write_unlock(&lol_reg_head.lock, &lock_flags); 06258 if(!reg_item_p) 06259 { 06260 rsbac_printk(KERN_WARNING 06261 "rsbac_list_lol_register: inserting list %s failed!\n", 06262 name); 06263 /* cleanup */ 06264 clear_lol_reg(new_reg_item_p); 06265 return -RSBAC_ECOULDNOTADDITEM; 06266 } 06267 06268 /* finish */ 06269 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS) 06270 /* create proc entry, if requested */ 06271 if(flags & RSBAC_LIST_BACKUP) 06272 { 06273 reg_item_p->proc_entry_p = create_proc_entry(reg_item_p->name, 06274 S_IFREG | S_IRUGO, 06275 proc_rsbac_backup_p); 06276 if(reg_item_p->proc_entry_p) 06277 { 06278 reg_item_p->proc_entry_p->read_proc = lol_backup_proc_read; 06279 reg_item_p->proc_entry_p->data = reg_item_p; 06280 } 06281 } 06282 else 06283 { 06284 reg_item_p->proc_entry_p = NULL; 06285 } 06286 #endif 06287 *handle_p = reg_item_p; 06288 return err; 06289 }
|
|
Definition at line 8110 of file gen_lists.c. References rsbac_ta_list_lol_remove(). Referenced by copy_fp_cap_set_item(), copy_fp_tru_set_item(), copy_pp_cap_set_item_handle(), copy_pp_tru_set_item_handle(), and rsbac_check_acl(). 08113 { 08114 return rsbac_ta_list_lol_remove(0, handle, desc); 08115 }
|
|
Definition at line 8206 of file gen_lists.c. References rsbac_ta_list_lol_remove_all(). 08207 { 08208 return rsbac_ta_list_lol_remove_all(0, handle); 08209 }
|
|
Definition at line 7320 of file gen_lists.c. References RSBAC_LIST_TTL_KEEP, and rsbac_ta_list_lol_subadd_ttl(). Referenced by rsbac_auth_p_capset_member(), rsbac_init_acl(), rsbac_init_rc(), rsbac_pm_pp_intersec(), and rsbac_pm_pp_union(). 07325 { 07326 return rsbac_ta_list_lol_subadd_ttl(0, handle, RSBAC_LIST_TTL_KEEP, desc, subdesc, subdata); 07327 }
|
|
Definition at line 7307 of file gen_lists.c. References rsbac_ta_list_lol_subadd_ttl(). Referenced by copy_fp_cap_set_item(), copy_fp_tru_set_item(), copy_pp_cap_set_item_handle(), and copy_pp_tru_set_item_handle(). 07313 { 07314 return rsbac_ta_list_lol_subadd_ttl(0, handle, ttl, desc, subdesc, subdata); 07315 }
|
|
Definition at line 9377 of file gen_lists.c. References rsbac_ta_list_lol_subcount(). Referenced by rsbac_pm_pp_only(). 09380 { 09381 return rsbac_ta_list_lol_subcount(0, handle, desc); 09382 }
|
|
Definition at line 9142 of file gen_lists.c. References rsbac_ta_list_lol_subexist(). Referenced by rsbac_init_rc(), rsbac_mac_p_truset_member(), rsbac_pm_pp_intersec(), rsbac_pm_pp_only(), rsbac_pm_pp_subset(), rsbac_pm_pp_superset(), rsbac_rc_check_comp(), and rsbac_ta_list_lol_subexist_compare(). 09146 { 09147 return rsbac_ta_list_lol_subexist(0, handle, desc, subdesc); 09148 }
|
|
Definition at line 9230 of file gen_lists.c. References rsbac_ta_list_lol_subexist_compare(). Referenced by rsbac_auth_p_capset_member(). 09235 { 09236 return rsbac_ta_list_lol_subexist_compare(0, handle, 09237 desc, subdesc, compare); 09238 }
|
|
Definition at line 7811 of file gen_lists.c. References rsbac_ta_list_lol_subremove(). Referenced by rsbac_check_acl(), and rsbac_pm_pp_intersec(). 07815 { 07816 return rsbac_ta_list_lol_subremove(0, handle, desc, subdesc); 07817 }
|
|
Definition at line 8022 of file gen_lists.c. References rsbac_ta_list_lol_subremove_all(). 08023 { 08024 return rsbac_ta_list_lol_subremove_all(0, handle, desc); 08025 }
|
|
Definition at line 7910 of file gen_lists.c. References rsbac_ta_list_lol_subremove_from_all(). 07913 { 07914 return rsbac_ta_list_lol_subremove_from_all(0, handle, subdesc); 07915 }
|
|
Definition at line 6597 of file gen_lists.c. References FALSE, rsbac_list_reg_item_t::info, rsbac_list_info_t::key, list_initialized, rsbac_list_reg_head_t::lock, lookup_reg(), rsbac_list_reg_item_t::name, rsbac_list_reg_item_t::no_write, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_printk(), and TRUE. 06598 { 06599 struct rsbac_list_reg_item_t * reg_item_p; 06600 u_long lock_flags; 06601 06602 if( !handle 06603 || ( (no_write != FALSE ) 06604 && (no_write != TRUE ) 06605 ) 06606 ) 06607 return -RSBAC_EINVALIDVALUE; 06608 if(!list_initialized) 06609 return -RSBAC_ENOTINITIALIZED; 06610 06611 rsbac_read_lock(®_head.lock, &lock_flags); 06612 reg_item_p = lookup_reg((struct rsbac_list_reg_item_t *) handle); 06613 if(!reg_item_p) 06614 { 06615 rsbac_read_unlock(®_head.lock, &lock_flags); 06616 rsbac_printk(KERN_WARNING "rsbac_list_no_write: setting no_write for list denied due to invalid handle!\n"); 06617 return -RSBAC_EINVALIDVALUE; 06618 } 06619 if(reg_item_p->info.key != key) 06620 { 06621 rsbac_read_unlock(®_head.lock, &lock_flags); 06622 rsbac_printk(KERN_WARNING "rsbac_list_no_write: setting no_write for list %s denied due to invalid key %u!\n", 06623 reg_item_p->name, 06624 key); 06625 return -EPERM; 06626 } 06627 reg_item_p->no_write = no_write; 06628 rsbac_read_unlock(®_head.lock, &lock_flags); 06629 return 0; 06630 }
|
|
Definition at line 5886 of file gen_lists.c. References add_reg(), clear_reg(), create_reg(), rsbac_list_info_t::data_size, rsbac_list_info_t::desc_size, get_error_name(), rsbac_list_info_t::key, list_initialized, rsbac_list_lol_reg_head_t::lock, rsbac_list_reg_head_t::lock, lookup_lol_reg_name(), lookup_reg_name(), rsbac_list_info_t::max_age, rsbac_list_reg_item_t::name, NULL, proc_rsbac_backup_p, read_list(), RSBAC_ECOULDNOTADDITEM, RSBAC_EEXISTS, RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDVALUE, RSBAC_EINVALIDVERSION, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_kfree(), rsbac_kmalloc(), RSBAC_LIST_BACKUP, RSBAC_LIST_MAX_AGE_LIMIT, RSBAC_LIST_MAX_ITEM_SIZE, RSBAC_LIST_PERSIST, RSBAC_LIST_VERSION, RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_root_dev, and rsbac_list_info_t::version. Referenced by init_module(), register_dev_lists(), register_fd_lists(), register_ipc_lists(), register_process_lists(), register_user_lists(), rsbac_init_acl(), rsbac_init_debug(), rsbac_init_pm(), rsbac_init_rc(), rsbac_init_um(), and rsbac_list_init(). 05896 { 05897 struct rsbac_list_reg_item_t * reg_item_p; 05898 struct rsbac_list_reg_item_t * new_reg_item_p; 05899 u_long lock_flags; 05900 int err = 0; 05901 05902 if(ds_version != RSBAC_LIST_VERSION) 05903 { 05904 if(name) 05905 { 05906 rsbac_printk(KERN_WARNING 05907 "rsbac_list_register: wrong ds_version %u for list %s, expected %u!\n", 05908 ds_version, 05909 name, 05910 RSBAC_LIST_VERSION); 05911 } 05912 return -RSBAC_EINVALIDVERSION; 05913 } 05914 if(!handle_p || !info_p) 05915 return -RSBAC_EINVALIDPOINTER; 05916 *handle_p = NULL; 05917 if(!info_p->key || !info_p->version || !info_p->desc_size) 05918 return -RSBAC_EINVALIDVALUE; 05919 if(info_p->max_age > RSBAC_LIST_MAX_AGE_LIMIT) 05920 return -RSBAC_EINVALIDVALUE; 05921 if(info_p->desc_size + info_p->data_size > RSBAC_LIST_MAX_ITEM_SIZE) 05922 return -RSBAC_EINVALIDVALUE; 05923 if(!list_initialized) 05924 return -RSBAC_ENOTINITIALIZED; 05925 if(name) 05926 { 05927 struct rsbac_list_lol_reg_item_t * lol_reg_item_p; 05928 05929 rsbac_read_lock(®_head.lock, &lock_flags); 05930 reg_item_p = lookup_reg_name(name, device); 05931 rsbac_read_unlock(®_head.lock, &lock_flags); 05932 if(reg_item_p) 05933 { 05934 #ifdef CONFIG_RSBAC_DEBUG 05935 if(rsbac_debug_lists) 05936 { 05937 rsbac_printk(KERN_DEBUG "rsbac_list_register: list name %s already exists on device %02u:%02u!\n", 05938 name, RSBAC_MAJOR(device), RSBAC_MINOR(device)); 05939 } 05940 #endif 05941 return -RSBAC_EEXISTS; 05942 } 05943 rsbac_read_lock(&lol_reg_head.lock, &lock_flags); 05944 lol_reg_item_p = lookup_lol_reg_name(name, device); 05945 rsbac_read_unlock(&lol_reg_head.lock, &lock_flags); 05946 if(lol_reg_item_p) 05947 { 05948 #ifdef CONFIG_RSBAC_DEBUG 05949 if(rsbac_debug_lists) 05950 { 05951 rsbac_printk(KERN_DEBUG "rsbac_list_register: list name %s already exists on device %02u:%02u!\n", 05952 name, RSBAC_MAJOR(device), RSBAC_MINOR(device)); 05953 } 05954 #endif 05955 return -RSBAC_EEXISTS; 05956 } 05957 } 05958 else 05959 if(flags & RSBAC_LIST_PERSIST) 05960 { 05961 rsbac_printk(KERN_WARNING 05962 "rsbac_list_register: trial to register persistent list without name.\n"); 05963 return -RSBAC_EINVALIDVALUE; 05964 } 05965 05966 if(flags & RSBAC_LIST_PERSIST) 05967 { 05968 if(RSBAC_IS_AUTO_DEV(device)) 05969 device = rsbac_root_dev; 05970 if(!RSBAC_MAJOR(device)) 05971 flags &= ~RSBAC_LIST_PERSIST; 05972 } 05973 05974 #ifdef CONFIG_RSBAC_DEBUG 05975 if(rsbac_debug_lists) 05976 { 05977 rsbac_printk(KERN_DEBUG "rsbac_list_register: registering list %s for device %02u:%02u.\n", 05978 name, RSBAC_MAJOR(device),RSBAC_MINOR(device)); 05979 } 05980 #endif 05981 new_reg_item_p = create_reg(info_p, flags, compare, get_conv, def_data, name, device); 05982 if(!new_reg_item_p) 05983 { 05984 return -RSBAC_ECOULDNOTADDITEM; 05985 } 05986 /* Restore from disk, but only for real device mounts */ 05987 if( (flags & RSBAC_LIST_PERSIST) 05988 && RSBAC_MAJOR(device) 05989 ) 05990 { 05991 #ifdef CONFIG_RSBAC_DEBUG 05992 if(rsbac_debug_lists) 05993 { 05994 rsbac_printk(KERN_DEBUG "rsbac_list_register: restoring list %s from device %02u:%02u.\n", 05995 name, RSBAC_MAJOR(device), RSBAC_MINOR(device)); 05996 } 05997 #endif 05998 err = read_list(new_reg_item_p); 05999 /* not found is no error */ 06000 if(err == -RSBAC_ENOTFOUND) 06001 err = 0; 06002 else 06003 if(err) 06004 { 06005 #ifdef CONFIG_RSBAC_DEBUG 06006 if(rsbac_debug_lists) 06007 { 06008 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN); 06009 06010 if(tmp) 06011 { 06012 get_error_name(tmp, err); 06013 rsbac_printk(KERN_DEBUG "rsbac_list_register: restoring list %s from device %02u:%02u failed with error %s, unregistering list.\n", 06014 name, 06015 RSBAC_MAJOR(device),RSBAC_MINOR(device), 06016 tmp); 06017 rsbac_kfree(tmp); 06018 } 06019 } 06020 #endif 06021 clear_reg(new_reg_item_p); 06022 return err; 06023 } 06024 #ifdef CONFIG_RSBAC_DEBUG 06025 else 06026 { 06027 if(rsbac_debug_lists) 06028 { 06029 rsbac_printk(KERN_DEBUG "rsbac_list_register: restoring list %s from device %02u:%02u was successful.\n", 06030 name, 06031 RSBAC_MAJOR(device),RSBAC_MINOR(device)); 06032 } 06033 } 06034 #endif 06035 } 06036 06037 rsbac_write_lock(®_head.lock, &lock_flags); 06038 reg_item_p = add_reg(new_reg_item_p); 06039 rsbac_write_unlock(®_head.lock, &lock_flags); 06040 if(!reg_item_p) 06041 { 06042 rsbac_printk(KERN_WARNING 06043 "rsbac_list_register: inserting list %s failed!\n", 06044 name); 06045 /* cleanup */ 06046 clear_reg(new_reg_item_p); 06047 return -RSBAC_ECOULDNOTADDITEM; 06048 } 06049 06050 /* finish */ 06051 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS) 06052 /* create proc entry, if requested */ 06053 if(flags & RSBAC_LIST_BACKUP) 06054 { 06055 reg_item_p->proc_entry_p = create_proc_entry(reg_item_p->name, 06056 S_IFREG | S_IRUGO, 06057 proc_rsbac_backup_p); 06058 if(reg_item_p->proc_entry_p) 06059 { 06060 reg_item_p->proc_entry_p->read_proc = backup_proc_read; 06061 reg_item_p->proc_entry_p->data = reg_item_p; 06062 } 06063 } 06064 else 06065 { 06066 reg_item_p->proc_entry_p = NULL; 06067 } 06068 #endif 06069 *handle_p = reg_item_p; 06070 return err; 06071 }
|
|
Definition at line 7574 of file gen_lists.c. References rsbac_ta_list_remove(). 07577 { 07578 return rsbac_ta_list_remove(0, handle, desc); 07579 }
|
|
Definition at line 7670 of file gen_lists.c. References rsbac_ta_list_remove_all(). 07671 { 07672 return rsbac_ta_list_remove_all(0, handle); 07673 }
|
|
Definition at line 5854 of file gen_lists.c. References RSBAC_LIST_VERSION. 05855 { 05856 return RSBAC_LIST_VERSION; 05857 }
|
|
Definition at line 6952 of file gen_lists.c. References add_item(), rsbac_list_info_t::data_size, rsbac_list_reg_item_t::def_data, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::dirty, do_remove_item(), rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, lookup_item(), rsbac_list_item_t::max_age, RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_MAX_AGE_LIMIT, RSBAC_LIST_TTL_KEEP, rsbac_ta_list_exist(), rsbac_list_reg_item_t::self, touch, and TRUE. Referenced by rsbac_acl_add_group(), rsbac_acl_add_to_acl_entry(), rsbac_acl_change_group(), rsbac_acl_remove_from_acl_entry(), rsbac_acl_set_acl_entry(), rsbac_list_add(), rsbac_list_add_ttl(), rsbac_pm_add_target(), rsbac_pm_set_data(), rsbac_rc_copy_role(), rsbac_rc_copy_type(), rsbac_rc_set_item(), rsbac_um_add_group(), rsbac_um_mod_group(), rsbac_um_set_group_pass(), set_attr_dev(), set_attr_fd(), set_attr_ipc(), set_attr_process(), and set_attr_user(). 06958 { 06959 struct rsbac_list_reg_item_t * list; 06960 struct rsbac_list_item_t * item_p; 06961 u_long lock_flags, rlock_flags; 06962 06963 if(!handle || !desc) 06964 return -RSBAC_EINVALIDVALUE; 06965 if(!list_initialized) 06966 return -RSBAC_ENOTINITIALIZED; 06967 06968 list = (struct rsbac_list_reg_item_t *) handle; 06969 if(!list || (list->self != list)) 06970 return -RSBAC_EINVALIDVALUE; 06971 06972 #ifdef CONFIG_RSBAC_LIST_TRANS 06973 if(ta_number && !rsbac_ta_list_exist(0, ta_handle, &ta_number)) 06974 return -RSBAC_EINVALIDTRANSACTION; 06975 #endif 06976 06977 rsbac_read_lock(®_head.lock, &rlock_flags); 06978 if(list->info.data_size && !data) 06979 { 06980 rsbac_read_unlock(®_head.lock, &rlock_flags); 06981 return -RSBAC_EINVALIDVALUE; 06982 } 06983 06984 /* 06985 #ifdef CONFIG_RSBAC_DEBUG 06986 if(rsbac_debug_lists) 06987 rsbac_printk(KERN_DEBUG "rsbac_ta_list_add_ttl: adding to list %s.\n", 06988 list->name); 06989 #endif 06990 */ 06991 if(ttl && (ttl != RSBAC_LIST_TTL_KEEP)) 06992 { 06993 if(ttl > RSBAC_LIST_MAX_AGE_LIMIT) 06994 ttl = RSBAC_LIST_MAX_AGE_LIMIT; 06995 ttl += RSBAC_CURRENT_TIME; 06996 } 06997 rsbac_write_lock(&list->lock, &lock_flags); 06998 06999 #ifdef CONFIG_RSBAC_LIST_TRANS 07000 if(!ta_number) 07001 #endif 07002 { 07003 item_p = lookup_item(list, desc); 07004 if(item_p) 07005 { /* exists -> update data, if any */ 07006 if(ttl != RSBAC_LIST_TTL_KEEP) 07007 item_p->max_age = ttl; 07008 if(data && list->info.data_size) 07009 { 07010 if( list->def_data 07011 && !item_p->max_age 07012 && !memcmp(list->def_data, data, list->info.data_size) 07013 ) 07014 do_remove_item(list, item_p); 07015 else 07016 memcpy(((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 07017 data, list->info.data_size); 07018 } 07019 } 07020 else 07021 { 07022 if(ttl == RSBAC_LIST_TTL_KEEP) 07023 ttl = 0; 07024 if( !list->def_data 07025 || memcmp(list->def_data, data, list->info.data_size) 07026 ) 07027 add_item(list, ttl, desc, data); 07028 } 07029 touch(list); 07030 list->dirty = TRUE; 07031 } 07032 #ifdef CONFIG_RSBAC_LIST_TRANS 07033 if( list->ta_copied 07034 || ta_number 07035 ) 07036 { 07037 if(!list->ta_copied) 07038 ta_copy(ta_number, list); 07039 else 07040 if(ta_number) 07041 { 07042 if(list->ta_copied != ta_number) 07043 { 07044 rsbac_write_unlock(&list->lock, &lock_flags); 07045 rsbac_read_unlock(®_head.lock, &rlock_flags); 07046 return -RSBAC_EBUSY; 07047 } 07048 } 07049 else 07050 ta_number = list->ta_copied; 07051 item_p = ta_lookup_item(ta_number, list, desc); 07052 if(item_p) 07053 { /* exists -> update data, if any */ 07054 if(ttl != RSBAC_LIST_TTL_KEEP) 07055 item_p->max_age = ttl; 07056 if(data && list->info.data_size) 07057 { 07058 if( list->def_data 07059 && !item_p->max_age 07060 && !memcmp(list->def_data, data, list->info.data_size) 07061 ) 07062 ta_do_remove_item(list, item_p); 07063 else 07064 memcpy(((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 07065 data, list->info.data_size); 07066 } 07067 } 07068 else 07069 { 07070 if(ttl == RSBAC_LIST_TTL_KEEP) 07071 ttl = 0; 07072 if( !list->def_data 07073 || memcmp(list->def_data, data, list->info.data_size) 07074 ) 07075 ta_add_item(ta_number, list, ttl, desc, data); 07076 } 07077 } 07078 #endif 07079 rsbac_write_unlock(&list->lock, &lock_flags); 07080 rsbac_read_unlock(®_head.lock, &rlock_flags); 07081 return 0; 07082 }
|
|
Definition at line 9499 of file gen_lists.c. References rsbac_list_reg_item_t::count, list_initialized, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_reg_item_t::self. Referenced by rsbac_list_count(), rsbac_rc_get_list(), rsbac_ta_list_all_dev(), rsbac_ta_list_all_group(), rsbac_ta_list_all_user(), and rsbac_um_get_group_list(). 09502 { 09503 struct rsbac_list_reg_item_t * list; 09504 09505 if(!handle) 09506 return -RSBAC_EINVALIDVALUE; 09507 if(!list_initialized) 09508 return -RSBAC_ENOTINITIALIZED; 09509 09510 list = (struct rsbac_list_reg_item_t *) handle; 09511 if(list->self != list) 09512 return -RSBAC_EINVALIDVALUE; 09513 09514 #ifdef CONFIG_RSBAC_LIST_TRANS 09515 if(ta_number) 09516 { 09517 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09518 return -RSBAC_EINVALIDTRANSACTION; 09519 } 09520 #endif 09521 09522 #ifdef CONFIG_RSBAC_LIST_TRANS 09523 if(ta_number && (list->ta_copied == ta_number)) 09524 return list->ta_count; 09525 else 09526 #endif 09527 return list->count; 09528 }
|
|
|
Definition at line 9918 of file gen_lists.c. References rsbac_list_reg_item_t::count, rsbac_list_info_t::data_size, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::head, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, rsbac_list_item_t::max_age, rsbac_list_item_t::next, NULL, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, and rsbac_list_reg_item_t::self. Referenced by rsbac_acl_list_groups(), rsbac_acl_remove_user(), and rsbac_list_get_all_data(). 09922 { 09923 struct rsbac_list_reg_item_t * list; 09924 struct rsbac_list_item_t * item_p; 09925 char * buffer; 09926 u_long lock_flags, rlock_flags; 09927 u_long offset = 0; 09928 long result = 0; 09929 u_int item_size; 09930 u_int item_offset; 09931 09932 if(!handle) 09933 return -RSBAC_EINVALIDVALUE; 09934 if(!array_p) 09935 return -RSBAC_EINVALIDVALUE; 09936 if(!list_initialized) 09937 return -RSBAC_ENOTINITIALIZED; 09938 09939 list = (struct rsbac_list_reg_item_t *) handle; 09940 if(list->self != list) 09941 return -RSBAC_EINVALIDVALUE; 09942 *array_p = NULL; 09943 09944 #ifdef CONFIG_RSBAC_LIST_TRANS 09945 if(ta_number) 09946 { 09947 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09948 return -RSBAC_EINVALIDTRANSACTION; 09949 } 09950 #endif 09951 09952 rsbac_read_lock(®_head.lock, &rlock_flags); 09953 /* 09954 #ifdef CONFIG_RSBAC_DEBUG 09955 if(rsbac_debug_lists) 09956 rsbac_printk(KERN_DEBUG "rsbac_list_get_all_data: list %s.\n", 09957 list->name); 09958 #endif 09959 */ 09960 rsbac_read_lock(&list->lock, &lock_flags); 09961 if(!list->info.data_size) 09962 { 09963 rsbac_read_unlock(&list->lock, &lock_flags); 09964 rsbac_read_unlock(®_head.lock, &rlock_flags); 09965 return -RSBAC_EINVALIDREQUEST; 09966 } 09967 #ifdef CONFIG_RSBAC_LIST_TRANS 09968 if(ta_number && (list->ta_copied == ta_number)) 09969 { 09970 if(list->ta_count) 09971 { 09972 item_size = list->info.data_size; 09973 item_offset = list->info.desc_size; 09974 buffer = rsbac_vmalloc(item_size * list->ta_count); 09975 if(buffer) 09976 { 09977 item_p = list->ta_head; 09978 while(item_p) 09979 { 09980 if( !item_p->max_age 09981 || (item_p->max_age > RSBAC_CURRENT_TIME) 09982 ) 09983 { 09984 memcpy(buffer + offset, 09985 ((char *) item_p) + sizeof(*item_p) + item_offset, 09986 item_size); 09987 offset += item_size; 09988 result++; 09989 } 09990 item_p = item_p->next; 09991 } 09992 *array_p = buffer; 09993 } 09994 else 09995 { 09996 result = -RSBAC_ENOMEM; 09997 } 09998 } 09999 } 10000 else 10001 #endif 10002 if(list->count) 10003 { 10004 item_size = list->info.data_size; 10005 item_offset = list->info.desc_size; 10006 buffer = rsbac_vmalloc(item_size * list->count); 10007 if(buffer) 10008 { 10009 item_p = list->head; 10010 while(item_p) 10011 { 10012 if( !item_p->max_age 10013 || (item_p->max_age > RSBAC_CURRENT_TIME) 10014 ) 10015 { 10016 memcpy(buffer + offset, 10017 ((char *) item_p) + sizeof(*item_p) + item_offset, 10018 item_size); 10019 offset += item_size; 10020 result++; 10021 } 10022 item_p = item_p->next; 10023 } 10024 *array_p = buffer; 10025 } 10026 else 10027 { 10028 result = -RSBAC_ENOMEM; 10029 } 10030 } 10031 rsbac_read_unlock(&list->lock, &lock_flags); 10032 rsbac_read_unlock(®_head.lock, &rlock_flags); 10033 return result; 10034 }
|
|
Definition at line 9547 of file gen_lists.c. References rsbac_list_reg_item_t::count, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::head, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, rsbac_list_item_t::max_age, rsbac_list_item_t::next, NULL, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, and rsbac_list_reg_item_t::self. Referenced by copy_new_uids(), rsbac_list_get_all_desc(), rsbac_rc_copy_type(), rsbac_rc_get_list(), rsbac_ta_list_all_dev(), rsbac_ta_list_all_group(), rsbac_ta_list_all_user(), and rsbac_um_get_group_list(). 09551 { 09552 struct rsbac_list_reg_item_t * list; 09553 struct rsbac_list_item_t * item_p; 09554 char * buffer; 09555 u_long lock_flags, rlock_flags; 09556 u_long offset = 0; 09557 long result = 0; 09558 u_int item_size; 09559 09560 if(!handle) 09561 return -RSBAC_EINVALIDVALUE; 09562 if(!array_p) 09563 return -RSBAC_EINVALIDVALUE; 09564 if(!list_initialized) 09565 return -RSBAC_ENOTINITIALIZED; 09566 09567 list = (struct rsbac_list_reg_item_t *) handle; 09568 if(list->self != list) 09569 return -RSBAC_EINVALIDVALUE; 09570 *array_p = NULL; 09571 09572 #ifdef CONFIG_RSBAC_LIST_TRANS 09573 if(ta_number) 09574 { 09575 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09576 return -RSBAC_EINVALIDTRANSACTION; 09577 } 09578 #endif 09579 09580 rsbac_read_lock(®_head.lock, &rlock_flags); 09581 /* 09582 #ifdef CONFIG_RSBAC_DEBUG 09583 if(rsbac_debug_lists) 09584 rsbac_printk(KERN_DEBUG "rsbac_list_get_all_desc: list %s.\n", 09585 list->name); 09586 #endif 09587 */ 09588 rsbac_read_lock(&list->lock, &lock_flags); 09589 #ifdef CONFIG_RSBAC_LIST_TRANS 09590 if(ta_number && (list->ta_copied == ta_number)) 09591 { 09592 if(list->ta_count) 09593 { 09594 item_size = list->info.desc_size; 09595 buffer = rsbac_vmalloc(item_size * list->ta_count); 09596 if(buffer) 09597 { 09598 item_p = list->ta_head; 09599 while(item_p) 09600 { 09601 if( !item_p->max_age 09602 || (item_p->max_age > RSBAC_CURRENT_TIME) 09603 ) 09604 { 09605 memcpy(buffer + offset, 09606 ((char *) item_p) + sizeof(*item_p), 09607 item_size); 09608 offset += item_size; 09609 result++; 09610 } 09611 item_p = item_p->next; 09612 } 09613 *array_p = buffer; 09614 } 09615 else 09616 { 09617 result = -RSBAC_ENOMEM; 09618 } 09619 } 09620 } 09621 else 09622 #endif 09623 if(list->count) 09624 { 09625 item_size = list->info.desc_size; 09626 buffer = rsbac_vmalloc(item_size * list->count); 09627 if(buffer) 09628 { 09629 item_p = list->head; 09630 while(item_p) 09631 { 09632 if( !item_p->max_age 09633 || (item_p->max_age > RSBAC_CURRENT_TIME) 09634 ) 09635 { 09636 memcpy(buffer + offset, 09637 ((char *) item_p) + sizeof(*item_p), 09638 item_size); 09639 offset += item_size; 09640 result++; 09641 } 09642 item_p = item_p->next; 09643 } 09644 *array_p = buffer; 09645 } 09646 else 09647 { 09648 result = -RSBAC_ENOMEM; 09649 } 09650 } 09651 rsbac_read_unlock(&list->lock, &lock_flags); 09652 rsbac_read_unlock(®_head.lock, &rlock_flags); 09653 return result; 09654 }
|
|
Definition at line 10347 of file gen_lists.c. References rsbac_list_reg_item_t::count, rsbac_list_info_t::data_size, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::head, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, rsbac_list_item_t::max_age, rsbac_list_item_t::next, NULL, RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, and rsbac_list_reg_item_t::self. Referenced by rsbac_acl_get_tlist(), rsbac_list_get_all_items(), and rsbac_list_get_all_items_ttl(). 10352 { 10353 struct rsbac_list_reg_item_t * list; 10354 struct rsbac_list_item_t * item_p; 10355 char * buffer; 10356 rsbac_time_t * ttl_p = NULL; 10357 u_long lock_flags, rlock_flags; 10358 u_long offset = 0; 10359 long result = 0; 10360 u_int item_size; 10361 10362 if(!handle) 10363 return -RSBAC_EINVALIDVALUE; 10364 if(!array_p) 10365 return -RSBAC_EINVALIDPOINTER; 10366 if(!list_initialized) 10367 return -RSBAC_ENOTINITIALIZED; 10368 10369 list = (struct rsbac_list_reg_item_t *) handle; 10370 if(list->self != list) 10371 return -RSBAC_EINVALIDVALUE; 10372 *array_p = NULL; 10373 10374 #ifdef CONFIG_RSBAC_LIST_TRANS 10375 if(ta_number) 10376 { 10377 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 10378 return -RSBAC_EINVALIDTRANSACTION; 10379 } 10380 #endif 10381 10382 rsbac_read_lock(®_head.lock, &rlock_flags); 10383 /* 10384 #ifdef CONFIG_RSBAC_DEBUG 10385 if(rsbac_debug_lists) 10386 rsbac_printk(KERN_DEBUG "rsbac_list_get_all_items: list %s.\n", 10387 list->name); 10388 #endif 10389 */ 10390 rsbac_read_lock(&list->lock, &lock_flags); 10391 #ifdef CONFIG_RSBAC_LIST_TRANS 10392 if(ta_number && (list->ta_copied == ta_number)) 10393 { 10394 if(list->ta_count) 10395 { 10396 item_size = list->info.desc_size + list->info.data_size; 10397 buffer = rsbac_vmalloc(item_size * list->ta_count); 10398 if(buffer) 10399 { 10400 if(ttl_array_p) 10401 ttl_p = rsbac_vmalloc(sizeof(**ttl_array_p) * list->ta_count); 10402 item_p = list->ta_head; 10403 while(item_p) 10404 { 10405 if( !item_p->max_age 10406 || (item_p->max_age > RSBAC_CURRENT_TIME) 10407 ) 10408 { 10409 memcpy(buffer + offset, 10410 ((char *) item_p) + sizeof(*item_p), 10411 item_size); 10412 if(ttl_p) 10413 { 10414 if(item_p->max_age) 10415 ttl_p[result] = item_p->max_age - RSBAC_CURRENT_TIME; 10416 else 10417 ttl_p[result] = 0; 10418 } 10419 offset += item_size; 10420 result++; 10421 } 10422 item_p = item_p->next; 10423 } 10424 *array_p = buffer; 10425 if(ttl_array_p) 10426 *ttl_array_p = ttl_p; 10427 } 10428 else 10429 { 10430 result = -RSBAC_ENOMEM; 10431 } 10432 } 10433 } 10434 else 10435 #endif 10436 if(list->count) 10437 { 10438 item_size = list->info.desc_size + list->info.data_size; 10439 buffer = rsbac_vmalloc(item_size * list->count); 10440 if(buffer) 10441 { 10442 if(ttl_array_p) 10443 ttl_p = rsbac_vmalloc(sizeof(**ttl_array_p) * list->count); 10444 item_p = list->head; 10445 while(item_p) 10446 { 10447 if( !item_p->max_age 10448 || (item_p->max_age > RSBAC_CURRENT_TIME) 10449 ) 10450 { 10451 memcpy(buffer + offset, 10452 ((char *) item_p) + sizeof(*item_p), 10453 item_size); 10454 if(ttl_p) 10455 { 10456 if(item_p->max_age) 10457 ttl_p[result] = item_p->max_age - RSBAC_CURRENT_TIME; 10458 else 10459 ttl_p[result] = 0; 10460 } 10461 offset += item_size; 10462 result++; 10463 } 10464 item_p = item_p->next; 10465 } 10466 *array_p = buffer; 10467 if(ttl_array_p) 10468 *ttl_array_p = ttl_p; 10469 } 10470 else 10471 { 10472 result = -RSBAC_ENOMEM; 10473 } 10474 } 10475 rsbac_read_unlock(&list->lock, &lock_flags); 10476 rsbac_read_unlock(®_head.lock, &rlock_flags); 10477 return result; 10478 }
|
|
Definition at line 8217 of file gen_lists.c. References rsbac_list_info_t::data_size, rsbac_list_reg_item_t::def_data, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, lookup_item(), rsbac_list_item_t::max_age, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_reg_item_t::self. Referenced by get_attr_dev(), get_attr_fd(), get_attr_ipc(), get_attr_process(), get_attr_user(), rsbac_acl_add_to_acl_entry(), rsbac_acl_get_group_entry(), rsbac_acl_get_rights(), rsbac_acl_get_single_right(), rsbac_acl_remove_from_acl_entry(), rsbac_list_get_data(), rsbac_list_get_data_ttl(), rsbac_pm_exists(), rsbac_pm_get_all_data(), rsbac_pm_get_data(), rsbac_pm_set_data(), rsbac_rc_copy_role(), rsbac_rc_copy_type(), rsbac_rc_get_item(), rsbac_rc_set_item(), rsbac_um_get_group_item(), rsbac_um_mod_group(), rsbac_um_set_group_pass(), set_attr_dev(), set_attr_fd(), set_attr_ipc(), set_attr_process(), and set_attr_user(). 08223 { 08224 struct rsbac_list_reg_item_t * list; 08225 struct rsbac_list_item_t * item_p; 08226 u_long lock_flags, rlock_flags; 08227 int err = 0; 08228 08229 if(!handle || !desc) 08230 return -RSBAC_EINVALIDVALUE; 08231 if(!list_initialized) 08232 return -RSBAC_ENOTINITIALIZED; 08233 08234 list = (struct rsbac_list_reg_item_t *) handle; 08235 if(list->self != list) 08236 return -RSBAC_EINVALIDVALUE; 08237 08238 #ifdef CONFIG_RSBAC_LIST_TRANS 08239 if(ta_number) 08240 { 08241 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08242 return -RSBAC_EINVALIDTRANSACTION; 08243 } 08244 #endif 08245 08246 rsbac_read_lock(®_head.lock, &rlock_flags); 08247 /* 08248 #ifdef CONFIG_RSBAC_DEBUG 08249 if(rsbac_debug_lists) 08250 rsbac_printk(KERN_DEBUG "rsbac_list_get_data: getting data from list %s.\n", 08251 list->name); 08252 #endif 08253 */ 08254 if(data && !list->info.data_size) 08255 { 08256 rsbac_read_unlock(®_head.lock, &rlock_flags); 08257 return -RSBAC_EINVALIDREQUEST; 08258 } 08259 08260 rsbac_read_lock(&list->lock, &lock_flags); 08261 #ifdef CONFIG_RSBAC_LIST_TRANS 08262 if(ta_number && (list->ta_copied == ta_number)) 08263 item_p = ta_lookup_item(ta_number, list, desc); 08264 else 08265 #endif 08266 item_p = lookup_item(list, desc); 08267 if( item_p 08268 && ( !item_p->max_age 08269 || (item_p->max_age > RSBAC_CURRENT_TIME) 08270 ) 08271 ) 08272 { /* exists -> copy data, if any */ 08273 if(ttl_p) 08274 { 08275 if(item_p->max_age) 08276 *ttl_p = item_p->max_age - RSBAC_CURRENT_TIME; 08277 else 08278 *ttl_p = 0; 08279 } 08280 if(data) 08281 { 08282 memcpy(data, 08283 ((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 08284 list->info.data_size); 08285 } 08286 } 08287 else 08288 { 08289 if(!list->def_data) 08290 err = -RSBAC_ENOTFOUND; 08291 else 08292 { 08293 if(ttl_p) 08294 *ttl_p = 0; 08295 if(data) 08296 memcpy(data, 08297 list->def_data, 08298 list->info.data_size); 08299 } 08300 } 08301 rsbac_read_unlock(&list->lock, &lock_flags); 08302 rsbac_read_unlock(®_head.lock, &rlock_flags); 08303 return err; 08304 }
|
|
Definition at line 8832 of file gen_lists.c. References rsbac_list_info_t::data_size, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, lookup_item_data(), RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_reg_item_t::self. Referenced by rsbac_list_get_desc(), and rsbac_um_get_gid(). 08838 { 08839 struct rsbac_list_reg_item_t * list; 08840 struct rsbac_list_item_t * item_p; 08841 u_long lock_flags, rlock_flags; 08842 int err = 0; 08843 08844 if(!handle || !desc || !data) 08845 return -RSBAC_EINVALIDVALUE; 08846 if(!list_initialized) 08847 return -RSBAC_ENOTINITIALIZED; 08848 08849 list = (struct rsbac_list_reg_item_t *) handle; 08850 if(list->self != list) 08851 return -RSBAC_EINVALIDVALUE; 08852 08853 #ifdef CONFIG_RSBAC_LIST_TRANS 08854 if(ta_number) 08855 { 08856 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08857 return -RSBAC_EINVALIDTRANSACTION; 08858 } 08859 #endif 08860 08861 rsbac_read_lock(®_head.lock, &rlock_flags); 08862 /* 08863 #ifdef CONFIG_RSBAC_DEBUG 08864 if(rsbac_debug_lists) 08865 rsbac_printk(KERN_DEBUG "rsbac_list_get_desc: getting desc from list %s.\n", 08866 list->name); 08867 #endif 08868 */ 08869 if(!list->info.data_size) 08870 { 08871 rsbac_read_unlock(®_head.lock, &rlock_flags); 08872 return -RSBAC_EINVALIDREQUEST; 08873 } 08874 08875 rsbac_read_lock(&list->lock, &lock_flags); 08876 08877 #ifdef CONFIG_RSBAC_LIST_TRANS 08878 if(ta_number && (list->ta_copied == ta_number)) 08879 item_p = ta_lookup_item_data(ta_number, list, data, compare); 08880 else 08881 #endif 08882 item_p = lookup_item_data(list, data, compare); 08883 if(item_p) 08884 { /* exists -> copy desc */ 08885 memcpy(desc, 08886 ((char *) item_p) + sizeof(*item_p), 08887 list->info.desc_size); 08888 } 08889 else 08890 { 08891 err = -RSBAC_ENOTFOUND; 08892 } 08893 rsbac_read_unlock(&list->lock, &lock_flags); 08894 rsbac_read_unlock(®_head.lock, &rlock_flags); 08895 return err; 08896 }
|
|
Definition at line 8581 of file gen_lists.c. References rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, rsbac_list_item_t::max_age, rsbac_list_item_t::prev, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_reg_item_t::self, and rsbac_list_reg_item_t::tail. Referenced by rsbac_list_get_max_desc(). 08585 { 08586 struct rsbac_list_reg_item_t * list; 08587 struct rsbac_list_item_t * item_p; 08588 u_long lock_flags, rlock_flags; 08589 int err = 0; 08590 08591 if(!handle) 08592 return -RSBAC_EINVALIDVALUE; 08593 if(!list_initialized) 08594 return -RSBAC_ENOTINITIALIZED; 08595 08596 list = (struct rsbac_list_reg_item_t *) handle; 08597 if(list->self != list) 08598 return -RSBAC_EINVALIDVALUE; 08599 08600 #ifdef CONFIG_RSBAC_LIST_TRANS 08601 if(ta_number) 08602 { 08603 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08604 return -RSBAC_EINVALIDTRANSACTION; 08605 } 08606 #endif 08607 08608 rsbac_read_lock(®_head.lock, &rlock_flags); 08609 /* 08610 #ifdef CONFIG_RSBAC_DEBUG 08611 if(rsbac_debug_lists) 08612 rsbac_printk(KERN_DEBUG "rsbac_list_get_max_desc: list %s.\n", 08613 list->name); 08614 #endif 08615 */ 08616 rsbac_read_lock(&list->lock, &lock_flags); 08617 #ifdef CONFIG_RSBAC_LIST_TRANS 08618 if(ta_number && (list->ta_copied == ta_number)) 08619 item_p = list->ta_tail; 08620 else 08621 #endif 08622 item_p = list->tail; 08623 while( item_p 08624 && item_p->max_age 08625 && (item_p->max_age > RSBAC_CURRENT_TIME) 08626 ) 08627 item_p = item_p->prev; 08628 if(item_p) 08629 memcpy(desc, (char *)item_p + sizeof(*item_p), list->info.desc_size); 08630 else 08631 { 08632 memset(desc, 0, list->info.desc_size); 08633 err = -RSBAC_ENOTFOUND; 08634 } 08635 rsbac_read_unlock(&list->lock, &lock_flags); 08636 rsbac_read_unlock(®_head.lock, &rlock_flags); 08637 return err; 08638 }
|
|
Definition at line 8651 of file gen_lists.c. References rsbac_list_reg_item_t::curr, rsbac_list_info_t::desc_size, rsbac_list_reg_item_t::head, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, lookup_item(), rsbac_list_item_t::max_age, rsbac_list_item_t::next, RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_reg_item_t::self. Referenced by rsbac_list_get_next_desc(). 08656 { 08657 struct rsbac_list_reg_item_t * list; 08658 struct rsbac_list_item_t * item_p; 08659 u_long lock_flags, rlock_flags; 08660 08661 if(!handle) 08662 return -RSBAC_EINVALIDVALUE; 08663 if(!list_initialized) 08664 return -RSBAC_ENOTINITIALIZED; 08665 if(!next_desc) 08666 return -RSBAC_EINVALIDPOINTER; 08667 08668 list = (struct rsbac_list_reg_item_t *) handle; 08669 if(list->self != list) 08670 return -RSBAC_EINVALIDVALUE; 08671 08672 #ifdef CONFIG_RSBAC_LIST_TRANS 08673 if(ta_number) 08674 { 08675 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08676 return -RSBAC_EINVALIDTRANSACTION; 08677 } 08678 #endif 08679 08680 rsbac_read_lock(®_head.lock, &rlock_flags); 08681 /* 08682 #ifdef CONFIG_RSBAC_DEBUG 08683 if(rsbac_debug_lists) 08684 rsbac_printk(KERN_DEBUG "rsbac_list_get_next_desc: list %s.\n", 08685 list->name); 08686 #endif 08687 */ 08688 rsbac_read_lock(&list->lock, &lock_flags); 08689 if(old_desc) 08690 { 08691 #ifdef CONFIG_RSBAC_LIST_TRANS 08692 if(ta_number && (list->ta_copied == ta_number)) 08693 item_p = ta_lookup_item(ta_number, list, old_desc); 08694 else 08695 #endif 08696 item_p = lookup_item(list, old_desc); 08697 if(item_p) 08698 item_p = item_p->next; 08699 } 08700 else 08701 #ifdef CONFIG_RSBAC_LIST_TRANS 08702 if(ta_number && (list->ta_copied == ta_number)) 08703 item_p = list->ta_head; 08704 else 08705 #endif 08706 item_p = list->head; 08707 while( item_p 08708 && item_p->max_age 08709 && (item_p->max_age > RSBAC_CURRENT_TIME) 08710 ) 08711 item_p = item_p->next; 08712 if(item_p) 08713 { 08714 memcpy(next_desc, (char *)item_p + sizeof(*item_p), list->info.desc_size); 08715 list->curr = item_p; 08716 } 08717 rsbac_read_unlock(&list->lock, &lock_flags); 08718 rsbac_read_unlock(®_head.lock, &rlock_flags); 08719 if(item_p) 08720 return 0; 08721 else 08722 return -RSBAC_ENOTFOUND; 08723 }
|
|
Definition at line 7334 of file gen_lists.c. References add_lol_item(), rsbac_list_lol_item_t::count, rsbac_list_lol_info_t::data_size, rsbac_list_lol_reg_item_t::def_data, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::dirty, do_remove_lol_item(), rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, lookup_lol_item(), rsbac_list_lol_item_t::max_age, RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_MAX_AGE_LIMIT, RSBAC_LIST_TTL_KEEP, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_acl_add_group_member(), rsbac_acl_add_to_acl_entry(), rsbac_acl_set_acl_entry(), rsbac_acl_set_mask(), rsbac_list_lol_add(), rsbac_list_lol_add_ttl(), rsbac_pm_create_set(), rsbac_um_add_user(), rsbac_um_mod_user(), and rsbac_um_set_pass(). 07340 { 07341 struct rsbac_list_lol_reg_item_t * list; 07342 struct rsbac_list_lol_item_t * item_p; 07343 u_long lock_flags, rlock_flags; 07344 07345 if(!handle || !desc) 07346 return -RSBAC_EINVALIDVALUE; 07347 if(!list_initialized) 07348 return -RSBAC_ENOTINITIALIZED; 07349 07350 list = (struct rsbac_list_lol_reg_item_t *) handle; 07351 if(!list || (list->self != list)) 07352 return -RSBAC_EINVALIDVALUE; 07353 07354 #ifdef CONFIG_RSBAC_LIST_TRANS 07355 if(ta_number && !rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07356 return -RSBAC_EINVALIDTRANSACTION; 07357 #endif 07358 07359 if(ttl && (ttl != RSBAC_LIST_TTL_KEEP)) 07360 { 07361 if(ttl > RSBAC_LIST_MAX_AGE_LIMIT) 07362 ttl = RSBAC_LIST_MAX_AGE_LIMIT; 07363 ttl += RSBAC_CURRENT_TIME; 07364 } 07365 07366 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 07367 if(list->info.data_size && !data) 07368 { 07369 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07370 return -RSBAC_EINVALIDVALUE; 07371 } 07372 07373 /* 07374 #ifdef CONFIG_RSBAC_DEBUG 07375 if(rsbac_debug_lists) 07376 rsbac_printk(KERN_DEBUG "rsbac_list_lol_add: adding to list %s.\n", 07377 list->name); 07378 #endif 07379 */ 07380 rsbac_write_lock(&list->lock, &lock_flags); 07381 07382 #ifdef CONFIG_RSBAC_LIST_TRANS 07383 if(!ta_number) 07384 #endif 07385 { 07386 item_p = lookup_lol_item(list, desc); 07387 if(item_p) 07388 { /* exists -> update data, if any */ 07389 if(ttl != RSBAC_LIST_TTL_KEEP) 07390 item_p->max_age = ttl; 07391 if(data && list->info.data_size) 07392 { 07393 if( list->def_data 07394 && !item_p->max_age 07395 && !memcmp(list->def_data, data, list->info.data_size) 07396 && !item_p->count 07397 ) 07398 do_remove_lol_item(list, item_p); 07399 else 07400 memcpy(((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 07401 data, list->info.data_size); 07402 } 07403 } 07404 else 07405 { 07406 if(ttl == RSBAC_LIST_TTL_KEEP) 07407 ttl = 0; 07408 if( !list->def_data 07409 || memcmp(list->def_data, data, list->info.data_size) 07410 ) 07411 add_lol_item(list, ttl, desc, data); 07412 } 07413 lol_touch(list); 07414 list->dirty = TRUE; 07415 } 07416 #ifdef CONFIG_RSBAC_LIST_TRANS 07417 if(list->ta_copied || ta_number) 07418 { 07419 if(!list->ta_copied) 07420 ta_lol_copy(ta_number, list); 07421 else 07422 if(ta_number) 07423 { 07424 if(list->ta_copied != ta_number) 07425 { 07426 rsbac_write_unlock(&list->lock, &lock_flags); 07427 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07428 return -RSBAC_EBUSY; 07429 } 07430 } 07431 else 07432 ta_number = list->ta_copied; 07433 item_p = ta_lookup_lol_item(ta_number, list, desc); 07434 if(item_p) 07435 { /* exists -> update data, if any */ 07436 if(ttl != RSBAC_LIST_TTL_KEEP) 07437 item_p->max_age = ttl; 07438 if(data && list->info.data_size) 07439 { 07440 if( list->def_data 07441 && !item_p->max_age 07442 && !memcmp(list->def_data, data, list->info.data_size) 07443 && !item_p->count 07444 ) 07445 ta_do_remove_lol_item(list, item_p); 07446 else 07447 memcpy(((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 07448 data, list->info.data_size); 07449 } 07450 } 07451 else 07452 { 07453 if(ttl == RSBAC_LIST_TTL_KEEP) 07454 ttl = 0; 07455 if( !list->def_data 07456 || memcmp(list->def_data, data, list->info.data_size) 07457 ) 07458 ta_add_lol_item(ta_number, list, ttl, desc, data); 07459 } 07460 } 07461 #endif 07462 rsbac_write_unlock(&list->lock, &lock_flags); 07463 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07464 return 0; 07465 }
|
|
Definition at line 9387 of file gen_lists.c. References rsbac_list_lol_item_t::count, rsbac_list_lol_reg_item_t::head, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, rsbac_list_lol_item_t::next, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_list_lol_all_subcount(). 09390 { 09391 struct rsbac_list_lol_reg_item_t * list; 09392 struct rsbac_list_lol_item_t * sublist; 09393 u_long lock_flags, rlock_flags; 09394 long result = 0; 09395 09396 if(!handle) 09397 return -RSBAC_EINVALIDVALUE; 09398 if(!list_initialized) 09399 return -RSBAC_ENOTINITIALIZED; 09400 09401 list = (struct rsbac_list_lol_reg_item_t *) handle; 09402 if(list->self != list) 09403 return -RSBAC_EINVALIDVALUE; 09404 09405 #ifdef CONFIG_RSBAC_LIST_TRANS 09406 if(ta_number) 09407 { 09408 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09409 return -RSBAC_EINVALIDTRANSACTION; 09410 } 09411 #endif 09412 09413 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09414 /* 09415 #ifdef CONFIG_RSBAC_DEBUG 09416 if(rsbac_debug_lists) 09417 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subcount: list %s.\n", 09418 list->name); 09419 #endif 09420 */ 09421 rsbac_read_lock(&list->lock, &lock_flags); 09422 09423 #ifdef CONFIG_RSBAC_LIST_TRANS 09424 if(ta_number && (list->ta_copied == ta_number)) 09425 sublist = list->ta_head; 09426 else 09427 #endif 09428 sublist = list->head; 09429 while(sublist) 09430 { 09431 result += sublist->count; 09432 sublist = sublist->next; 09433 } 09434 rsbac_read_unlock(&list->lock, &lock_flags); 09435 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09436 return result; 09437 }
|
|
Definition at line 9450 of file gen_lists.c. References rsbac_list_lol_reg_item_t::count, list_initialized, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_acl_list_all_dev(), rsbac_acl_list_all_major_dev(), rsbac_acl_list_all_user(), rsbac_list_lol_count(), rsbac_um_get_gm_user_list(), and rsbac_um_get_user_list(). 09453 { 09454 struct rsbac_list_lol_reg_item_t * list; 09455 09456 if(!handle) 09457 return -RSBAC_EINVALIDVALUE; 09458 if(!list_initialized) 09459 return -RSBAC_ENOTINITIALIZED; 09460 09461 list = (struct rsbac_list_lol_reg_item_t *) handle; 09462 if(list->self != list) 09463 return -RSBAC_EINVALIDVALUE; 09464 09465 #ifdef CONFIG_RSBAC_LIST_TRANS 09466 if(ta_number) 09467 { 09468 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09469 return -RSBAC_EINVALIDTRANSACTION; 09470 } 09471 #endif 09472 09473 /* 09474 #ifdef CONFIG_RSBAC_DEBUG 09475 if(rsbac_debug_lists) 09476 rsbac_printk(KERN_DEBUG "rsbac_list_lol_count: list %s.\n", 09477 list->name); 09478 #endif 09479 */ 09480 #ifdef CONFIG_RSBAC_LIST_TRANS 09481 if(ta_number && (list->ta_copied == ta_number)) 09482 return list->ta_count; 09483 else 09484 #endif 09485 return list->count; 09486 }
|
|
Definition at line 9243 of file gen_lists.c. References FALSE, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), rsbac_list_lol_item_t::max_age, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_acl_add_group_member(), rsbac_acl_add_to_acl_entry(), rsbac_acl_set_acl_entry(), rsbac_list_lol_exist(), rsbac_pm_create_set(), rsbac_pm_exists(), rsbac_pm_remove_target(), rsbac_pm_set_exist(), rsbac_um_add_user(), rsbac_um_get_user_item(), rsbac_um_mod_user(), rsbac_um_remove_user(), and rsbac_um_user_exists(). 09247 { 09248 struct rsbac_list_lol_reg_item_t * list; 09249 u_long lock_flags, rlock_flags; 09250 struct rsbac_list_lol_item_t * item_p; 09251 int result; 09252 09253 if(!handle || !desc) 09254 return FALSE; 09255 if(!list_initialized) 09256 return FALSE; 09257 09258 list = (struct rsbac_list_lol_reg_item_t *) handle; 09259 if(list->self != list) 09260 return -RSBAC_EINVALIDVALUE; 09261 09262 #ifdef CONFIG_RSBAC_LIST_TRANS 09263 if(ta_number) 09264 { 09265 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09266 return -RSBAC_EINVALIDTRANSACTION; 09267 } 09268 #endif 09269 09270 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09271 /* 09272 #ifdef CONFIG_RSBAC_DEBUG 09273 if(rsbac_debug_lists) 09274 rsbac_printk(KERN_DEBUG "rsbac_list_lol_exist: testing on list %s.\n", 09275 list->name); 09276 #endif 09277 */ 09278 rsbac_read_lock(&list->lock, &lock_flags); 09279 09280 #ifdef CONFIG_RSBAC_LIST_TRANS 09281 if(ta_number && (list->ta_copied == ta_number)) 09282 item_p = ta_lookup_lol_item(ta_number, list, desc); 09283 else 09284 #endif 09285 item_p = lookup_lol_item(list, desc); 09286 if( item_p 09287 && ( !item_p->max_age 09288 || (item_p->max_age > RSBAC_CURRENT_TIME) 09289 ) 09290 ) 09291 { /* exists -> TRUE */ 09292 result = TRUE; 09293 } 09294 else 09295 { 09296 result = FALSE; 09297 } 09298 rsbac_read_unlock(&list->lock, &lock_flags); 09299 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09300 return result; 09301 }
|
|
Definition at line 10154 of file gen_lists.c. References rsbac_list_lol_reg_item_t::count, rsbac_list_lol_info_t::data_size, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, rsbac_list_lol_item_t::max_age, rsbac_list_lol_item_t::next, NULL, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_list_lol_get_all_data(). 10158 { 10159 struct rsbac_list_lol_reg_item_t * list; 10160 struct rsbac_list_lol_item_t * item_p; 10161 char * buffer; 10162 u_long lock_flags, rlock_flags; 10163 u_long offset = 0; 10164 long result = 0; 10165 u_int item_size; 10166 u_int item_offset; 10167 10168 if(!handle) 10169 return -RSBAC_EINVALIDVALUE; 10170 if(!array_p) 10171 return -RSBAC_EINVALIDVALUE; 10172 if(!list_initialized) 10173 return -RSBAC_ENOTINITIALIZED; 10174 10175 list = (struct rsbac_list_lol_reg_item_t *) handle; 10176 if(list->self != list) 10177 return -RSBAC_EINVALIDVALUE; 10178 *array_p = NULL; 10179 10180 #ifdef CONFIG_RSBAC_LIST_TRANS 10181 if(ta_number) 10182 { 10183 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 10184 return -RSBAC_EINVALIDTRANSACTION; 10185 } 10186 #endif 10187 10188 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 10189 /* 10190 #ifdef CONFIG_RSBAC_DEBUG 10191 if(rsbac_debug_lists) 10192 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_all_desc: list %s.\n", 10193 list->name); 10194 #endif 10195 */ 10196 rsbac_read_lock(&list->lock, &lock_flags); 10197 if(!list->info.data_size) 10198 { 10199 rsbac_read_unlock(&list->lock, &lock_flags); 10200 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 10201 return -RSBAC_EINVALIDREQUEST; 10202 } 10203 #ifdef CONFIG_RSBAC_LIST_TRANS 10204 if(ta_number && (list->ta_copied == ta_number)) 10205 { 10206 if(list->ta_count) 10207 { 10208 item_size = list->info.data_size; 10209 item_offset = list->info.desc_size; 10210 buffer = rsbac_vmalloc(item_size * list->ta_count); 10211 if(buffer) 10212 { 10213 item_p = list->ta_head; 10214 while(item_p) 10215 { 10216 if( !item_p->max_age 10217 || (item_p->max_age > RSBAC_CURRENT_TIME) 10218 ) 10219 { 10220 memcpy(buffer + offset, 10221 ((char *) item_p) + sizeof(*item_p) + item_offset, 10222 item_size); 10223 offset += item_size; 10224 result++; 10225 } 10226 item_p = item_p->next; 10227 } 10228 *array_p = buffer; 10229 } 10230 else 10231 { 10232 result = -RSBAC_ENOMEM; 10233 } 10234 } 10235 } 10236 else 10237 #endif 10238 if(list->count) 10239 { 10240 item_size = list->info.data_size; 10241 item_offset = list->info.desc_size; 10242 buffer = rsbac_vmalloc(item_size * list->count); 10243 if(buffer) 10244 { 10245 item_p = list->head; 10246 while(item_p) 10247 { 10248 if( !item_p->max_age 10249 || (item_p->max_age > RSBAC_CURRENT_TIME) 10250 ) 10251 { 10252 memcpy(buffer + offset, 10253 ((char *) item_p) + sizeof(*item_p) + item_offset, 10254 item_size); 10255 offset += item_size; 10256 result++; 10257 } 10258 item_p = item_p->next; 10259 } 10260 *array_p = buffer; 10261 } 10262 else 10263 { 10264 result = -RSBAC_ENOMEM; 10265 } 10266 } 10267 rsbac_read_unlock(&list->lock, &lock_flags); 10268 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 10269 return result; 10270 }
|
|
Definition at line 9793 of file gen_lists.c. References rsbac_list_lol_reg_item_t::count, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, rsbac_list_lol_item_t::max_age, rsbac_list_lol_item_t::next, NULL, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_acl_get_group_members(), rsbac_acl_list_all_dev(), rsbac_acl_list_all_major_dev(), rsbac_acl_list_all_user(), rsbac_list_lol_get_all_desc(), rsbac_um_get_gm_user_list(), and rsbac_um_get_user_list(). 09797 { 09798 struct rsbac_list_lol_reg_item_t * list; 09799 struct rsbac_list_lol_item_t * item_p; 09800 char * buffer; 09801 u_long lock_flags, rlock_flags; 09802 u_long offset = 0; 09803 long result = 0; 09804 u_int item_size; 09805 09806 if(!handle) 09807 return -RSBAC_EINVALIDVALUE; 09808 if(!array_p) 09809 return -RSBAC_EINVALIDVALUE; 09810 if(!list_initialized) 09811 return -RSBAC_ENOTINITIALIZED; 09812 09813 list = (struct rsbac_list_lol_reg_item_t *) handle; 09814 if(list->self != list) 09815 return -RSBAC_EINVALIDVALUE; 09816 *array_p = NULL; 09817 09818 #ifdef CONFIG_RSBAC_LIST_TRANS 09819 if(ta_number) 09820 { 09821 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09822 return -RSBAC_EINVALIDTRANSACTION; 09823 } 09824 #endif 09825 09826 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09827 /* 09828 #ifdef CONFIG_RSBAC_DEBUG 09829 if(rsbac_debug_lists) 09830 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_all_desc: list %s.\n", 09831 list->name); 09832 #endif 09833 */ 09834 rsbac_read_lock(&list->lock, &lock_flags); 09835 #ifdef CONFIG_RSBAC_LIST_TRANS 09836 if(ta_number && (list->ta_copied == ta_number)) 09837 { 09838 if(list->ta_count) 09839 { 09840 item_size = list->info.desc_size; 09841 buffer = rsbac_vmalloc(item_size * list->ta_count); 09842 if(buffer) 09843 { 09844 item_p = list->ta_head; 09845 while(item_p) 09846 { 09847 if( !item_p->max_age 09848 || (item_p->max_age > RSBAC_CURRENT_TIME) 09849 ) 09850 { 09851 memcpy(buffer + offset, 09852 ((char *) item_p) + sizeof(*item_p), 09853 item_size); 09854 offset += item_size; 09855 result++; 09856 } 09857 item_p = item_p->next; 09858 } 09859 *array_p = buffer; 09860 } 09861 else 09862 { 09863 result = -RSBAC_ENOMEM; 09864 } 09865 } 09866 } 09867 else 09868 #endif 09869 if(list->count) 09870 { 09871 item_size = list->info.desc_size; 09872 buffer = rsbac_vmalloc(item_size * list->count); 09873 if(buffer) 09874 { 09875 item_p = list->head; 09876 while(item_p) 09877 { 09878 if( !item_p->max_age 09879 || (item_p->max_age > RSBAC_CURRENT_TIME) 09880 ) 09881 { 09882 memcpy(buffer + offset, 09883 ((char *) item_p) + sizeof(*item_p), 09884 item_size); 09885 offset += item_size; 09886 result++; 09887 } 09888 item_p = item_p->next; 09889 } 09890 *array_p = buffer; 09891 } 09892 else 09893 { 09894 result = -RSBAC_ENOMEM; 09895 } 09896 } 09897 rsbac_read_unlock(&list->lock, &lock_flags); 09898 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09899 return result; 09900 }
|
|
Definition at line 10623 of file gen_lists.c. References rsbac_list_lol_reg_item_t::count, rsbac_list_lol_info_t::data_size, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_reg_head_t::lock, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, rsbac_list_lol_item_t::max_age, rsbac_list_lol_item_t::next, NULL, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_list_lol_get_all_items(). 10627 { 10628 struct rsbac_list_lol_reg_item_t * list; 10629 struct rsbac_list_lol_item_t * item_p; 10630 char * buffer; 10631 u_long lock_flags, rlock_flags; 10632 u_long offset = 0; 10633 long result = 0; 10634 u_int item_size; 10635 10636 if(!handle) 10637 return -RSBAC_EINVALIDVALUE; 10638 if(!array_p) 10639 return -RSBAC_EINVALIDVALUE; 10640 if(!list_initialized) 10641 return -RSBAC_ENOTINITIALIZED; 10642 10643 list = (struct rsbac_list_lol_reg_item_t *) handle; 10644 if(list->self != list) 10645 return -RSBAC_EINVALIDVALUE; 10646 *array_p = NULL; 10647 10648 #ifdef CONFIG_RSBAC_LIST_TRANS 10649 if(ta_number) 10650 { 10651 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 10652 return -RSBAC_EINVALIDTRANSACTION; 10653 } 10654 #endif 10655 10656 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 10657 /* 10658 #ifdef CONFIG_RSBAC_DEBUG 10659 if(rsbac_debug_lists) 10660 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_all_items: list %s.\n", 10661 list->name); 10662 #endif 10663 */ 10664 rsbac_read_lock(&list->lock, &lock_flags); 10665 #ifdef CONFIG_RSBAC_LIST_TRANS 10666 if(ta_number && (list->ta_copied == ta_number)) 10667 { 10668 if(list->ta_count) 10669 { 10670 item_size = list->info.desc_size + list->info.data_size; 10671 buffer = rsbac_vmalloc(item_size * list->ta_count); 10672 if(buffer) 10673 { 10674 item_p = list->ta_head; 10675 while(item_p) 10676 { 10677 if( !item_p->max_age 10678 || (item_p->max_age > RSBAC_CURRENT_TIME) 10679 ) 10680 { 10681 memcpy(buffer + offset, 10682 ((char *) item_p) + sizeof(*item_p), 10683 item_size); 10684 offset += item_size; 10685 result++; 10686 } 10687 item_p = item_p->next; 10688 } 10689 *array_p = buffer; 10690 } 10691 else 10692 { 10693 result = -RSBAC_ENOMEM; 10694 } 10695 } 10696 } 10697 else 10698 #endif 10699 if(list->count) 10700 { 10701 item_size = list->info.desc_size + list->info.data_size; 10702 buffer = rsbac_vmalloc(item_size * list->count); 10703 if(buffer) 10704 { 10705 item_p = list->head; 10706 while(item_p) 10707 { 10708 if( !item_p->max_age 10709 || (item_p->max_age > RSBAC_CURRENT_TIME) 10710 ) 10711 { 10712 memcpy(buffer + offset, 10713 ((char *) item_p) + sizeof(*item_p), 10714 item_size); 10715 offset += item_size; 10716 result++; 10717 } 10718 item_p = item_p->next; 10719 } 10720 *array_p = buffer; 10721 } 10722 else 10723 { 10724 result = -RSBAC_ENOMEM; 10725 } 10726 } 10727 rsbac_read_unlock(&list->lock, &lock_flags); 10728 rsbac_read_unlock(®_head.lock, &rlock_flags); 10729 return result; 10730 }
|
|
Definition at line 10049 of file gen_lists.c. References rsbac_list_lol_item_t::count, rsbac_list_lol_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), rsbac_list_item_t::max_age, rsbac_list_item_t::next, NULL, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, rsbac_list_lol_reg_item_t::self, rsbac_list_lol_info_t::subdata_size, and rsbac_list_lol_info_t::subdesc_size. Referenced by rsbac_list_lol_get_all_subdata(). 10054 { 10055 struct rsbac_list_lol_reg_item_t * list; 10056 struct rsbac_list_lol_item_t * sublist; 10057 struct rsbac_list_item_t * item_p; 10058 char * buffer; 10059 u_long lock_flags, rlock_flags; 10060 u_long offset = 0; 10061 long result = 0; 10062 u_int item_size; 10063 u_int item_offset; 10064 10065 if(!handle) 10066 return -RSBAC_EINVALIDVALUE; 10067 if(!array_p) 10068 return -RSBAC_EINVALIDVALUE; 10069 if(!list_initialized) 10070 return -RSBAC_ENOTINITIALIZED; 10071 10072 list = (struct rsbac_list_lol_reg_item_t *) handle; 10073 if(list->self != list) 10074 return -RSBAC_EINVALIDVALUE; 10075 *array_p = NULL; 10076 10077 #ifdef CONFIG_RSBAC_LIST_TRANS 10078 if(ta_number) 10079 { 10080 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 10081 return -RSBAC_EINVALIDTRANSACTION; 10082 } 10083 #endif 10084 10085 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 10086 /* 10087 #ifdef CONFIG_RSBAC_DEBUG 10088 if(rsbac_debug_lists) 10089 rsbac_printk(KERN_DEBUG "rsbac_ta_list_lol_get_all_desc: list %s.\n", 10090 list->name); 10091 #endif 10092 */ 10093 rsbac_read_lock(&list->lock, &lock_flags); 10094 if(!list->info.subdata_size) 10095 { 10096 rsbac_read_unlock(&list->lock, &lock_flags); 10097 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 10098 return -RSBAC_EINVALIDREQUEST; 10099 } 10100 #ifdef CONFIG_RSBAC_LIST_TRANS 10101 if(ta_number && (list->ta_copied == ta_number)) 10102 sublist = ta_lookup_lol_item(ta_number, list, desc); 10103 else 10104 #endif 10105 sublist = lookup_lol_item(list, desc); 10106 if(sublist && sublist->count) 10107 { 10108 item_size = list->info.subdata_size; 10109 item_offset = list->info.subdesc_size; 10110 buffer = rsbac_vmalloc(item_size * sublist->count); 10111 if(buffer) 10112 { 10113 item_p = sublist->head; 10114 while(item_p) 10115 { 10116 if( !item_p->max_age 10117 || (item_p->max_age > RSBAC_CURRENT_TIME) 10118 ) 10119 { 10120 memcpy(buffer + offset, 10121 ((char *) item_p) + sizeof(*item_p) + item_offset, 10122 item_size); 10123 offset += item_size; 10124 result++; 10125 } 10126 item_p = item_p->next; 10127 } 10128 *array_p = buffer; 10129 } 10130 else 10131 { 10132 result = -RSBAC_ENOMEM; 10133 } 10134 } 10135 rsbac_read_unlock(&list->lock, &lock_flags); 10136 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 10137 return result; 10138 }
|
|
Definition at line 9669 of file gen_lists.c. References rsbac_list_lol_item_t::count, rsbac_list_lol_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), rsbac_list_item_t::max_age, rsbac_list_item_t::next, NULL, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, rsbac_list_lol_reg_item_t::self, and rsbac_list_lol_info_t::subdesc_size. Referenced by rsbac_acl_get_user_groups(), rsbac_auth_get_f_caplist(), rsbac_auth_get_p_caplist(), rsbac_list_lol_get_all_subdesc(), rsbac_list_lol_get_all_subdesc_ttl(), rsbac_mac_get_f_trulist(), rsbac_mac_get_p_trulist(), rsbac_rc_copy_role(), rsbac_rc_get_list(), and rsbac_um_get_gm_list(). 09675 { 09676 struct rsbac_list_lol_reg_item_t * list; 09677 struct rsbac_list_lol_item_t * sublist; 09678 struct rsbac_list_item_t * item_p; 09679 char * buffer; 09680 rsbac_time_t * ttl_p = NULL; 09681 u_long lock_flags, rlock_flags; 09682 u_long offset = 0; 09683 long result = 0; 09684 u_int item_size; 09685 09686 if(!handle) 09687 return -RSBAC_EINVALIDVALUE; 09688 if(!array_p) 09689 return -RSBAC_EINVALIDVALUE; 09690 if(!list_initialized) 09691 return -RSBAC_ENOTINITIALIZED; 09692 09693 list = (struct rsbac_list_lol_reg_item_t *) handle; 09694 if(list->self != list) 09695 return -RSBAC_EINVALIDVALUE; 09696 *array_p = NULL; 09697 09698 #ifdef CONFIG_RSBAC_LIST_TRANS 09699 if(ta_number) 09700 { 09701 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09702 return -RSBAC_EINVALIDTRANSACTION; 09703 } 09704 #endif 09705 09706 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09707 /* 09708 #ifdef CONFIG_RSBAC_DEBUG 09709 if(rsbac_debug_lists) 09710 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_all_desc: list %s.\n", 09711 list->name); 09712 #endif 09713 */ 09714 rsbac_read_lock(&list->lock, &lock_flags); 09715 #ifdef CONFIG_RSBAC_LIST_TRANS 09716 if(ta_number && (list->ta_copied == ta_number)) 09717 sublist = ta_lookup_lol_item(ta_number, list, desc); 09718 else 09719 #endif 09720 sublist = lookup_lol_item(list, desc); 09721 if(sublist && sublist->count) 09722 { 09723 item_size = list->info.subdesc_size; 09724 buffer = rsbac_vmalloc(item_size * sublist->count); 09725 if(buffer) 09726 { 09727 if(ttl_array_p) 09728 ttl_p = rsbac_vmalloc(sizeof(**ttl_array_p) * sublist->count); 09729 item_p = sublist->head; 09730 while(item_p) 09731 { 09732 if( !item_p->max_age 09733 || (item_p->max_age > RSBAC_CURRENT_TIME) 09734 ) 09735 { 09736 memcpy(buffer + offset, 09737 ((char *) item_p) + sizeof(*item_p), 09738 item_size); 09739 if(ttl_p) 09740 { 09741 if(item_p->max_age) 09742 ttl_p[result] = item_p->max_age - RSBAC_CURRENT_TIME; 09743 else 09744 ttl_p[result] = 0; 09745 } 09746 offset += item_size; 09747 result++; 09748 } 09749 item_p = item_p->next; 09750 } 09751 *array_p = buffer; 09752 if(ttl_array_p) 09753 *ttl_array_p = ttl_p; 09754 } 09755 else 09756 { 09757 result = -RSBAC_ENOMEM; 09758 } 09759 } 09760 rsbac_read_unlock(&list->lock, &lock_flags); 09761 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09762 return result; 09763 }
|
|
Definition at line 10502 of file gen_lists.c. References rsbac_list_lol_item_t::count, rsbac_list_lol_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), rsbac_list_item_t::max_age, rsbac_list_item_t::next, NULL, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOMEM, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_vmalloc, rsbac_list_lol_reg_item_t::self, rsbac_list_lol_info_t::subdata_size, and rsbac_list_lol_info_t::subdesc_size. Referenced by rsbac_acl_get_tlist(), rsbac_list_lol_get_all_subitems(), rsbac_list_lol_get_all_subitems_ttl(), and rsbac_rc_copy_role(). 10508 { 10509 struct rsbac_list_lol_reg_item_t * list; 10510 struct rsbac_list_lol_item_t * sublist; 10511 struct rsbac_list_item_t * item_p; 10512 char * buffer; 10513 rsbac_time_t * ttl_p = NULL; 10514 u_long lock_flags, rlock_flags; 10515 u_long offset = 0; 10516 long result = 0; 10517 u_int item_size; 10518 10519 if(!handle) 10520 return -RSBAC_EINVALIDVALUE; 10521 if(!array_p) 10522 return -RSBAC_EINVALIDVALUE; 10523 if(!list_initialized) 10524 return -RSBAC_ENOTINITIALIZED; 10525 10526 list = (struct rsbac_list_lol_reg_item_t *) handle; 10527 if(list->self != list) 10528 return -RSBAC_EINVALIDVALUE; 10529 *array_p = NULL; 10530 10531 #ifdef CONFIG_RSBAC_LIST_TRANS 10532 if(ta_number) 10533 { 10534 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 10535 return -RSBAC_EINVALIDTRANSACTION; 10536 } 10537 #endif 10538 10539 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 10540 /* 10541 #ifdef CONFIG_RSBAC_DEBUG 10542 if(rsbac_debug_lists) 10543 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_all_subitems: list %s.\n", 10544 list->name); 10545 #endif 10546 */ 10547 rsbac_read_lock(&list->lock, &lock_flags); 10548 #ifdef CONFIG_RSBAC_LIST_TRANS 10549 if(ta_number && (list->ta_copied == ta_number)) 10550 sublist = ta_lookup_lol_item(ta_number, list, desc); 10551 else 10552 #endif 10553 sublist = lookup_lol_item(list, desc); 10554 if(sublist && sublist->count) 10555 { 10556 item_size = list->info.subdesc_size + list->info.subdata_size; 10557 buffer = rsbac_vmalloc(item_size * sublist->count); 10558 if(buffer) 10559 { 10560 if(ttl_array_p) 10561 ttl_p = rsbac_vmalloc(sizeof(**ttl_array_p) * sublist->count); 10562 item_p = sublist->head; 10563 while(item_p) 10564 { 10565 if( !item_p->max_age 10566 || (item_p->max_age > RSBAC_CURRENT_TIME) 10567 ) 10568 { 10569 memcpy(buffer + offset, 10570 ((char *) item_p) + sizeof(*item_p), 10571 item_size); 10572 if(ttl_p) 10573 { 10574 if(item_p->max_age) 10575 ttl_p[result] = item_p->max_age - RSBAC_CURRENT_TIME; 10576 else 10577 ttl_p[result] = 0; 10578 } 10579 offset += item_size; 10580 result++; 10581 } 10582 item_p = item_p->next; 10583 } 10584 *array_p = buffer; 10585 if(ttl_array_p) 10586 *ttl_array_p = ttl_p; 10587 } 10588 else 10589 { 10590 result = -RSBAC_ENOMEM; 10591 } 10592 } 10593 rsbac_read_unlock(&list->lock, &lock_flags); 10594 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 10595 return result; 10596 }
|
|
Definition at line 8467 of file gen_lists.c. References rsbac_list_lol_info_t::data_size, rsbac_list_lol_reg_item_t::def_data, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), rsbac_list_lol_item_t::max_age, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_acl_get_mask(), rsbac_acl_get_rights(), rsbac_acl_get_single_right(), rsbac_acl_remove_acl_entry(), rsbac_list_lol_get_data(), rsbac_list_lol_get_data_ttl(), rsbac_um_check_account(), rsbac_um_check_pass(), rsbac_um_get_user_entry(), rsbac_um_get_user_item(), rsbac_um_mod_user(), and rsbac_um_set_pass(). 08473 { 08474 struct rsbac_list_lol_reg_item_t * list; 08475 struct rsbac_list_lol_item_t * item_p; 08476 u_long lock_flags, rlock_flags; 08477 int err = 0; 08478 08479 if(!handle || !desc) 08480 return -RSBAC_EINVALIDVALUE; 08481 if(!list_initialized) 08482 return -RSBAC_ENOTINITIALIZED; 08483 08484 list = (struct rsbac_list_lol_reg_item_t *) handle; 08485 if(list->self != list) 08486 return -RSBAC_EINVALIDVALUE; 08487 08488 #ifdef CONFIG_RSBAC_LIST_TRANS 08489 if(ta_number) 08490 { 08491 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08492 return -RSBAC_EINVALIDTRANSACTION; 08493 } 08494 #endif 08495 08496 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 08497 /* 08498 #ifdef CONFIG_RSBAC_DEBUG 08499 if(rsbac_debug_lists) 08500 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_data: getting data from list %s.\n", 08501 list->name); 08502 #endif 08503 */ 08504 if(data && !list->info.data_size) 08505 { 08506 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08507 return -RSBAC_EINVALIDREQUEST; 08508 } 08509 08510 rsbac_read_lock(&list->lock, &lock_flags); 08511 08512 #ifdef CONFIG_RSBAC_LIST_TRANS 08513 if(ta_number && (list->ta_copied == ta_number)) 08514 item_p = ta_lookup_lol_item(ta_number, list, desc); 08515 else 08516 #endif 08517 item_p = lookup_lol_item(list, desc); 08518 if( item_p 08519 && ( !item_p->max_age 08520 || (item_p->max_age > RSBAC_CURRENT_TIME) 08521 ) 08522 ) 08523 { /* exists -> copy data, if any */ 08524 if(ttl_p) 08525 { 08526 if(item_p->max_age) 08527 *ttl_p = item_p->max_age - RSBAC_CURRENT_TIME; 08528 else 08529 *ttl_p = 0; 08530 } 08531 if(data) 08532 { 08533 memcpy(data, 08534 ((char *) item_p) + sizeof(*item_p) + list->info.desc_size, 08535 list->info.data_size); 08536 } 08537 } 08538 else 08539 { 08540 if(!list->def_data) 08541 err = -RSBAC_ENOTFOUND; 08542 else 08543 { 08544 if(ttl_p) 08545 *ttl_p = 0; 08546 if(data) 08547 memcpy(data, 08548 list->def_data, 08549 list->info.data_size); 08550 } 08551 } 08552 rsbac_read_unlock(&list->lock, &lock_flags); 08553 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08554 return err; 08555 }
|
|
Definition at line 8913 of file gen_lists.c. References rsbac_list_lol_info_t::data_size, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item_data(), RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_list_lol_get_desc(), and rsbac_um_get_uid(). 08919 { 08920 struct rsbac_list_lol_reg_item_t * list; 08921 struct rsbac_list_lol_item_t * item_p; 08922 u_long lock_flags, rlock_flags; 08923 int err = 0; 08924 08925 if(!handle || !desc || !data) 08926 return -RSBAC_EINVALIDVALUE; 08927 if(!list_initialized) 08928 return -RSBAC_ENOTINITIALIZED; 08929 08930 list = (struct rsbac_list_lol_reg_item_t *) handle; 08931 if(list->self != list) 08932 return -RSBAC_EINVALIDVALUE; 08933 08934 #ifdef CONFIG_RSBAC_LIST_TRANS 08935 if(ta_number) 08936 { 08937 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08938 return -RSBAC_EINVALIDTRANSACTION; 08939 } 08940 #endif 08941 08942 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 08943 /* 08944 #ifdef CONFIG_RSBAC_DEBUG 08945 if(rsbac_debug_lists) 08946 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_desc: getting desc from list %s.\n", 08947 list->name); 08948 #endif 08949 */ 08950 if(!list->info.data_size) 08951 { 08952 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08953 return -RSBAC_EINVALIDREQUEST; 08954 } 08955 08956 rsbac_read_lock(&list->lock, &lock_flags); 08957 08958 #ifdef CONFIG_RSBAC_LIST_TRANS 08959 if(ta_number && (list->ta_copied == ta_number)) 08960 item_p = ta_lookup_lol_item_data(ta_number, list, data, compare); 08961 else 08962 #endif 08963 item_p = lookup_lol_item_data(list, data, compare); 08964 if(item_p) 08965 { /* exists -> copy desc */ 08966 memcpy(desc, 08967 ((char *) item_p) + sizeof(*item_p), 08968 list->info.desc_size); 08969 } 08970 else 08971 { 08972 err = -RSBAC_ENOTFOUND; 08973 } 08974 rsbac_read_unlock(&list->lock, &lock_flags); 08975 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08976 return err; 08977 }
|
|
Definition at line 8736 of file gen_lists.c. References rsbac_list_lol_reg_item_t::curr, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), rsbac_list_lol_item_t::max_age, rsbac_list_lol_item_t::next, RSBAC_EINVALIDPOINTER, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_list_lol_get_next_desc(), and rsbac_um_get_next_user(). 08741 { 08742 struct rsbac_list_lol_reg_item_t * list; 08743 struct rsbac_list_lol_item_t * item_p; 08744 u_long lock_flags, rlock_flags; 08745 08746 if(!handle) 08747 return -RSBAC_EINVALIDVALUE; 08748 if(!list_initialized) 08749 return -RSBAC_ENOTINITIALIZED; 08750 if(!next_desc) 08751 return -RSBAC_EINVALIDPOINTER; 08752 08753 list = (struct rsbac_list_lol_reg_item_t *) handle; 08754 if(list->self != list) 08755 return -RSBAC_EINVALIDVALUE; 08756 08757 #ifdef CONFIG_RSBAC_LIST_TRANS 08758 if(ta_number) 08759 { 08760 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08761 return -RSBAC_EINVALIDTRANSACTION; 08762 } 08763 #endif 08764 08765 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 08766 /* 08767 #ifdef CONFIG_RSBAC_DEBUG 08768 if(rsbac_debug_lists) 08769 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_next_desc: list %s.\n", 08770 list->name); 08771 #endif 08772 */ 08773 rsbac_read_lock(&list->lock, &lock_flags); 08774 if(old_desc) 08775 { 08776 #ifdef CONFIG_RSBAC_LIST_TRANS 08777 if(ta_number && (list->ta_copied == ta_number)) 08778 item_p = ta_lookup_lol_item(ta_number, list, old_desc); 08779 else 08780 #endif 08781 item_p = lookup_lol_item(list, old_desc); 08782 if(item_p) 08783 item_p = item_p->next; 08784 } 08785 else 08786 #ifdef CONFIG_RSBAC_LIST_TRANS 08787 if(ta_number && (list->ta_copied == ta_number)) 08788 item_p = list->ta_head; 08789 else 08790 #endif 08791 item_p = list->head; 08792 while( item_p 08793 && item_p->max_age 08794 && (item_p->max_age > RSBAC_CURRENT_TIME) 08795 ) 08796 item_p = item_p->next; 08797 if(item_p) 08798 { 08799 memcpy(next_desc, (char *)item_p + sizeof(*item_p), list->info.desc_size); 08800 list->curr = item_p; 08801 } 08802 rsbac_read_unlock(&list->lock, &lock_flags); 08803 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08804 if(item_p) 08805 return 0; 08806 else 08807 return -RSBAC_ENOTFOUND; 08808 }
|
|
Definition at line 8328 of file gen_lists.c. References rsbac_list_lol_reg_item_t::def_subdata, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), lookup_lol_subitem(), rsbac_list_item_t::max_age, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, rsbac_list_lol_info_t::subdata_size, and rsbac_list_lol_info_t::subdesc_size. Referenced by rsbac_acl_add_to_acl_entry(), rsbac_acl_get_group_members(), rsbac_acl_get_rights(), rsbac_acl_get_single_right(), rsbac_acl_remove_from_acl_entry(), rsbac_list_lol_get_subdata(), rsbac_list_lol_get_subdata_ttl(), rsbac_rc_copy_type(), and rsbac_rc_get_item(). 08335 { 08336 struct rsbac_list_lol_reg_item_t * list; 08337 struct rsbac_list_lol_item_t * sublist; 08338 struct rsbac_list_item_t * item_p; 08339 u_long lock_flags, rlock_flags; 08340 int err = 0; 08341 08342 if(!handle || !desc || !subdesc) 08343 return -RSBAC_EINVALIDVALUE; 08344 if(!list_initialized) 08345 return -RSBAC_ENOTINITIALIZED; 08346 08347 list = (struct rsbac_list_lol_reg_item_t *) handle; 08348 if(list->self != list) 08349 return -RSBAC_EINVALIDVALUE; 08350 08351 #ifdef CONFIG_RSBAC_LIST_TRANS 08352 if(ta_number) 08353 { 08354 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08355 return -RSBAC_EINVALIDTRANSACTION; 08356 } 08357 #endif 08358 08359 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 08360 /* 08361 #ifdef CONFIG_RSBAC_DEBUG 08362 if(rsbac_debug_lists) 08363 rsbac_printk(KERN_DEBUG "rsbac_list_lol_get_subdata: getting data from list %s.\n", 08364 list->name); 08365 #endif 08366 */ 08367 if(subdata && !list->info.subdata_size) 08368 { 08369 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08370 return -RSBAC_EINVALIDREQUEST; 08371 } 08372 08373 rsbac_read_lock(&list->lock, &lock_flags); 08374 08375 #ifdef CONFIG_RSBAC_LIST_TRANS 08376 if(ta_number && (list->ta_copied == ta_number)) 08377 sublist = ta_lookup_lol_item(ta_number, list, desc); 08378 else 08379 #endif 08380 sublist = lookup_lol_item(list, desc); 08381 if(sublist) 08382 { /* exists -> lookup subitem */ 08383 item_p = lookup_lol_subitem(list, sublist, subdesc); 08384 if( item_p 08385 && ( !item_p->max_age 08386 || (item_p->max_age > RSBAC_CURRENT_TIME) 08387 ) 08388 ) 08389 { /* exists -> copy data, if any */ 08390 if(ttl_p) 08391 { 08392 if(item_p->max_age) 08393 *ttl_p = item_p->max_age - RSBAC_CURRENT_TIME; 08394 else 08395 *ttl_p = 0; 08396 } 08397 if(subdata) 08398 { 08399 memcpy(subdata, 08400 ((char *) item_p) + sizeof(*item_p) + list->info.subdesc_size, 08401 list->info.subdata_size); 08402 } 08403 } 08404 else 08405 { 08406 if(!list->def_subdata) 08407 err = -RSBAC_ENOTFOUND; 08408 else 08409 { 08410 if(ttl_p) 08411 *ttl_p = 0; 08412 if(subdata) 08413 memcpy(subdata, 08414 list->def_subdata, 08415 list->info.subdata_size); 08416 } 08417 } 08418 } 08419 else 08420 { 08421 if(!list->def_subdata) 08422 err = -RSBAC_ENOTFOUND; 08423 else 08424 { 08425 if(ttl_p) 08426 *ttl_p = 0; 08427 if(subdata) 08428 memcpy(subdata, 08429 list->def_subdata, 08430 list->info.subdata_size); 08431 } 08432 } 08433 rsbac_read_unlock(&list->lock, &lock_flags); 08434 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08435 return err; 08436 }
|
|
Definition at line 8030 of file gen_lists.c. References rsbac_list_lol_reg_item_t::dirty, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, lookup_lol_item(), remove_lol_item(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_acl_remove_acl(), rsbac_acl_remove_acl_entry(), rsbac_acl_remove_group_member(), rsbac_acl_remove_user(), rsbac_auth_clear_f_capset(), rsbac_auth_clear_p_capset(), rsbac_list_lol_remove(), rsbac_mac_clear_f_truset(), rsbac_mac_clear_p_truset(), rsbac_pm_exists(), rsbac_pm_remove_set(), rsbac_pm_remove_target(), rsbac_rc_copy_role(), rsbac_rc_set_item(), and rsbac_um_remove_user(). 08034 { 08035 struct rsbac_list_lol_reg_item_t * list; 08036 u_long lock_flags, rlock_flags; 08037 08038 if(!handle || !desc) 08039 return -RSBAC_EINVALIDVALUE; 08040 if(!list_initialized) 08041 return -RSBAC_ENOTINITIALIZED; 08042 08043 list = (struct rsbac_list_lol_reg_item_t *) handle; 08044 if(list->self != list) 08045 return -RSBAC_EINVALIDVALUE; 08046 08047 #ifdef CONFIG_RSBAC_LIST_TRANS 08048 if(ta_number) 08049 { 08050 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08051 return -RSBAC_EINVALIDTRANSACTION; 08052 } 08053 #endif 08054 08055 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 08056 /* 08057 #ifdef CONFIG_RSBAC_DEBUG 08058 if(rsbac_debug_lists) 08059 rsbac_printk(KERN_DEBUG "rsbac_list_lol_remove: removing from list of lists %s.\n", 08060 list->name); 08061 #endif 08062 */ 08063 rsbac_write_lock(&list->lock, &lock_flags); 08064 #ifdef CONFIG_RSBAC_LIST_TRANS 08065 if(list->ta_copied) 08066 { 08067 if(ta_number) 08068 { 08069 if(ta_lookup_lol_item(list->ta_copied, list, desc)) 08070 { 08071 if(list->ta_copied != ta_number) 08072 { 08073 rsbac_write_unlock(&list->lock, &lock_flags); 08074 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08075 return -RSBAC_EBUSY; 08076 } 08077 else 08078 ta_remove_lol_item(ta_number, list, desc); 08079 } 08080 } 08081 else 08082 ta_remove_lol_item(list->ta_copied, list, desc); 08083 } 08084 else 08085 { 08086 if(ta_number && lookup_lol_item(list, desc)) 08087 { 08088 ta_lol_copy(ta_number, list); 08089 ta_remove_lol_item(ta_number, list, desc); 08090 } 08091 } 08092 if(!ta_number) 08093 #endif 08094 { 08095 if(lookup_lol_item(list, desc)) 08096 { /* exists -> remove */ 08097 remove_lol_item(list, desc); 08098 lol_touch(list); 08099 list->dirty = TRUE; 08100 } 08101 } 08102 rsbac_write_unlock(&list->lock, &lock_flags); 08103 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08104 return 0; 08105 }
|
|
Definition at line 8121 of file gen_lists.c. References rsbac_list_lol_reg_item_t::dirty, rsbac_list_lol_reg_item_t::head, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, NULL, remove_all_lol_items(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_list_lol_remove_all(). 08122 { 08123 struct rsbac_list_lol_reg_item_t * list; 08124 u_long lock_flags, rlock_flags; 08125 08126 if(!handle) 08127 return -RSBAC_EINVALIDVALUE; 08128 if(!list_initialized) 08129 return -RSBAC_ENOTINITIALIZED; 08130 08131 list = (struct rsbac_list_lol_reg_item_t *) handle; 08132 if(list->self != list) 08133 return -RSBAC_EINVALIDVALUE; 08134 08135 #ifdef CONFIG_RSBAC_LIST_TRANS 08136 if(ta_number) 08137 { 08138 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 08139 return -RSBAC_EINVALIDTRANSACTION; 08140 } 08141 #endif 08142 08143 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 08144 /* 08145 #ifdef CONFIG_RSBAC_DEBUG 08146 if(rsbac_debug_lists) 08147 rsbac_printk(KERN_DEBUG "rsbac_list_lol_remove_all: removing all items from list of lists %s.\n", 08148 list->name); 08149 #endif 08150 */ 08151 rsbac_write_lock(&list->lock, &lock_flags); 08152 #ifdef CONFIG_RSBAC_LIST_TRANS 08153 if(list->ta_copied) 08154 { 08155 if(ta_number) 08156 { 08157 if(list->ta_copied == ta_number) 08158 { 08159 ta_remove_all_lol_items(list); 08160 if(!list->head) 08161 { 08162 list->ta_copied = 0; 08163 } 08164 } 08165 else 08166 { 08167 rsbac_write_unlock(&list->lock, &lock_flags); 08168 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08169 return -RSBAC_EBUSY; 08170 } 08171 } 08172 else 08173 ta_remove_all_lol_items(list); 08174 } 08175 else 08176 { 08177 if(ta_number) 08178 { 08179 if(list->head) 08180 { 08181 list->ta_head = NULL; 08182 list->ta_tail = NULL; 08183 list->ta_curr = NULL; 08184 list->ta_count = 0; 08185 list->ta_copied = ta_number; 08186 } 08187 } 08188 } 08189 08190 if(!ta_number) 08191 #endif 08192 if(list->head) 08193 { 08194 remove_all_lol_items(list); 08195 lol_touch(list); 08196 list->dirty = TRUE; 08197 } 08198 rsbac_write_unlock(&list->lock, &lock_flags); 08199 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08200 return 0; 08201 }
|
|
Definition at line 7112 of file gen_lists.c. References add_lol_item(), add_lol_subitem(), rsbac_list_lol_reg_item_t::def_data, rsbac_list_lol_reg_item_t::def_subdata, rsbac_list_lol_reg_item_t::dirty, do_remove_lol_subitem(), rsbac_list_lol_reg_item_t::flags, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, lookup_lol_item(), lookup_lol_subitem(), rsbac_list_item_t::max_age, rsbac_list_lol_item_t::max_age, remove_lol_item(), RSBAC_EBUSY, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_DEF_DATA, RSBAC_LIST_MAX_AGE_LIMIT, RSBAC_LIST_TTL_KEEP, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, rsbac_list_lol_info_t::subdata_size, rsbac_list_lol_info_t::subdesc_size, and TRUE. Referenced by rsbac_acl_add_group_member(), rsbac_acl_add_to_acl_entry(), rsbac_acl_remove_from_acl_entry(), rsbac_acl_set_acl_entry(), rsbac_auth_add_to_f_capset(), rsbac_auth_add_to_p_capset(), rsbac_list_lol_subadd(), rsbac_list_lol_subadd_ttl(), rsbac_mac_add_to_f_truset(), rsbac_mac_add_to_p_truset(), rsbac_pm_add_to_set(), rsbac_rc_copy_role(), rsbac_rc_copy_type(), rsbac_rc_set_item(), and rsbac_um_add_gm(). 07119 { 07120 struct rsbac_list_lol_reg_item_t * list; 07121 struct rsbac_list_lol_item_t * sublist; 07122 struct rsbac_list_item_t * item_p; 07123 u_long lock_flags, rlock_flags; 07124 int err = 0; 07125 07126 if(!handle || !desc || !subdesc) 07127 return -RSBAC_EINVALIDVALUE; 07128 if(!list_initialized) 07129 return -RSBAC_ENOTINITIALIZED; 07130 07131 list = (struct rsbac_list_lol_reg_item_t *) handle; 07132 if(!list || (list->self != list)) 07133 return -RSBAC_EINVALIDVALUE; 07134 07135 #ifdef CONFIG_RSBAC_LIST_TRANS 07136 if(ta_number && !rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07137 return -RSBAC_EINVALIDTRANSACTION; 07138 #endif 07139 07140 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 07141 if(list->info.subdata_size && !subdata) 07142 { 07143 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07144 return -RSBAC_EINVALIDVALUE; 07145 } 07146 07147 /* 07148 #ifdef CONFIG_RSBAC_DEBUG 07149 if(rsbac_debug_lists) 07150 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subadd: adding to list %s.\n", 07151 list->name); 07152 #endif 07153 */ 07154 rsbac_write_lock(&list->lock, &lock_flags); 07155 07156 #ifdef CONFIG_RSBAC_LIST_TRANS 07157 if(!ta_number) 07158 #endif 07159 { 07160 sublist = lookup_lol_item(list, desc); 07161 if( !sublist 07162 && (list->flags & RSBAC_LIST_DEF_DATA) 07163 ) 07164 sublist = add_lol_item(list, 0, desc, list->def_data); 07165 if(sublist) 07166 { 07167 if( sublist->max_age 07168 && (sublist->max_age <= RSBAC_CURRENT_TIME) 07169 ) 07170 { 07171 remove_lol_item(list, desc); 07172 err = -RSBAC_EINVALIDTARGET; 07173 } 07174 else 07175 { 07176 /* exists -> lookup subitem */ 07177 if(ttl && (ttl != RSBAC_LIST_TTL_KEEP)) 07178 { 07179 if(ttl > RSBAC_LIST_MAX_AGE_LIMIT) 07180 ttl = RSBAC_LIST_MAX_AGE_LIMIT; 07181 ttl += RSBAC_CURRENT_TIME; 07182 } 07183 item_p = lookup_lol_subitem(list, sublist, subdesc); 07184 if(item_p) 07185 { /* exists -> update data, if any */ 07186 if(ttl != RSBAC_LIST_TTL_KEEP) 07187 item_p->max_age = ttl; 07188 if(subdata && list->info.subdata_size) 07189 { 07190 if( list->def_subdata 07191 && !item_p->max_age 07192 && !memcmp(list->def_subdata, subdata, list->info.subdata_size) 07193 ) 07194 do_remove_lol_subitem(sublist, item_p); 07195 else 07196 memcpy(((char *) item_p) + sizeof(*item_p) + list->info.subdesc_size, 07197 subdata, 07198 list->info.subdata_size); 07199 } 07200 } 07201 else 07202 { 07203 if(ttl == RSBAC_LIST_TTL_KEEP) 07204 ttl = 0; 07205 if( !list->def_subdata 07206 || memcmp(list->def_subdata, subdata, list->info.subdata_size) 07207 ) 07208 add_lol_subitem(list, sublist, ttl, subdesc, subdata); 07209 } 07210 lol_touch(list); 07211 list->dirty = TRUE; 07212 } 07213 } 07214 else 07215 { 07216 err = -RSBAC_EINVALIDTARGET; 07217 goto out_unlock; 07218 } 07219 } 07220 #ifdef CONFIG_RSBAC_LIST_TRANS 07221 if(list->ta_copied || ta_number) 07222 { 07223 if(!list->ta_copied) 07224 { 07225 if((err = ta_lol_copy(ta_number,list))) 07226 goto out_unlock; 07227 } 07228 else 07229 if(ta_number) 07230 { 07231 if(list->ta_copied != ta_number) 07232 { 07233 err = -RSBAC_EBUSY; 07234 goto out_unlock; 07235 } 07236 } 07237 else 07238 ta_number = list->ta_copied; 07239 sublist = ta_lookup_lol_item(ta_number, list, desc); 07240 if( !sublist 07241 && (list->flags & RSBAC_LIST_DEF_DATA) 07242 ) 07243 sublist = ta_add_lol_item(ta_number, list, 0, desc, list->def_data); 07244 if(sublist) 07245 { 07246 if( sublist->max_age 07247 && (sublist->max_age <= RSBAC_CURRENT_TIME) 07248 ) 07249 { 07250 ta_remove_lol_item(ta_number, list, desc); 07251 err = -RSBAC_EINVALIDTARGET; 07252 } 07253 else 07254 { 07255 /* exists -> lookup subitem */ 07256 if(ttl && (ttl != RSBAC_LIST_TTL_KEEP)) 07257 { 07258 if(ttl > RSBAC_LIST_MAX_AGE_LIMIT) 07259 ttl = RSBAC_LIST_MAX_AGE_LIMIT; 07260 ttl += RSBAC_CURRENT_TIME; 07261 } 07262 item_p = lookup_lol_subitem(list, sublist, subdesc); 07263 if(item_p) 07264 { /* exists -> update data, if any */ 07265 if(ttl != RSBAC_LIST_TTL_KEEP) 07266 item_p->max_age = ttl; 07267 if(subdata && list->info.subdata_size) 07268 { 07269 if( list->def_subdata 07270 && !item_p->max_age 07271 && !memcmp(list->def_subdata, subdata, list->info.subdata_size) 07272 ) 07273 do_remove_lol_subitem(sublist, item_p); 07274 else 07275 memcpy(((char *) item_p) + sizeof(*item_p) + list->info.subdesc_size, 07276 subdata, 07277 list->info.subdata_size); 07278 } 07279 } 07280 else 07281 { 07282 if(ttl == RSBAC_LIST_TTL_KEEP) 07283 ttl = 0; 07284 if( !list->def_subdata 07285 || memcmp(list->def_subdata, subdata, list->info.subdata_size) 07286 ) 07287 add_lol_subitem(list, sublist, ttl, subdesc, subdata); 07288 } 07289 } 07290 } 07291 else 07292 { 07293 err = -RSBAC_EINVALIDTARGET; 07294 } 07295 } 07296 #endif 07297 07298 out_unlock: 07299 rsbac_write_unlock(&list->lock, &lock_flags); 07300 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07301 return err; 07302 }
|
|
Definition at line 9318 of file gen_lists.c. References rsbac_list_lol_item_t::count, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), and rsbac_list_lol_reg_item_t::self. Referenced by rsbac_acl_remove_acl_entry(), rsbac_acl_remove_group_member(), rsbac_list_lol_subcount(), rsbac_rc_get_list(), and rsbac_um_get_gm_list(). 09322 { 09323 struct rsbac_list_lol_reg_item_t * list; 09324 struct rsbac_list_lol_item_t * sublist; 09325 u_long lock_flags, rlock_flags; 09326 long result; 09327 09328 if(!handle) 09329 return -RSBAC_EINVALIDVALUE; 09330 if(!list_initialized) 09331 return -RSBAC_ENOTINITIALIZED; 09332 09333 list = (struct rsbac_list_lol_reg_item_t *) handle; 09334 if(list->self != list) 09335 return -RSBAC_EINVALIDVALUE; 09336 09337 #ifdef CONFIG_RSBAC_LIST_TRANS 09338 if(ta_number) 09339 { 09340 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09341 return -RSBAC_EINVALIDTRANSACTION; 09342 } 09343 #endif 09344 09345 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09346 /* 09347 #ifdef CONFIG_RSBAC_DEBUG 09348 if(rsbac_debug_lists) 09349 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subcount: list %s.\n", 09350 list->name); 09351 #endif 09352 */ 09353 rsbac_read_lock(&list->lock, &lock_flags); 09354 09355 #ifdef CONFIG_RSBAC_LIST_TRANS 09356 if(ta_number && (list->ta_copied == ta_number)) 09357 sublist = ta_lookup_lol_item(ta_number, list, desc); 09358 else 09359 #endif 09360 sublist = lookup_lol_item(list, desc); 09361 if(sublist) 09362 { 09363 result = sublist->count; 09364 } 09365 else 09366 { 09367 result = -RSBAC_ENOTFOUND; 09368 } 09369 rsbac_read_unlock(&list->lock, &lock_flags); 09370 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09371 return result; 09372 }
|
|
Definition at line 9069 of file gen_lists.c. References FALSE, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), lookup_lol_subitem(), rsbac_list_item_t::max_age, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_acl_group_member(), rsbac_list_lol_subexist(), rsbac_pm_set_member(), and rsbac_um_get_gm_user_list(). 09074 { 09075 struct rsbac_list_lol_reg_item_t * list; 09076 struct rsbac_list_lol_item_t * sublist; 09077 u_long lock_flags, rlock_flags; 09078 struct rsbac_list_item_t * item_p; 09079 int result; 09080 09081 if(!handle || !desc || !subdesc) 09082 return FALSE; 09083 if(!list_initialized) 09084 return FALSE; 09085 09086 list = (struct rsbac_list_lol_reg_item_t *) handle; 09087 if(list->self != list) 09088 return -RSBAC_EINVALIDVALUE; 09089 09090 #ifdef CONFIG_RSBAC_LIST_TRANS 09091 if(ta_number) 09092 { 09093 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09094 return -RSBAC_EINVALIDTRANSACTION; 09095 } 09096 #endif 09097 09098 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09099 /* 09100 #ifdef CONFIG_RSBAC_DEBUG 09101 if(rsbac_debug_lists) 09102 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subexist: testing on list %s.\n", 09103 list->name); 09104 #endif 09105 */ 09106 rsbac_read_lock(&list->lock, &lock_flags); 09107 09108 #ifdef CONFIG_RSBAC_LIST_TRANS 09109 if(ta_number && (list->ta_copied == ta_number)) 09110 sublist = ta_lookup_lol_item(ta_number, list, desc); 09111 else 09112 #endif 09113 sublist = lookup_lol_item(list, desc); 09114 if(sublist) 09115 { /* exists -> lookup subitem */ 09116 item_p = lookup_lol_subitem(list, sublist, subdesc); 09117 if( item_p 09118 && ( !item_p->max_age 09119 || (item_p->max_age > RSBAC_CURRENT_TIME) 09120 ) 09121 ) 09122 { /* exists -> TRUE */ 09123 result = TRUE; 09124 } 09125 else 09126 { 09127 result = FALSE; 09128 } 09129 } 09130 else 09131 { 09132 result = FALSE; 09133 } 09134 rsbac_read_unlock(&list->lock, &lock_flags); 09135 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09136 return result; 09137 }
|
|
Definition at line 9153 of file gen_lists.c. References FALSE, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lookup_lol_item(), lookup_lol_subitem_user_compare(), rsbac_list_item_t::max_age, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, rsbac_list_lol_subexist(), rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_list_lol_subexist_compare(). 09159 { 09160 struct rsbac_list_lol_reg_item_t * list; 09161 struct rsbac_list_lol_item_t * sublist; 09162 u_long lock_flags, rlock_flags; 09163 struct rsbac_list_item_t * item_p; 09164 int result; 09165 09166 if(!handle || !desc || !subdesc) 09167 return FALSE; 09168 if(!list_initialized) 09169 return FALSE; 09170 /* Use standard function, if compare is not provided. */ 09171 if(!compare) 09172 return rsbac_list_lol_subexist(handle, desc, subdesc); 09173 09174 list = (struct rsbac_list_lol_reg_item_t *) handle; 09175 if(list->self != list) 09176 return -RSBAC_EINVALIDVALUE; 09177 09178 #ifdef CONFIG_RSBAC_LIST_TRANS 09179 if(ta_number) 09180 { 09181 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 09182 return -RSBAC_EINVALIDTRANSACTION; 09183 } 09184 #endif 09185 09186 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 09187 /* 09188 #ifdef CONFIG_RSBAC_DEBUG 09189 if(rsbac_debug_lists) 09190 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subexist_compare: testing on list %s.\n", 09191 list->name); 09192 #endif 09193 */ 09194 rsbac_read_lock(&list->lock, &lock_flags); 09195 09196 #ifdef CONFIG_RSBAC_LIST_TRANS 09197 if(ta_number && (list->ta_copied == ta_number)) 09198 sublist = ta_lookup_lol_item(ta_number, list, desc); 09199 else 09200 #endif 09201 sublist = lookup_lol_item(list, desc); 09202 if(sublist) 09203 { /* exists -> lookup subitem */ 09204 item_p = lookup_lol_subitem_user_compare(list, sublist, subdesc, compare); 09205 if( item_p 09206 && ( !item_p->max_age 09207 || (item_p->max_age > RSBAC_CURRENT_TIME) 09208 ) 09209 ) 09210 { /* exists -> TRUE */ 09211 result = TRUE; 09212 } 09213 else 09214 { 09215 result = FALSE; 09216 } 09217 } 09218 else 09219 { 09220 result = FALSE; 09221 } 09222 rsbac_read_unlock(&list->lock, &lock_flags); 09223 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 09224 return result; 09225 }
|
|
Definition at line 7678 of file gen_lists.c. References rsbac_list_lol_item_t::count, rsbac_list_lol_info_t::data_size, rsbac_list_lol_reg_item_t::def_data, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::dirty, do_remove_lol_item(), rsbac_list_lol_reg_item_t::flags, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, lookup_lol_item(), lookup_lol_subitem(), rsbac_list_lol_item_t::max_age, remove_lol_subitem(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_DEF_DATA, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_acl_remove_acl_entry(), rsbac_acl_remove_group_member(), rsbac_auth_remove_from_f_capset(), rsbac_auth_remove_from_p_capset(), rsbac_list_lol_subremove(), rsbac_mac_remove_from_f_truset(), rsbac_mac_remove_from_p_truset(), rsbac_pm_remove_from_set(), rsbac_rc_set_item(), and rsbac_um_remove_gm(). 07683 { 07684 struct rsbac_list_lol_reg_item_t * list; 07685 struct rsbac_list_lol_item_t * sublist; 07686 u_long lock_flags, rlock_flags; 07687 07688 if(!handle || !desc || !subdesc) 07689 return -RSBAC_EINVALIDVALUE; 07690 if(!list_initialized) 07691 return -RSBAC_ENOTINITIALIZED; 07692 07693 list = (struct rsbac_list_lol_reg_item_t *) handle; 07694 if(list->self != list) 07695 return -RSBAC_EINVALIDVALUE; 07696 07697 #ifdef CONFIG_RSBAC_LIST_TRANS 07698 if(ta_number) 07699 { 07700 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07701 return -RSBAC_EINVALIDTRANSACTION; 07702 } 07703 #endif 07704 07705 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 07706 /* 07707 #ifdef CONFIG_RSBAC_DEBUG 07708 if(rsbac_debug_lists) 07709 rsbac_printk(KERN_DEBUG "rsbac_ta_list_lol_subremove: removing from list of lists %s, device %02u:%02u.\n", 07710 list->name, 07711 RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device)); 07712 #endif 07713 */ 07714 rsbac_write_lock(&list->lock, &lock_flags); 07715 #ifdef CONFIG_RSBAC_LIST_TRANS 07716 if(list->ta_copied) 07717 { 07718 sublist = ta_lookup_lol_item(list->ta_copied, list, desc); 07719 if(sublist) 07720 { 07721 if( sublist->max_age 07722 && (sublist->max_age <= RSBAC_CURRENT_TIME) 07723 ) 07724 { 07725 ta_do_remove_lol_item(list, sublist); 07726 } 07727 else 07728 { 07729 if(ta_number && (list->ta_copied != ta_number)) 07730 { 07731 rsbac_write_unlock(&list->lock, &lock_flags); 07732 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07733 return -RSBAC_EBUSY; 07734 } 07735 if(lookup_lol_subitem(list, sublist, subdesc)) 07736 remove_lol_subitem(list, sublist, subdesc); 07737 if( !sublist->count 07738 && ( ( list->def_data 07739 && !memcmp(((char *) sublist) + sizeof(*sublist) + list->info.desc_size, 07740 list->def_data, 07741 list->info.data_size) 07742 ) 07743 || ( !list->info.data_size 07744 && (list->flags & RSBAC_LIST_DEF_DATA) 07745 ) 07746 ) 07747 ) 07748 { 07749 ta_do_remove_lol_item(list, sublist); 07750 } 07751 } 07752 } 07753 } 07754 else 07755 { 07756 if(ta_number && lookup_lol_item(list, desc)) 07757 { 07758 ta_lol_copy(ta_number, list); 07759 ta_remove_lol_item(ta_number, list, desc); 07760 } 07761 } 07762 if(!ta_number) 07763 #endif 07764 { 07765 sublist = lookup_lol_item(list, desc); 07766 if(sublist) 07767 { 07768 if( sublist->max_age 07769 && (sublist->max_age <= RSBAC_CURRENT_TIME) 07770 ) 07771 { 07772 do_remove_lol_item(list, sublist); 07773 lol_touch(list); 07774 list->dirty = TRUE; 07775 } 07776 else 07777 { 07778 if(lookup_lol_subitem(list, sublist, subdesc)) 07779 { /* exists -> remove and set dirty */ 07780 remove_lol_subitem(list, sublist, subdesc); 07781 lol_touch(list); 07782 list->dirty = TRUE; 07783 } 07784 if( !sublist->count 07785 && ( ( list->def_data 07786 && !memcmp(((char *) sublist) + sizeof(*sublist) + list->info.desc_size, 07787 list->def_data, 07788 list->info.data_size) 07789 ) 07790 || ( !list->info.data_size 07791 && (list->flags & RSBAC_LIST_DEF_DATA) 07792 ) 07793 ) 07794 ) 07795 { 07796 do_remove_lol_item(list, sublist); 07797 lol_touch(list); 07798 list->dirty = TRUE; 07799 } 07800 } 07801 } 07802 } 07803 rsbac_write_unlock(&list->lock, &lock_flags); 07804 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07805 return 0; 07806 }
|
|
Definition at line 7921 of file gen_lists.c. References rsbac_list_lol_info_t::data_size, rsbac_list_lol_reg_item_t::def_data, rsbac_list_lol_info_t::desc_size, rsbac_list_lol_reg_item_t::dirty, rsbac_list_lol_reg_item_t::flags, rsbac_list_lol_item_t::head, rsbac_list_lol_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, lookup_lol_item(), rsbac_list_lol_item_t::max_age, remove_all_lol_subitems(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_LIST_DEF_DATA, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_list_lol_subremove_all(), and rsbac_pm_clear_set(). 07925 { 07926 struct rsbac_list_lol_reg_item_t * list; 07927 struct rsbac_list_lol_item_t * sublist; 07928 u_long lock_flags, rlock_flags; 07929 07930 if(!handle) 07931 return -RSBAC_EINVALIDVALUE; 07932 if(!list_initialized) 07933 return -RSBAC_ENOTINITIALIZED; 07934 07935 list = (struct rsbac_list_lol_reg_item_t *) handle; 07936 if(list->self != list) 07937 return -RSBAC_EINVALIDVALUE; 07938 07939 #ifdef CONFIG_RSBAC_LIST_TRANS 07940 if(ta_number) 07941 { 07942 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07943 return -RSBAC_EINVALIDTRANSACTION; 07944 } 07945 #endif 07946 07947 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 07948 /* 07949 #ifdef CONFIG_RSBAC_DEBUG 07950 if(rsbac_debug_lists) 07951 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subremove_all: removing all subitems from list of lists %s.\n", 07952 list->name); 07953 #endif 07954 */ 07955 rsbac_write_lock(&list->lock, &lock_flags); 07956 #ifdef CONFIG_RSBAC_LIST_TRANS 07957 if(list->ta_copied) 07958 { 07959 sublist = ta_lookup_lol_item(list->ta_copied, list, desc); 07960 if(sublist) 07961 { 07962 if( sublist->max_age 07963 && (sublist->max_age <= RSBAC_CURRENT_TIME) 07964 ) 07965 { 07966 ta_do_remove_lol_item(list, sublist); 07967 } 07968 else 07969 { 07970 if(ta_number && (list->ta_copied != ta_number)) 07971 { 07972 rsbac_write_unlock(&list->lock, &lock_flags); 07973 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07974 return -RSBAC_EBUSY; 07975 } 07976 remove_all_lol_subitems(sublist); 07977 if( ( list->def_data 07978 && !memcmp(((char *) sublist) + sizeof(*sublist) + list->info.desc_size, 07979 list->def_data, 07980 list->info.data_size) 07981 ) 07982 || ( !list->info.data_size 07983 && (list->flags & RSBAC_LIST_DEF_DATA) 07984 ) 07985 07986 ) 07987 { 07988 ta_do_remove_lol_item(list, sublist); 07989 } 07990 } 07991 } 07992 } 07993 else 07994 { 07995 if(ta_number && lookup_lol_item(list, desc)) 07996 { 07997 ta_lol_copy(ta_number, list); 07998 sublist = ta_lookup_lol_item(ta_number, list, desc); 07999 if(sublist) 08000 remove_all_lol_subitems(sublist); 08001 } 08002 } 08003 if(!ta_number) 08004 #endif 08005 { 08006 sublist = lookup_lol_item(list, desc); 08007 if(sublist && sublist->head) 08008 { 08009 remove_all_lol_subitems(sublist); 08010 lol_touch(list); 08011 list->dirty = TRUE; 08012 } 08013 } 08014 rsbac_write_unlock(&list->lock, &lock_flags); 08015 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 08016 return 0; 08017 }
|
|
Definition at line 7823 of file gen_lists.c. References rsbac_list_lol_reg_item_t::dirty, rsbac_list_lol_reg_item_t::head, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, lol_touch, lookup_lol_subitem(), rsbac_list_lol_item_t::next, remove_lol_subitem(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_lol_reg_item_t::self, and TRUE. Referenced by rsbac_acl_remove_group(), rsbac_acl_remove_subject(), rsbac_acl_remove_user(), rsbac_list_lol_subremove_from_all(), rsbac_rc_copy_type(), rsbac_rc_set_item(), and rsbac_um_remove_group(). 07827 { 07828 struct rsbac_list_lol_reg_item_t * list; 07829 struct rsbac_list_lol_item_t * sublist; 07830 u_long lock_flags, rlock_flags; 07831 07832 if(!handle || !subdesc) 07833 return -RSBAC_EINVALIDVALUE; 07834 if(!list_initialized) 07835 return -RSBAC_ENOTINITIALIZED; 07836 07837 list = (struct rsbac_list_lol_reg_item_t *) handle; 07838 if(list->self != list) 07839 return -RSBAC_EINVALIDVALUE; 07840 07841 #ifdef CONFIG_RSBAC_LIST_TRANS 07842 if(ta_number) 07843 { 07844 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07845 return -RSBAC_EINVALIDTRANSACTION; 07846 } 07847 #endif 07848 07849 rsbac_read_lock(&lol_reg_head.lock, &rlock_flags); 07850 /* 07851 #ifdef CONFIG_RSBAC_DEBUG 07852 if(rsbac_debug_lists) 07853 rsbac_printk(KERN_DEBUG "rsbac_list_lol_subremove_from_all: removing from list of lists %s.\n", 07854 list->name); 07855 #endif 07856 */ 07857 rsbac_write_lock(&list->lock, &lock_flags); 07858 #ifdef CONFIG_RSBAC_LIST_TRANS 07859 if(list->ta_copied) 07860 { 07861 if(ta_number && (list->ta_copied != ta_number)) 07862 { 07863 rsbac_write_unlock(&list->lock, &lock_flags); 07864 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07865 return -RSBAC_EBUSY; 07866 } 07867 sublist = list->head; 07868 while(sublist) 07869 { 07870 remove_lol_subitem(list, sublist, subdesc); 07871 sublist = sublist->next; 07872 } 07873 } 07874 else 07875 { 07876 if(ta_number) 07877 { 07878 ta_lol_copy(ta_number, list); 07879 sublist = list->head; 07880 while(sublist) 07881 { 07882 remove_lol_subitem(list, sublist, subdesc); 07883 sublist = sublist->next; 07884 } 07885 } 07886 } 07887 if(!ta_number) 07888 #endif 07889 { 07890 sublist = list->head; 07891 while(sublist) 07892 { 07893 if(lookup_lol_subitem(list, sublist, subdesc)) 07894 { /* exists -> remove and set dirty */ 07895 remove_lol_subitem(list, sublist, subdesc); 07896 lol_touch(list); 07897 list->dirty = TRUE; 07898 } 07899 sublist = sublist->next; 07900 } 07901 } 07902 rsbac_write_unlock(&list->lock, &lock_flags); 07903 rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags); 07904 return 0; 07905 }
|
|
Definition at line 7494 of file gen_lists.c. References rsbac_list_reg_item_t::dirty, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, lookup_item(), remove_item(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_reg_item_t::self, touch, and TRUE. Referenced by rsbac_acl_remove_acl_entry(), rsbac_acl_remove_group(), rsbac_acl_remove_subject(), rsbac_acl_remove_user(), rsbac_list_remove(), rsbac_pm_exists(), rsbac_pm_remove_target(), rsbac_rc_set_item(), rsbac_ta_remove_target(), rsbac_um_remove_group(), set_attr_fd(), and set_attr_user(). 07498 { 07499 struct rsbac_list_reg_item_t * list; 07500 u_long lock_flags, rlock_flags; 07501 07502 if(!handle || !desc) 07503 return -RSBAC_EINVALIDVALUE; 07504 if(!list_initialized) 07505 return -RSBAC_ENOTINITIALIZED; 07506 07507 list = (struct rsbac_list_reg_item_t *) handle; 07508 if(!list || (list->self != list)) 07509 return -RSBAC_EINVALIDVALUE; 07510 07511 #ifdef CONFIG_RSBAC_LIST_TRANS 07512 if(ta_number) 07513 { 07514 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07515 return -RSBAC_EINVALIDTRANSACTION; 07516 } 07517 #endif 07518 07519 rsbac_read_lock(®_head.lock, &rlock_flags); 07520 /* 07521 #ifdef CONFIG_RSBAC_DEBUG 07522 if(rsbac_debug_lists) 07523 rsbac_printk(KERN_DEBUG "rsbac_list_ta_remove: removing from list %s.\n", 07524 list->name); 07525 #endif 07526 */ 07527 rsbac_write_lock(&list->lock, &lock_flags); 07528 #ifdef CONFIG_RSBAC_LIST_TRANS 07529 if(list->ta_copied) 07530 { 07531 if(ta_number) 07532 { 07533 if(ta_lookup_item(list->ta_copied, list, desc)) 07534 { 07535 if(list->ta_copied != ta_number) 07536 { 07537 rsbac_write_unlock(&list->lock, &lock_flags); 07538 rsbac_read_unlock(®_head.lock, &rlock_flags); 07539 return -RSBAC_EBUSY; 07540 } 07541 else 07542 ta_remove_item(ta_number, list, desc); 07543 } 07544 } 07545 else 07546 ta_remove_item(list->ta_copied, list, desc); 07547 } 07548 else 07549 { 07550 if(ta_number && lookup_item(list, desc)) 07551 { 07552 ta_copy(ta_number, list); 07553 ta_remove_item(ta_number, list, desc); 07554 } 07555 } 07556 if(!ta_number) 07557 #endif 07558 { 07559 if(lookup_item(list, desc)) 07560 { /* exists -> remove */ 07561 remove_item(list, desc); 07562 touch(list); 07563 list->dirty = TRUE; 07564 } 07565 } 07566 rsbac_write_unlock(&list->lock, &lock_flags); 07567 rsbac_read_unlock(®_head.lock, &rlock_flags); 07568 return 0; 07569 }
|
|
Definition at line 7585 of file gen_lists.c. References rsbac_list_reg_item_t::dirty, rsbac_list_reg_item_t::head, list_initialized, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, NULL, remove_all_items(), RSBAC_EBUSY, RSBAC_EINVALIDTRANSACTION, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_ta_list_exist(), rsbac_list_reg_item_t::self, touch, and TRUE. Referenced by rsbac_list_remove_all(). 07586 { 07587 struct rsbac_list_reg_item_t * list; 07588 u_long lock_flags, rlock_flags; 07589 07590 if(!handle) 07591 return -RSBAC_EINVALIDVALUE; 07592 if(!list_initialized) 07593 return -RSBAC_ENOTINITIALIZED; 07594 07595 list = (struct rsbac_list_reg_item_t *) handle; 07596 if(list->self != list) 07597 return -RSBAC_EINVALIDVALUE; 07598 07599 #ifdef CONFIG_RSBAC_LIST_TRANS 07600 if(ta_number) 07601 { 07602 if(!rsbac_ta_list_exist(0, ta_handle, &ta_number)) 07603 return -RSBAC_EINVALIDTRANSACTION; 07604 } 07605 #endif 07606 07607 rsbac_read_lock(®_head.lock, &rlock_flags); 07608 /* 07609 #ifdef CONFIG_RSBAC_DEBUG 07610 if(rsbac_debug_lists) 07611 rsbac_printk(KERN_DEBUG "rsbac_ta_list_remove_all: removing all items from list %s.\n", 07612 list->name); 07613 #endif 07614 */ 07615 rsbac_write_lock(&list->lock, &lock_flags); 07616 #ifdef CONFIG_RSBAC_LIST_TRANS 07617 if(list->ta_copied) 07618 { 07619 if(ta_number) 07620 { 07621 if(list->ta_copied == ta_number) 07622 { 07623 ta_remove_all_items(list); 07624 if(!list->head) 07625 { 07626 list->ta_copied = 0; 07627 } 07628 } 07629 else 07630 { 07631 rsbac_write_unlock(&list->lock, &lock_flags); 07632 rsbac_read_unlock(®_head.lock, &rlock_flags); 07633 return -RSBAC_EBUSY; 07634 } 07635 } 07636 else 07637 ta_remove_all_items(list); 07638 } 07639 else 07640 { 07641 if(ta_number) 07642 { 07643 if(list->head) 07644 { 07645 list->ta_head = NULL; 07646 list->ta_tail = NULL; 07647 list->ta_curr = NULL; 07648 list->ta_count = 0; 07649 list->ta_copied = ta_number; 07650 } 07651 } 07652 } 07653 07654 if(!ta_number) 07655 #endif 07656 if(list->head) 07657 { 07658 remove_all_items(list); 07659 touch(list); 07660 list->dirty = TRUE; 07661 } 07662 rsbac_write_unlock(&list->lock, &lock_flags); 07663 rsbac_read_unlock(®_head.lock, &rlock_flags); 07664 return 0; 07665 }
|