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