auth.h File Reference

#include <linux/init.h>
#include <rsbac/types.h>

Go to the source code of this file.

Functions

int rsbac_init_auth (void) __init
int rsbac_mount_auth (kdev_t kdev)
int rsbac_umount_auth (kdev_t kdev)
int rsbac_stats_auth (void)
int rsbac_check_auth (int correct, int check_inode)
int rsbac_auth_add_to_p_capset (rsbac_list_ta_number_t ta_number, rsbac_pid_t pid, enum rsbac_auth_cap_type_t cap_type, struct rsbac_auth_cap_range_t cap_range, rsbac_time_t ttl)
int rsbac_auth_add_to_f_capset (rsbac_list_ta_number_t ta_number, rsbac_auth_file_t file, enum rsbac_auth_cap_type_t cap_type, struct rsbac_auth_cap_range_t cap_range, rsbac_time_t ttl)
int rsbac_auth_remove_from_p_capset (rsbac_list_ta_number_t ta_number, rsbac_pid_t pid, enum rsbac_auth_cap_type_t cap_type, struct rsbac_auth_cap_range_t cap_range)
int rsbac_auth_remove_from_f_capset (rsbac_list_ta_number_t ta_number, rsbac_auth_file_t file, enum rsbac_auth_cap_type_t cap_type, struct rsbac_auth_cap_range_t cap_range)
int rsbac_auth_clear_p_capset (rsbac_list_ta_number_t ta_number, rsbac_pid_t pid, enum rsbac_auth_cap_type_t cap_type)
int rsbac_auth_clear_f_capset (rsbac_list_ta_number_t ta_number, rsbac_auth_file_t file, enum rsbac_auth_cap_type_t cap_type)
rsbac_boolean_t rsbac_auth_p_capset_member (rsbac_pid_t pid, enum rsbac_auth_cap_type_t cap_type, rsbac_uid_t member)
int rsbac_auth_remove_p_capsets (rsbac_pid_t pid)
int rsbac_auth_remove_f_capsets (rsbac_auth_file_t file)
int rsbac_auth_copy_fp_capset (rsbac_auth_file_t file, rsbac_pid_t p_cap_set_id)
int rsbac_auth_copy_pp_capset (rsbac_pid_t old_p_set_id, rsbac_pid_t new_p_set_id)
int rsbac_auth_get_f_caplist (rsbac_list_ta_number_t ta_number, rsbac_auth_file_t file, enum rsbac_auth_cap_type_t cap_type, struct rsbac_auth_cap_range_t **caplist_p, rsbac_time_t **ttllist_p)
int rsbac_auth_get_p_caplist (rsbac_list_ta_number_t ta_number, rsbac_pid_t pid, enum rsbac_auth_cap_type_t cap_type, struct rsbac_auth_cap_range_t **caplist_p, rsbac_time_t **ttllist_p)


Function Documentation

int rsbac_auth_add_to_f_capset rsbac_list_ta_number_t  ta_number,
rsbac_auth_file_t  file,
enum rsbac_auth_cap_type_t  cap_type,
struct rsbac_auth_cap_range_t  cap_range,
rsbac_time_t  ttl
 

Definition at line 3074 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, fd_hash(), rsbac_auth_cap_range_t::first, rsbac_auth_device_list_item_t::handles, rsbac_auth_cap_range_t::last, rsbac_auth_device_list_head_t::lock, lookup_device(), NULL, RSBAC_EINVALIDDEV, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_get_super_block(), rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_subadd_ttl().

Referenced by rsbac_auth_add_f_cap().

03080   {
03081     int                                     err=0;
03082     u_long dflags;
03083     struct rsbac_auth_device_list_item_t   * device_p;
03084 
03085     if (!rsbac_is_initialized())
03086       {
03087         rsbac_printk(KERN_WARNING "rsbac_auth_add_to_f_capset(): RSBAC not initialized\n");
03088         return(-RSBAC_ENOTINITIALIZED);
03089       }
03090     if (in_interrupt())
03091       {
03092         rsbac_printk(KERN_WARNING "rsbac_auth_add_to_f_capset(): called from interrupt!\n");
03093       }
03094     if(cap_range.first > cap_range.last)
03095       return(-RSBAC_EINVALIDVALUE);
03096 
03097     /* protect device list */
03098     rsbac_read_lock(&device_list_head.lock, &dflags);
03099     device_p = lookup_device(file.device);
03100     if(!device_p)
03101       {
03102         /* trigger rsbac_mount() */
03103         rsbac_read_unlock(&device_list_head.lock, &dflags);
03104         rsbac_get_super_block(file.device);
03105         /* retry */
03106         rsbac_read_lock(&device_list_head.lock, &dflags);
03107         device_p = lookup_device(file.device);
03108         if(!device_p)
03109           {
03110             rsbac_printk(KERN_WARNING "rsbac_auth_add_to_f_capset(): invalid device %02u:%02u!\n",
03111                    RSBAC_MAJOR(file.device),RSBAC_MINOR(file.device));
03112             rsbac_read_unlock(&device_list_head.lock, &dflags);
03113             return(-RSBAC_EINVALIDDEV);
03114           }
03115       }
03116 
03117     switch(cap_type)
03118       {
03119         case ACT_real:
03120           err = rsbac_ta_list_lol_subadd_ttl(ta_number, device_p->handles[fd_hash(file.inode)],
03121                                           ttl, &file.inode, &cap_range, NULL);
03122           break;
03123 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03124         case ACT_eff:
03125           err = rsbac_ta_list_lol_subadd_ttl(ta_number, device_p->eff_handles[eff_fd_hash(file.inode)],
03126                                           ttl, &file.inode, &cap_range, NULL);
03127           break;
03128         case ACT_fs:
03129           err = rsbac_ta_list_lol_subadd_ttl(ta_number, device_p->fs_handles[fs_fd_hash(file.inode)],
03130                                           ttl, &file.inode, &cap_range, NULL);
03131           break;
03132 #endif
03133 #ifdef CONFIG_RSBAC_AUTH_GROUP
03134         case ACT_group_real:
03135           err = rsbac_ta_list_lol_subadd_ttl(ta_number, device_p->group_handles[group_fd_hash(file.inode)],
03136                                           ttl, &file.inode, &cap_range, NULL);
03137           break;
03138 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03139         case ACT_group_eff:
03140           err = rsbac_ta_list_lol_subadd_ttl(ta_number, device_p->group_eff_handles[group_eff_fd_hash(file.inode)],
03141                                           ttl, &file.inode, &cap_range, NULL);
03142           break;
03143         case ACT_group_fs:
03144           err = rsbac_ta_list_lol_subadd_ttl(ta_number, device_p->group_fs_handles[group_fs_fd_hash(file.inode)],
03145                                           ttl, &file.inode, &cap_range, NULL);
03146           break;
03147 #endif
03148 #endif /* AUTH_GROUP */
03149 
03150         default:
03151           err = -RSBAC_EINVALIDTARGET;
03152       }
03153     rsbac_read_unlock(&device_list_head.lock, &dflags);
03154     return(err);
03155   }

int rsbac_auth_add_to_p_capset rsbac_list_ta_number_t  ta_number,
rsbac_pid_t  pid,
enum rsbac_auth_cap_type_t  cap_type,
struct rsbac_auth_cap_range_t  cap_range,
rsbac_time_t  ttl
 

Definition at line 3030 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, rsbac_auth_cap_range_t::first, rsbac_auth_cap_range_t::last, NULL, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_subadd_ttl().

Referenced by rsbac_auth_add_p_cap(), and rsbac_replace_auth_cap().

03036   {
03037     if (!rsbac_is_initialized())
03038       {
03039         rsbac_printk(KERN_WARNING "rsbac_auth_add_to_p_capset(): RSBAC not initialized\n");
03040         return(-RSBAC_ENOTINITIALIZED);
03041       }
03042     if (in_interrupt())
03043       {
03044         rsbac_printk(KERN_WARNING "rsbac_auth_add_to_p_capset(): called from interrupt!\n");
03045       }
03046     if(cap_range.first > cap_range.last)
03047       return(-RSBAC_EINVALIDVALUE);
03048     switch(cap_type)
03049       {
03050         case ACT_real:
03051           return rsbac_ta_list_lol_subadd_ttl(ta_number, process_handle, ttl, &pid, &cap_range, NULL);
03052 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03053         case ACT_eff:
03054           return rsbac_ta_list_lol_subadd_ttl(ta_number, process_eff_handle, ttl, &pid, &cap_range, NULL);
03055         case ACT_fs:
03056           return rsbac_ta_list_lol_subadd_ttl(ta_number, process_fs_handle, ttl, &pid, &cap_range, NULL);
03057 #endif
03058 #ifdef CONFIG_RSBAC_AUTH_GROUP
03059         case ACT_group_real:
03060           return rsbac_ta_list_lol_subadd_ttl(ta_number, process_group_handle, ttl, &pid, &cap_range, NULL);
03061 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03062         case ACT_group_eff:
03063           return rsbac_ta_list_lol_subadd_ttl(ta_number, process_group_eff_handle, ttl, &pid, &cap_range, NULL);
03064         case ACT_group_fs:
03065           return rsbac_ta_list_lol_subadd_ttl(ta_number, process_group_fs_handle, ttl, &pid, &cap_range, NULL);
03066 #endif
03067 #endif /* AUTH_GROUP */
03068 
03069         default:
03070           return -RSBAC_EINVALIDTARGET;
03071       }
03072   }

int rsbac_auth_clear_f_capset rsbac_list_ta_number_t  ta_number,
rsbac_auth_file_t  file,
enum rsbac_auth_cap_type_t  cap_type
 

Definition at line 3323 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, fd_hash(), rsbac_auth_device_list_item_t::handles, rsbac_auth_device_list_head_t::lock, lookup_device(), RSBAC_EINVALIDDEV, RSBAC_EINVALIDTARGET, RSBAC_ENOTINITIALIZED, rsbac_get_super_block(), rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_remove().

Referenced by rsbac_auth_remove_f_capsets().

03327   {
03328     int                                    err=0;
03329     u_long dflags;
03330     struct rsbac_auth_device_list_item_t   * device_p;
03331 
03332     if (!rsbac_is_initialized())
03333       {
03334         rsbac_printk(KERN_WARNING "rsbac_auth_clear_f_capset(): RSBAC not initialized\n");
03335         return(-RSBAC_ENOTINITIALIZED);
03336       }
03337     if (in_interrupt())
03338       {
03339         rsbac_printk(KERN_WARNING "rsbac_auth_clear_f_capset(): called from interrupt!\n");
03340       }
03341     /* protect device list */
03342     rsbac_read_lock(&device_list_head.lock, &dflags);
03343     device_p = lookup_device(file.device);
03344     if(!device_p)
03345       {
03346         /* trigger rsbac_mount() */
03347         rsbac_read_unlock(&device_list_head.lock, &dflags);
03348         rsbac_get_super_block(file.device);
03349         /* retry */
03350         rsbac_read_lock(&device_list_head.lock, &dflags);
03351         device_p = lookup_device(file.device);
03352         if(!device_p)
03353           {
03354             rsbac_printk(KERN_WARNING "rsbac_auth_clear_f_capset(): invalid device %02u:%02u!\n",
03355                    RSBAC_MAJOR(file.device),RSBAC_MINOR(file.device));
03356             rsbac_read_unlock(&device_list_head.lock, &dflags);
03357             return(-RSBAC_EINVALIDDEV);
03358           }
03359       }
03360     switch(cap_type)
03361       {
03362         case ACT_real:
03363           err = rsbac_ta_list_lol_remove(ta_number, device_p->handles[fd_hash(file.inode)], &file.inode);
03364           break;
03365 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03366         case ACT_eff:
03367           err = rsbac_ta_list_lol_remove(ta_number, device_p->eff_handles[eff_fd_hash(file.inode)], &file.inode);
03368           break;
03369         case ACT_fs:
03370           err = rsbac_ta_list_lol_remove(ta_number, device_p->fs_handles[fs_fd_hash(file.inode)], &file.inode);
03371           break;
03372 #endif
03373 #ifdef CONFIG_RSBAC_AUTH_GROUP
03374         case ACT_group_real:
03375           err = rsbac_ta_list_lol_remove(ta_number, device_p->group_handles[group_fd_hash(file.inode)], &file.inode);
03376           break;
03377 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03378         case ACT_group_eff:
03379           err = rsbac_ta_list_lol_remove(ta_number, device_p->group_eff_handles[group_eff_fd_hash(file.inode)], &file.inode);
03380           break;
03381         case ACT_group_fs:
03382           err = rsbac_ta_list_lol_remove(ta_number, device_p->group_fs_handles[group_fs_fd_hash(file.inode)], &file.inode);
03383           break;
03384 #endif
03385 #endif /* AUTH_GROUP */
03386 
03387         default:
03388           err = -RSBAC_EINVALIDTARGET;
03389       }
03390     rsbac_read_unlock(&device_list_head.lock, &dflags);
03391     return(err);
03392   }

int rsbac_auth_clear_p_capset rsbac_list_ta_number_t  ta_number,
rsbac_pid_t  pid,
enum rsbac_auth_cap_type_t  cap_type
 

Definition at line 3283 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, RSBAC_EINVALIDTARGET, RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_remove().

Referenced by rsbac_auth_remove_p_capsets().

03287   {
03288     if (!rsbac_is_initialized())
03289       {
03290         rsbac_printk(KERN_WARNING "rsbac_auth_clear_p_capset(): RSBAC not initialized\n");
03291         return(-RSBAC_ENOTINITIALIZED);
03292       }
03293     if (in_interrupt())
03294       {
03295         rsbac_printk(KERN_WARNING "rsbac_auth_clear_p_capset(): called from interrupt!\n");
03296       }
03297     switch(cap_type)
03298       {
03299         case ACT_real:
03300           return rsbac_ta_list_lol_remove(ta_number, process_handle, &pid);
03301 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03302         case ACT_eff:
03303           return rsbac_ta_list_lol_remove(ta_number, process_eff_handle, &pid);
03304         case ACT_fs:
03305           return rsbac_ta_list_lol_remove(ta_number, process_fs_handle, &pid);
03306 #endif
03307 #ifdef CONFIG_RSBAC_AUTH_GROUP
03308         case ACT_group_real:
03309           return rsbac_ta_list_lol_remove(ta_number, process_group_handle, &pid);
03310 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03311         case ACT_group_eff:
03312           return rsbac_ta_list_lol_remove(ta_number, process_group_eff_handle, &pid);
03313         case ACT_group_fs:
03314           return rsbac_ta_list_lol_remove(ta_number, process_group_fs_handle, &pid);
03315 #endif
03316 #endif /* AUTH_GROUP */
03317 
03318         default:
03319           return -RSBAC_EINVALIDTARGET;
03320       }
03321   }

int rsbac_auth_copy_fp_capset rsbac_auth_file_t  file,
rsbac_pid_t  p_cap_set_id
 

Definition at line 3956 of file auth_data_structures.c.

References copy_fp_cap_set_item(), rsbac_auth_device_list_head_t::lock, lookup_device(), RSBAC_EINVALIDDEV, RSBAC_ENOTINITIALIZED, rsbac_get_super_block(), rsbac_is_initialized(), and rsbac_printk().

Referenced by rsbac_adf_set_attr_auth().

03958   {
03959     u_long dflags;
03960     struct rsbac_auth_device_list_item_t * device_p;
03961     int err=0;
03962 
03963     if (!rsbac_is_initialized())
03964       {
03965         rsbac_printk(KERN_WARNING "rsbac_auth_copy_fp_capset(): RSBAC not initialized\n");
03966         return(-RSBAC_ENOTINITIALIZED);
03967       }
03968     if (in_interrupt())
03969       {
03970         rsbac_printk(KERN_WARNING "rsbac_auth_copy_fp_capset(): called from interrupt!\n");
03971       }
03972 /*
03973 #ifdef CONFIG_RSBAC_DEBUG
03974     if (rsbac_debug_ds_auth)
03975       rsbac_printk(KERN_DEBUG
03976              "rsbac_auth_copy_fp_capset(): Copying file cap set data to process cap set\n");
03977 #endif
03978 */
03979     /* protect device list */
03980     rsbac_read_lock(&device_list_head.lock, &dflags);
03981     device_p = lookup_device(file.device);
03982     if(!device_p)
03983       {
03984         /* trigger rsbac_mount() */
03985         rsbac_read_unlock(&device_list_head.lock, &dflags);
03986         rsbac_get_super_block(file.device);
03987         /* retry */
03988         rsbac_read_lock(&device_list_head.lock, &dflags);
03989         device_p = lookup_device(file.device);
03990         if(!device_p)
03991           {
03992             rsbac_printk(KERN_WARNING "rsbac_auth_copy_fp_capset(): invalid device %02u:%02u!\n",
03993                    RSBAC_MAJOR(file.device),RSBAC_MINOR(file.device));
03994             rsbac_read_unlock(&device_list_head.lock, &dflags);
03995             return(-RSBAC_EINVALIDDEV);
03996           }
03997       }
03998     /* call the copy function */
03999     err = copy_fp_cap_set_item(device_p,file,p_cap_set_id);
04000     rsbac_read_unlock(&device_list_head.lock, &dflags);
04001     return(err);
04002   }

int rsbac_auth_copy_pp_capset rsbac_pid_t  old_p_set_id,
rsbac_pid_t  new_p_set_id
 

Definition at line 4004 of file auth_data_structures.c.

References copy_pp_cap_set_item(), RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), and rsbac_printk().

Referenced by rsbac_adf_set_attr_auth().

04006   {
04007     if (!rsbac_is_initialized())
04008       {
04009         rsbac_printk(KERN_WARNING "rsbac_auth_copy_pp_capset(): RSBAC not initialized\n");
04010         return(-RSBAC_ENOTINITIALIZED);
04011       }
04012     if (in_interrupt())
04013       {
04014         rsbac_printk(KERN_WARNING "rsbac_auth_copy_pp_capset(): called from interrupt!\n");
04015       }
04016 /*
04017 #ifdef CONFIG_RSBAC_DEBUG
04018     if (rsbac_debug_ds_auth)
04019       rsbac_printk(KERN_DEBUG
04020              "rsbac_auth_copy_pp_capset(): Copying process cap set data to process cap set\n");
04021 #endif
04022 */
04023     /* call the copy function */
04024     return copy_pp_cap_set_item(old_p_set_id,new_p_set_id);
04025   }

int rsbac_auth_get_f_caplist rsbac_list_ta_number_t  ta_number,
rsbac_auth_file_t  file,
enum rsbac_auth_cap_type_t  cap_type,
struct rsbac_auth_cap_range_t **  caplist_p,
rsbac_time_t **  ttllist_p
 

Definition at line 4027 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, fd_hash(), rsbac_auth_device_list_item_t::handles, rsbac_auth_device_list_head_t::lock, lookup_device(), RSBAC_EINVALIDDEV, RSBAC_EINVALIDTARGET, RSBAC_ENOTINITIALIZED, rsbac_get_super_block(), rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_get_all_subdesc_ttl().

04033   {
04034     u_long dflags;
04035     struct rsbac_auth_device_list_item_t * device_p;
04036     long count;
04037 
04038     if (!rsbac_is_initialized())
04039       {
04040         rsbac_printk(KERN_WARNING "rsbac_auth_get_f_caplist(): RSBAC not initialized\n");
04041         return(-RSBAC_ENOTINITIALIZED);
04042       }
04043     if (in_interrupt())
04044       {
04045         rsbac_printk(KERN_WARNING "rsbac_auth_get_f_caplist(): called from interrupt!\n");
04046       }
04047 /*
04048 #ifdef CONFIG_RSBAC_DEBUG
04049     if (rsbac_debug_ds_auth)
04050       rsbac_printk(KERN_DEBUG
04051              "rsbac_auth_get_f_caplist(): Getting file/dir cap set list\n");
04052 #endif
04053 */
04054     /* protect device list */
04055     rsbac_read_lock(&device_list_head.lock, &dflags);
04056     device_p = lookup_device(file.device);
04057     if(!device_p)
04058       {
04059         /* trigger rsbac_mount() */
04060         rsbac_read_unlock(&device_list_head.lock, &dflags);
04061         rsbac_get_super_block(file.device);
04062         /* retry */
04063         rsbac_read_lock(&device_list_head.lock, &dflags);
04064         device_p = lookup_device(file.device);
04065         if(!device_p)
04066           {
04067             rsbac_printk(KERN_WARNING "rsbac_auth_get_f_caplist(): invalid device %02u:%02u!\n",
04068                    RSBAC_MAJOR(file.device),RSBAC_MINOR(file.device));
04069             rsbac_read_unlock(&device_list_head.lock, &dflags);
04070             return(-RSBAC_EINVALIDDEV);
04071           }
04072       }
04073     switch(cap_type)
04074       {
04075         case ACT_real:
04076           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04077                                                      device_p->handles[fd_hash(file.inode)],
04078                                                      &file.inode,
04079                                                      (void **) caplist_p,
04080                                                      ttllist_p);
04081           break;
04082 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
04083         case ACT_eff:
04084           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04085                                                      device_p->eff_handles[eff_fd_hash(file.inode)],
04086                                                      &file.inode,
04087                                                      (void **) caplist_p,
04088                                                      ttllist_p);
04089           break;
04090         case ACT_fs:
04091           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04092                                                      device_p->fs_handles[fs_fd_hash(file.inode)],
04093                                                      &file.inode,
04094                                                      (void **) caplist_p,
04095                                                      ttllist_p);
04096           break;
04097 #endif
04098 #ifdef CONFIG_RSBAC_AUTH_GROUP
04099         case ACT_group_real:
04100           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04101                                                      device_p->group_handles[group_fd_hash(file.inode)],
04102                                                      &file.inode,
04103                                                      (void **) caplist_p,
04104                                                      ttllist_p);
04105           break;
04106 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
04107         case ACT_group_eff:
04108           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04109                                                      device_p->group_eff_handles[group_eff_fd_hash(file.inode)],
04110                                                      &file.inode,
04111                                                      (void **) caplist_p,
04112                                                      ttllist_p);
04113           break;
04114         case ACT_group_fs:
04115           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04116                                                      device_p->group_fs_handles[group_fs_fd_hash(file.inode)],
04117                                                      &file.inode,
04118                                                      (void **) caplist_p,
04119                                                      ttllist_p);
04120           break;
04121 #endif
04122 #endif /* AUTH_GROUP */
04123 
04124         default:
04125           count = -RSBAC_EINVALIDTARGET;
04126       }
04127     rsbac_read_unlock(&device_list_head.lock, &dflags);
04128     return(count);
04129   }

int rsbac_auth_get_p_caplist rsbac_list_ta_number_t  ta_number,
rsbac_pid_t  pid,
enum rsbac_auth_cap_type_t  cap_type,
struct rsbac_auth_cap_range_t **  caplist_p,
rsbac_time_t **  ttllist_p
 

Definition at line 4131 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, RSBAC_EINVALIDTARGET, RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_get_all_subdesc_ttl().

04137   {
04138     long count;
04139 
04140     if (!rsbac_is_initialized())
04141       {
04142         rsbac_printk(KERN_WARNING "rsbac_auth_get_p_caplist(): RSBAC not initialized\n");
04143         return(-RSBAC_ENOTINITIALIZED);
04144       }
04145     if (in_interrupt())
04146       {
04147         rsbac_printk(KERN_WARNING "rsbac_auth_get_p_caplist(): called from interrupt!\n");
04148       }
04149 /*
04150 #ifdef CONFIG_RSBAC_DEBUG
04151     if (rsbac_debug_ds_auth)
04152       rsbac_printk(KERN_DEBUG
04153              "rsbac_auth_get_p_caplist(): Getting process cap set list\n");
04154 #endif
04155 */
04156     switch(cap_type)
04157       {
04158         case ACT_real:
04159           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04160                                                      process_handle,
04161                                                      &pid,
04162                                                      (void **) caplist_p,
04163                                                      ttllist_p);
04164           break;
04165 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
04166         case ACT_eff:
04167           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04168                                                      process_eff_handle,
04169                                                      &pid,
04170                                                      (void **) caplist_p,
04171                                                      ttllist_p);
04172           break;
04173         case ACT_fs:
04174           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04175                                                      process_fs_handle,
04176                                                      &pid,
04177                                                      (void **) caplist_p,
04178                                                      ttllist_p);
04179           break;
04180 #endif
04181 #ifdef CONFIG_RSBAC_AUTH_GROUP
04182         case ACT_group_real:
04183           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04184                                                      process_group_handle,
04185                                                      &pid,
04186                                                      (void **) caplist_p,
04187                                                      ttllist_p);
04188           break;
04189 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
04190         case ACT_group_eff:
04191           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04192                                                      process_group_eff_handle,
04193                                                      &pid,
04194                                                      (void **) caplist_p,
04195                                                      ttllist_p);
04196           break;
04197         case ACT_group_fs:
04198           count = rsbac_ta_list_lol_get_all_subdesc_ttl(ta_number,
04199                                                      process_group_fs_handle,
04200                                                      &pid,
04201                                                      (void **) caplist_p,
04202                                                      ttllist_p);
04203           break;
04204 #endif
04205 #endif /* AUTH_GROUP */
04206 
04207         default:
04208           count = -RSBAC_EINVALIDTARGET;
04209       }
04210     return(count);
04211   }

rsbac_boolean_t rsbac_auth_p_capset_member rsbac_pid_t  pid,
enum rsbac_auth_cap_type_t  cap_type,
rsbac_uid_t  member
 

Definition at line 3397 of file auth_data_structures.c.

References A_auth_learn, ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, AUTH, rsbac_attribute_value_t::auth_learn, FALSE, fd_hash(), rsbac_auth_cap_range_t::first, rsbac_auth_device_list_item_t::handles, rsbac_auth_cap_range_t::last, rsbac_auth_device_list_head_t::lock, lookup_device(), NULL, rsbac_target_id_t::process, RSBAC_AUTH_DAC_GROUP_F_CAP, RSBAC_AUTH_DAC_OWNER_F_CAP, RSBAC_AUTH_GROUP_F_CAP, RSBAC_AUTH_MAX_RANGE_UID, RSBAC_AUTH_OWNER_F_CAP, rsbac_get_attr, rsbac_is_initialized(), rsbac_list_lol_subadd(), rsbac_list_lol_subexist_compare(), rsbac_printk(), single_cap_compare(), T_PROCESS, and TRUE.

Referenced by rsbac_adf_request_auth(), and rsbac_replace_auth_cap().

03400   {
03401     rsbac_boolean_t result;
03402 
03403     if (!rsbac_is_initialized())
03404       {
03405         rsbac_printk(KERN_WARNING "rsbac_auth_p_capset_member(): RSBAC not initialized\n");
03406         return FALSE;
03407       }
03408     if (in_interrupt())
03409       {
03410         rsbac_printk(KERN_WARNING "rsbac_auth_p_capset_member(): called from interrupt!\n");
03411       }
03412     switch(cap_type)
03413       {
03414         case ACT_real:
03415           result = rsbac_list_lol_subexist_compare(process_handle, &pid, &member, single_cap_compare);
03416 
03417           #if defined(CONFIG_RSBAC_AUTH_LEARN)
03418           if(   !result
03419              && (member <= RSBAC_AUTH_MAX_RANGE_UID)
03420             )
03421             {
03422               union rsbac_target_id_t tid;
03423               union rsbac_attribute_value_t attr_val;
03424               rsbac_boolean_t learn;
03425 
03426               learn = rsbac_auth_learn;
03427               if(!learn)
03428                 {
03429                   tid.process = pid;
03430                   /* check learn on process */
03431                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_learn, &attr_val, FALSE))
03432                     learn = attr_val.auth_learn;
03433                 }
03434               if(learn)
03435                 {
03436                   struct rsbac_auth_cap_range_t range;
03437 
03438                   rsbac_printk(KERN_INFO
03439                          "rsbac_auth_p_capset_member(): adding AUTH capability for uid %u to process %u (%.15s)!\n",
03440                          member,
03441                          pid,
03442                          current->comm);
03443                   range.first = member;
03444                   range.last = member;
03445                   rsbac_list_lol_subadd(process_handle, &pid, &range, NULL);
03446 
03447                   tid.process = pid;
03448                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_program_file, &attr_val, FALSE))
03449                     {
03450                       struct rsbac_auth_device_list_item_t * device_p;
03451                       union rsbac_attribute_value_t attr_val2;
03452                       u_long dflags;
03453 
03454                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_uid, &attr_val2, FALSE)
03455                          && (range.first == attr_val2.auth_start_uid)
03456                         )
03457                         {
03458                           range.first = RSBAC_AUTH_OWNER_F_CAP;
03459                           range.last = range.first;
03460                         }
03461                       rsbac_printk(KERN_INFO
03462                              "rsbac_auth_p_capset_member(): adding AUTH capability for uid %u to file %u on device %02u:%02u!\n",
03463                              range.first,
03464                              attr_val.auth_program_file.inode,
03465                              MAJOR(attr_val.auth_program_file.device),
03466                              MINOR(attr_val.auth_program_file.device));
03467                       rsbac_read_lock(&device_list_head.lock, &dflags);
03468                       device_p = lookup_device(attr_val.auth_program_file.device);
03469                       if(device_p)
03470                         {
03471                           rsbac_list_lol_subadd(device_p->handles[fd_hash(attr_val.auth_program_file.inode)],
03472                                                 &attr_val.auth_program_file.inode, &range, NULL);
03473                         }
03474                       else
03475                         {
03476                           rsbac_printk(KERN_INFO
03477                                  "rsbac_auth_p_capset_member(): unknown device %02u:%02u!\n",
03478                                  MAJOR(attr_val.auth_program_file.device),
03479                                  MINOR(attr_val.auth_program_file.device));
03480                         }
03481                       rsbac_read_unlock(&device_list_head.lock, &dflags);
03482                     }
03483                   result = TRUE;
03484                 }
03485             }
03486           #endif
03487           break;
03488 
03489 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03490         case ACT_eff:
03491           result = rsbac_list_lol_subexist_compare(process_eff_handle, &pid, &member, single_cap_compare);
03492 
03493           #if defined(CONFIG_RSBAC_AUTH_LEARN)
03494           if(   !result
03495              && (member <= RSBAC_AUTH_MAX_RANGE_UID)
03496             )
03497             {
03498               union rsbac_target_id_t tid;
03499               union rsbac_attribute_value_t attr_val;
03500               rsbac_boolean_t learn;
03501 
03502               learn = rsbac_auth_learn;
03503               if(!learn)
03504                 {
03505                   tid.process = pid;
03506                   /* check learn on process */
03507                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_learn, &attr_val, FALSE))
03508                     learn = attr_val.auth_learn;
03509                 }
03510               if(learn)
03511                 {
03512                   struct rsbac_auth_cap_range_t range;
03513 
03514                   rsbac_printk(KERN_INFO
03515                          "rsbac_auth_p_capset_member(): adding AUTH eff capability for uid %u to process %u (%.15s)!\n",
03516                          member,
03517                          pid,
03518                          current->comm);
03519                   range.first = member;
03520                   range.last = member;
03521                   rsbac_list_lol_subadd(process_eff_handle, &pid, &range, NULL);
03522 
03523                   tid.process = pid;
03524                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_program_file, &attr_val, FALSE))
03525                     {
03526                       struct rsbac_auth_device_list_item_t * device_p;
03527                       union rsbac_attribute_value_t attr_val2;
03528                       u_long dflags;
03529 
03530                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_uid, &attr_val2, FALSE)
03531                          && (range.first == attr_val2.auth_start_uid)
03532                         )
03533                         {
03534                           range.first = RSBAC_AUTH_OWNER_F_CAP;
03535                           range.last = range.first;
03536                         }
03537                       else
03538                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_euid, &attr_val2, FALSE)
03539                          && (range.first == attr_val2.auth_start_euid)
03540                         )
03541                         {
03542                           range.first = RSBAC_AUTH_DAC_OWNER_F_CAP;
03543                           range.last = range.first;
03544                         }
03545                       rsbac_printk(KERN_INFO
03546                              "rsbac_auth_p_capset_member(): adding AUTH eff capability for uid %u to file %u on device %02u:%02u!\n",
03547                              range.first,
03548                              attr_val.auth_program_file.inode,
03549                              MAJOR(attr_val.auth_program_file.device),
03550                              MINOR(attr_val.auth_program_file.device));
03551                       rsbac_read_lock(&device_list_head.lock, &dflags);
03552                       device_p = lookup_device(attr_val.auth_program_file.device);
03553                       if(device_p)
03554                         {
03555                           rsbac_list_lol_subadd(device_p->eff_handles[eff_fd_hash(attr_val.auth_program_file.inode)],
03556                                                 &attr_val.auth_program_file.inode, &range, NULL);
03557                         }
03558                       else
03559                         {
03560                           rsbac_printk(KERN_INFO
03561                                  "rsbac_auth_p_capset_member(): unknown device %02u:%02u!\n",
03562                                  MAJOR(attr_val.auth_program_file.device),
03563                                  MINOR(attr_val.auth_program_file.device));
03564                         }
03565                       rsbac_read_unlock(&device_list_head.lock, &dflags);
03566                     }
03567                   result = TRUE;
03568                 }
03569             }
03570           #endif
03571           break;
03572 
03573         case ACT_fs:
03574           result = rsbac_list_lol_subexist_compare(process_fs_handle, &pid, &member, single_cap_compare);
03575 
03576           #if defined(CONFIG_RSBAC_AUTH_LEARN)
03577           if(   !result
03578              && (member <= RSBAC_AUTH_MAX_RANGE_UID)
03579             )
03580             {
03581               union rsbac_target_id_t tid;
03582               union rsbac_attribute_value_t attr_val;
03583               rsbac_boolean_t learn;
03584 
03585               learn = rsbac_auth_learn;
03586               if(!learn)
03587                 {
03588                   tid.process = pid;
03589                   /* check learn on process */
03590                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_learn, &attr_val, FALSE))
03591                     learn = attr_val.auth_learn;
03592                 }
03593               if(learn)
03594                 {
03595                   struct rsbac_auth_cap_range_t range;
03596 
03597                   rsbac_printk(KERN_INFO
03598                          "rsbac_auth_p_capset_member(): adding AUTH fs capability for uid %u to process %u (%.15s)!\n",
03599                          member,
03600                          pid,
03601                          current->comm);
03602                   range.first = member;
03603                   range.last = member;
03604                   rsbac_list_lol_subadd(process_fs_handle, &pid, &range, NULL);
03605 
03606                   tid.process = pid;
03607                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_program_file, &attr_val, FALSE))
03608                     {
03609                       struct rsbac_auth_device_list_item_t * device_p;
03610                       union rsbac_attribute_value_t attr_val2;
03611                       u_long dflags;
03612 
03613                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_uid, &attr_val2, FALSE)
03614                          && (range.first == attr_val2.auth_start_uid)
03615                         )
03616                         {
03617                           range.first = RSBAC_AUTH_OWNER_F_CAP;
03618                           range.last = range.first;
03619                         }
03620                       else
03621                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_euid, &attr_val2, FALSE)
03622                          && (range.first == attr_val2.auth_start_euid)
03623                         )
03624                         {
03625                           range.first = RSBAC_AUTH_DAC_OWNER_F_CAP;
03626                           range.last = range.first;
03627                         }
03628                       rsbac_printk(KERN_INFO
03629                              "rsbac_auth_p_capset_member(): adding AUTH fs capability for uid %u to file %u on device %02u:%02u!\n",
03630                              range.first,
03631                              attr_val.auth_program_file.inode,
03632                              MAJOR(attr_val.auth_program_file.device),
03633                              MINOR(attr_val.auth_program_file.device));
03634                       rsbac_read_lock(&device_list_head.lock, &dflags);
03635                       device_p = lookup_device(attr_val.auth_program_file.device);
03636                       if(device_p)
03637                         {
03638                           rsbac_list_lol_subadd(device_p->fs_handles[fs_fd_hash(attr_val.auth_program_file.inode)],
03639                                                 &attr_val.auth_program_file.inode, &range, NULL);
03640                         }
03641                       else
03642                         {
03643                           rsbac_printk(KERN_INFO
03644                                  "rsbac_auth_p_capset_member(): unknown device %02u:%02u!\n",
03645                                  MAJOR(attr_val.auth_program_file.device),
03646                                  MINOR(attr_val.auth_program_file.device));
03647                         }
03648                       rsbac_read_unlock(&device_list_head.lock, &dflags);
03649                     }
03650                   result = TRUE;
03651                 }
03652             }
03653           #endif
03654           break;
03655 #endif /* AUTH_DAC_OWNER */
03656 
03657 #ifdef CONFIG_RSBAC_AUTH_GROUP
03658         case ACT_group_real:
03659           result = rsbac_list_lol_subexist_compare(process_group_handle, &pid, &member, single_cap_compare);
03660 
03661           #if defined(CONFIG_RSBAC_AUTH_LEARN)
03662           if(   !result
03663              && (member <= RSBAC_AUTH_MAX_RANGE_UID)
03664             )
03665             {
03666               union rsbac_target_id_t tid;
03667               union rsbac_attribute_value_t attr_val;
03668               rsbac_boolean_t learn;
03669 
03670               learn = rsbac_auth_learn;
03671               if(!learn)
03672                 {
03673                   tid.process = pid;
03674                   /* check learn on process */
03675                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_learn, &attr_val, FALSE))
03676                     learn = attr_val.auth_learn;
03677                 }
03678               if(learn)
03679                 {
03680                   struct rsbac_auth_cap_range_t range;
03681 
03682                   rsbac_printk(KERN_INFO
03683                          "rsbac_auth_p_capset_member(): adding AUTH group capability for gid %u to process %u (%.15s)!\n",
03684                          member,
03685                          pid,
03686                          current->comm);
03687                   range.first = member;
03688                   range.last = member;
03689                   rsbac_list_lol_subadd(process_group_handle, &pid, &range, NULL);
03690 
03691                   tid.process = pid;
03692                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_program_file, &attr_val, FALSE))
03693                     {
03694                       struct rsbac_auth_device_list_item_t * device_p;
03695                       union rsbac_attribute_value_t attr_val2;
03696                       u_long dflags;
03697 
03698                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_gid, &attr_val2, FALSE)
03699                          && (range.first == attr_val2.auth_start_gid)
03700                         )
03701                         {
03702                           range.first = RSBAC_AUTH_GROUP_F_CAP;
03703                           range.last = range.first;
03704                         }
03705                       rsbac_printk(KERN_INFO
03706                              "rsbac_auth_p_capset_member(): adding AUTH group capability for gid %u to file %u on device %02u:%02u!\n",
03707                              range.first,
03708                              attr_val.auth_program_file.inode,
03709                              MAJOR(attr_val.auth_program_file.device),
03710                              MINOR(attr_val.auth_program_file.device));
03711                       rsbac_read_lock(&device_list_head.lock, &dflags);
03712                       device_p = lookup_device(attr_val.auth_program_file.device);
03713                       if(device_p)
03714                         {
03715                           rsbac_list_lol_subadd(device_p->group_handles[group_fd_hash(attr_val.auth_program_file.inode)],
03716                                                 &attr_val.auth_program_file.inode, &range, NULL);
03717                         }
03718                       else
03719                         {
03720                           rsbac_printk(KERN_INFO
03721                                  "rsbac_auth_p_capset_member(): unknown device %02u:%02u!\n",
03722                                  MAJOR(attr_val.auth_program_file.device),
03723                                  MINOR(attr_val.auth_program_file.device));
03724                         }
03725                       rsbac_read_unlock(&device_list_head.lock, &dflags);
03726                     }
03727                   result = TRUE;
03728                 }
03729             }
03730           #endif
03731           break;
03732 
03733 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03734         case ACT_group_eff:
03735           result = rsbac_list_lol_subexist_compare(process_group_eff_handle, &pid, &member, single_cap_compare);
03736 
03737           #if defined(CONFIG_RSBAC_AUTH_LEARN)
03738           if(   !result
03739              && (member <= RSBAC_AUTH_MAX_RANGE_UID)
03740             )
03741             {
03742               union rsbac_target_id_t tid;
03743               union rsbac_attribute_value_t attr_val;
03744               rsbac_boolean_t learn;
03745 
03746               learn = rsbac_auth_learn;
03747               if(!learn)
03748                 {
03749                   tid.process = pid;
03750                   /* check learn on process */
03751                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_learn, &attr_val, FALSE))
03752                     learn = attr_val.auth_learn;
03753                 }
03754               if(learn)
03755                 {
03756                   struct rsbac_auth_cap_range_t range;
03757 
03758                   rsbac_printk(KERN_INFO
03759                          "rsbac_auth_p_capset_member(): adding AUTH group eff capability for gid %u to process %u (%.15s)!\n",
03760                          member,
03761                          pid,
03762                          current->comm);
03763                   range.first = member;
03764                   range.last = member;
03765                   rsbac_list_lol_subadd(process_group_eff_handle, &pid, &range, NULL);
03766 
03767                   tid.process = pid;
03768                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_program_file, &attr_val, FALSE))
03769                     {
03770                       struct rsbac_auth_device_list_item_t * device_p;
03771                       union rsbac_attribute_value_t attr_val2;
03772                       u_long dflags;
03773 
03774                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_gid, &attr_val2, FALSE)
03775                          && (range.first == attr_val2.auth_start_gid)
03776                         )
03777                         {
03778                           range.first = RSBAC_AUTH_GROUP_F_CAP;
03779                           range.last = range.first;
03780                         }
03781                       else
03782                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_egid, &attr_val2, FALSE)
03783                          && (range.first == attr_val2.auth_start_egid)
03784                         )
03785                         {
03786                           range.first = RSBAC_AUTH_DAC_GROUP_F_CAP;
03787                           range.last = range.first;
03788                         }
03789                       rsbac_printk(KERN_INFO
03790                              "rsbac_auth_p_capset_member(): adding AUTH group eff capability for gid %u to file %u on device %02u:%02u!\n",
03791                              range.first,
03792                              attr_val.auth_program_file.inode,
03793                              MAJOR(attr_val.auth_program_file.device),
03794                              MINOR(attr_val.auth_program_file.device));
03795                       rsbac_read_lock(&device_list_head.lock, &dflags);
03796                       device_p = lookup_device(attr_val.auth_program_file.device);
03797                       if(device_p)
03798                         {
03799                           rsbac_list_lol_subadd(device_p->group_eff_handles[group_eff_fd_hash(attr_val.auth_program_file.inode)],
03800                                                 &attr_val.auth_program_file.inode, &range, NULL);
03801                         }
03802                       else
03803                         {
03804                           rsbac_printk(KERN_INFO
03805                                  "rsbac_auth_p_capset_member(): unknown device %02u:%02u!\n",
03806                                  MAJOR(attr_val.auth_program_file.device),
03807                                  MINOR(attr_val.auth_program_file.device));
03808                         }
03809                       rsbac_read_unlock(&device_list_head.lock, &dflags);
03810                     }
03811                   result = TRUE;
03812                 }
03813             }
03814           #endif
03815           break;
03816 
03817         case ACT_group_fs:
03818           result = rsbac_list_lol_subexist_compare(process_group_fs_handle, &pid, &member, single_cap_compare);
03819 
03820           #if defined(CONFIG_RSBAC_AUTH_LEARN)
03821           if(   !result
03822              && (member <= RSBAC_AUTH_MAX_RANGE_UID)
03823             )
03824             {
03825               union rsbac_target_id_t tid;
03826               union rsbac_attribute_value_t attr_val;
03827               rsbac_boolean_t learn;
03828 
03829               learn = rsbac_auth_learn;
03830               if(!learn)
03831                 {
03832                   tid.process = pid;
03833                   /* check learn on process */
03834                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_learn, &attr_val, FALSE))
03835                     learn = attr_val.auth_learn;
03836                 }
03837               if(learn)
03838                 {
03839                   struct rsbac_auth_cap_range_t range;
03840 
03841                   rsbac_printk(KERN_INFO
03842                          "rsbac_auth_p_capset_member(): adding AUTH group fs capability for gid %u to process %u (%.15s)!\n",
03843                          member,
03844                          pid,
03845                          current->comm);
03846                   range.first = member;
03847                   range.last = member;
03848                   rsbac_list_lol_subadd(process_group_fs_handle, &pid, &range, NULL);
03849 
03850                   tid.process = pid;
03851                   if(!rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_program_file, &attr_val, FALSE))
03852                     {
03853                       struct rsbac_auth_device_list_item_t * device_p;
03854                       union rsbac_attribute_value_t attr_val2;
03855                       u_long dflags;
03856 
03857                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_gid, &attr_val2, FALSE)
03858                          && (range.first == attr_val2.auth_start_gid)
03859                         )
03860                         {
03861                           range.first = RSBAC_AUTH_GROUP_F_CAP;
03862                           range.last = range.first;
03863                         }
03864                       else
03865                       if(   !rsbac_get_attr(AUTH, T_PROCESS, tid, A_auth_start_egid, &attr_val2, FALSE)
03866                          && (range.first == attr_val2.auth_start_egid)
03867                         )
03868                         {
03869                           range.first = RSBAC_AUTH_DAC_GROUP_F_CAP;
03870                           range.last = range.first;
03871                         }
03872                       rsbac_printk(KERN_INFO
03873                              "rsbac_auth_p_capset_member(): adding AUTH group fs capability for gid %u to file %u on device %02u:%02u!\n",
03874                              range.first,
03875                              attr_val.auth_program_file.inode,
03876                              MAJOR(attr_val.auth_program_file.device),
03877                              MINOR(attr_val.auth_program_file.device));
03878                       rsbac_read_lock(&device_list_head.lock, &dflags);
03879                       device_p = lookup_device(attr_val.auth_program_file.device);
03880                       if(device_p)
03881                         {
03882                           rsbac_list_lol_subadd(device_p->group_fs_handles[group_fs_fd_hash(attr_val.auth_program_file.inode)],
03883                                                 &attr_val.auth_program_file.inode, &range, NULL);
03884                         }
03885                       else
03886                         {
03887                           rsbac_printk(KERN_INFO
03888                                  "rsbac_auth_p_capset_member(): unknown device %02u:%02u!\n",
03889                                  MAJOR(attr_val.auth_program_file.device),
03890                                  MINOR(attr_val.auth_program_file.device));
03891                         }
03892                       rsbac_read_unlock(&device_list_head.lock, &dflags);
03893                     }
03894                   result = TRUE;
03895                 }
03896             }
03897           #endif
03898           break;
03899 #endif /* AUTH_DAC_GROUP */
03900 #endif /* AUTH_GROUP */
03901 
03902         default:
03903           return FALSE;
03904       }
03905     return result;
03906   }

int rsbac_auth_remove_f_capsets rsbac_auth_file_t  file  ) 
 

Definition at line 3932 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, and rsbac_auth_clear_f_capset().

Referenced by rsbac_adf_set_attr_auth(), and rsbac_ta_remove_target().

03933   {
03934     int err;
03935 
03936     err = rsbac_auth_clear_f_capset(0, file, ACT_real);
03937 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03938     if(!err)
03939       err = rsbac_auth_clear_f_capset(0, file, ACT_eff);
03940     if(!err)
03941       err = rsbac_auth_clear_f_capset(0, file, ACT_fs);
03942 #endif
03943 #ifdef CONFIG_RSBAC_AUTH_GROUP
03944     err = rsbac_auth_clear_f_capset(0, file, ACT_group_real);
03945 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03946     if(!err)
03947       err = rsbac_auth_clear_f_capset(0, file, ACT_group_eff);
03948     if(!err)
03949       err = rsbac_auth_clear_f_capset(0, file, ACT_group_fs);
03950 #endif
03951 #endif /* AUTH_GROUP */
03952 
03953     return err;
03954   }

int rsbac_auth_remove_from_f_capset rsbac_list_ta_number_t  ta_number,
rsbac_auth_file_t  file,
enum rsbac_auth_cap_type_t  cap_type,
struct rsbac_auth_cap_range_t  cap_range
 

Definition at line 3204 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, fd_hash(), rsbac_auth_cap_range_t::first, rsbac_auth_device_list_item_t::handles, rsbac_auth_cap_range_t::last, rsbac_auth_device_list_head_t::lock, lookup_device(), RSBAC_EINVALIDDEV, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_get_super_block(), rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_subremove().

Referenced by rsbac_auth_remove_f_cap().

03209   {
03210     int                                    err=0;
03211     u_long dflags;
03212     struct rsbac_auth_device_list_item_t   * device_p;
03213 
03214     if (!rsbac_is_initialized())
03215       {
03216         rsbac_printk(KERN_WARNING "rsbac_auth_remove_from_f_capset(): RSBAC not initialized\n");
03217         return(-RSBAC_ENOTINITIALIZED);
03218       }
03219     if (in_interrupt())
03220       {
03221         rsbac_printk(KERN_WARNING "rsbac_auth_remove_from_f_capset(): called from interrupt!\n");
03222       }
03223     if(cap_range.first > cap_range.last)
03224       return(-RSBAC_EINVALIDVALUE);
03225 
03226     /* protect device list */
03227     rsbac_read_lock(&device_list_head.lock, &dflags);
03228     device_p = lookup_device(file.device);
03229     if(!device_p)
03230       {
03231         /* trigger rsbac_mount() */
03232         rsbac_read_unlock(&device_list_head.lock, &dflags);
03233         rsbac_get_super_block(file.device);
03234         /* retry */
03235         rsbac_read_lock(&device_list_head.lock, &dflags);
03236         device_p = lookup_device(file.device);
03237         if(!device_p)
03238           {
03239             rsbac_printk(KERN_WARNING "rsbac_auth_remove_from_f_capset(): invalid device %02u:%02u!\n",
03240                    RSBAC_MAJOR(file.device),RSBAC_MINOR(file.device));
03241             rsbac_read_unlock(&device_list_head.lock, &dflags);
03242             return(-RSBAC_EINVALIDDEV);
03243           }
03244       }
03245     switch(cap_type)
03246       {
03247         case ACT_real:
03248           err = rsbac_ta_list_lol_subremove(ta_number, device_p->handles[fd_hash(file.inode)], &file.inode, &cap_range);
03249           break;
03250 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03251         case ACT_eff:
03252           err = rsbac_ta_list_lol_subremove(ta_number, device_p->eff_handles[eff_fd_hash(file.inode)], &file.inode, &cap_range);
03253           break;
03254         case ACT_fs:
03255           err = rsbac_ta_list_lol_subremove(ta_number, device_p->fs_handles[fs_fd_hash(file.inode)], &file.inode, &cap_range);
03256           break;
03257 #endif
03258 #ifdef CONFIG_RSBAC_AUTH_GROUP
03259         case ACT_group_real:
03260           err = rsbac_ta_list_lol_subremove(ta_number, device_p->group_handles[group_fd_hash(file.inode)], &file.inode, &cap_range);
03261           break;
03262 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03263         case ACT_group_eff:
03264           err = rsbac_ta_list_lol_subremove(ta_number, device_p->group_eff_handles[group_eff_fd_hash(file.inode)], &file.inode, &cap_range);
03265           break;
03266         case ACT_group_fs:
03267           err = rsbac_ta_list_lol_subremove(ta_number, device_p->group_fs_handles[group_fs_fd_hash(file.inode)], &file.inode, &cap_range);
03268           break;
03269 #endif
03270 #endif /* AUTH_GROUP */
03271 
03272         default:
03273           err = -RSBAC_EINVALIDTARGET;
03274       }
03275     rsbac_read_unlock(&device_list_head.lock, &dflags);
03276     return(err);
03277   }

int rsbac_auth_remove_from_p_capset rsbac_list_ta_number_t  ta_number,
rsbac_pid_t  pid,
enum rsbac_auth_cap_type_t  cap_type,
struct rsbac_auth_cap_range_t  cap_range
 

Definition at line 3161 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, rsbac_auth_cap_range_t::first, rsbac_auth_cap_range_t::last, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), rsbac_printk(), and rsbac_ta_list_lol_subremove().

Referenced by rsbac_auth_remove_p_cap(), and rsbac_replace_auth_cap().

03166   {
03167     if (!rsbac_is_initialized())
03168       {
03169         rsbac_printk(KERN_WARNING "rsbac_auth_remove_from_p_capset(): RSBAC not initialized\n");
03170         return(-RSBAC_ENOTINITIALIZED);
03171       }
03172     if (in_interrupt())
03173       {
03174         rsbac_printk(KERN_WARNING "rsbac_auth_remove_from_p_capset(): called from interrupt!\n");
03175       }
03176     if(cap_range.first > cap_range.last)
03177       return(-RSBAC_EINVALIDVALUE);
03178     switch(cap_type)
03179       {
03180         case ACT_real:
03181           return rsbac_ta_list_lol_subremove(ta_number, process_handle, &pid, &cap_range);
03182 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03183         case ACT_eff:
03184           return rsbac_ta_list_lol_subremove(ta_number, process_eff_handle, &pid, &cap_range);
03185         case ACT_fs:
03186           return rsbac_ta_list_lol_subremove(ta_number, process_fs_handle, &pid, &cap_range);
03187 #endif
03188 #ifdef CONFIG_RSBAC_AUTH_GROUP
03189         case ACT_group_real:
03190           return rsbac_ta_list_lol_subremove(ta_number, process_group_handle, &pid, &cap_range);
03191 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03192         case ACT_group_eff:
03193           return rsbac_ta_list_lol_subremove(ta_number, process_group_eff_handle, &pid, &cap_range);
03194         case ACT_group_fs:
03195           return rsbac_ta_list_lol_subremove(ta_number, process_group_fs_handle, &pid, &cap_range);
03196 #endif
03197 #endif /* AUTH_GROUP */
03198 
03199         default:
03200           return -RSBAC_EINVALIDTARGET;
03201       }
03202   }

int rsbac_auth_remove_p_capsets rsbac_pid_t  pid  ) 
 

Definition at line 3912 of file auth_data_structures.c.

References ACT_eff, ACT_fs, ACT_group_eff, ACT_group_fs, ACT_group_real, ACT_real, and rsbac_auth_clear_p_capset().

Referenced by rsbac_ta_remove_target().

03913   {
03914     int err;
03915 
03916     err = rsbac_auth_clear_p_capset(0, pid, ACT_real);
03917 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
03918     err = rsbac_auth_clear_p_capset(0, pid, ACT_eff);
03919     err = rsbac_auth_clear_p_capset(0, pid, ACT_fs);
03920 #endif
03921 #ifdef CONFIG_RSBAC_AUTH_GROUP
03922     err = rsbac_auth_clear_p_capset(0, pid, ACT_group_real);
03923 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
03924     err = rsbac_auth_clear_p_capset(0, pid, ACT_group_eff);
03925     err = rsbac_auth_clear_p_capset(0, pid, ACT_group_fs);
03926 #endif
03927 #endif /* AUTH_GROUP */
03928 
03929     return err;
03930   }

int rsbac_check_auth int  correct,
int  check_inode
 

Referenced by rsbac_do_init(), and sys_rsbac_check().

int rsbac_init_auth void   ) 
 

Definition at line 2383 of file auth_data_structures.c.

References add_device_item(), auth_register_fd_lists(), cap_compare(), rsbac_auth_device_list_head_t::count, create_device_item(), rsbac_auth_device_list_head_t::curr, rsbac_list_lol_info_t::data_size, rsbac_list_lol_info_t::desc_size, get_error_name(), rsbac_auth_device_list_head_t::head, rsbac_list_lol_info_t::key, rsbac_auth_device_list_head_t::lock, rsbac_list_lol_info_t::max_age, NULL, proc_rsbac_root_p, RSBAC_AUTH_LIST_KEY, RSBAC_AUTH_P_EFF_LIST_NAME, RSBAC_AUTH_P_FS_LIST_NAME, RSBAC_AUTH_P_GROUP_EFF_LIST_NAME, RSBAC_AUTH_P_GROUP_FS_LIST_NAME, RSBAC_AUTH_P_GROUP_LIST_NAME, RSBAC_AUTH_P_LIST_NAME, RSBAC_AUTH_P_LIST_VERSION, RSBAC_ECOULDNOTADDDEVICE, RSBAC_EREINIT, rsbac_is_initialized(), rsbac_kfree(), rsbac_kmalloc(), RSBAC_LIST_DEF_DATA, rsbac_list_lol_register(), RSBAC_LIST_VERSION, RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_root_dev, rsbac_list_lol_info_t::subdata_size, rsbac_list_lol_info_t::subdesc_size, rsbac_auth_device_list_head_t::tail, and rsbac_list_lol_info_t::version.

Referenced by rsbac_do_init().

02385   {
02386     int  err = 0;
02387     struct rsbac_auth_device_list_item_t * device_p = NULL;
02388     u_long dflags;
02389     struct proc_dir_entry * tmp_entry_p;
02390     struct rsbac_list_lol_info_t lol_info;
02391 
02392     if (rsbac_is_initialized())
02393       {
02394         rsbac_printk(KERN_WARNING "rsbac_init_auth(): RSBAC already initialized\n");
02395         return(-RSBAC_EREINIT);
02396       }
02397 
02398     /* set rw-spinlocks to unlocked status and init data structures */
02399     rsbac_printk(KERN_INFO "rsbac_init_auth(): Initializing RSBAC: AUTH subsystem\n");
02400 
02401     lol_info.version = RSBAC_AUTH_P_LIST_VERSION;
02402     lol_info.key = RSBAC_AUTH_LIST_KEY;
02403     lol_info.desc_size = sizeof(rsbac_pid_t);
02404     lol_info.data_size = 0;
02405     lol_info.subdesc_size = sizeof(struct rsbac_auth_cap_range_t);
02406     lol_info.subdata_size = 0;
02407     lol_info.max_age = 0;
02408     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
02409                                   &process_handle,
02410                                   &lol_info,
02411                                   RSBAC_LIST_DEF_DATA,
02412                                   NULL,
02413                                   cap_compare,
02414                                   NULL,
02415                                   NULL,
02416                                   NULL,
02417                                   NULL,
02418                                   RSBAC_AUTH_P_LIST_NAME,
02419                                   RSBAC_AUTO_DEV);
02420     if(err)
02421       {
02422         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02423 
02424         if(tmp)
02425           {
02426             rsbac_printk(KERN_WARNING
02427                    "rsbac_init_auth(): Registering AUTH process cap list failed with error %s\n",
02428                    get_error_name(tmp, err));
02429             rsbac_kfree(tmp);
02430           }
02431       }
02432 #ifdef CONFIG_RSBAC_AUTH_DAC_OWNER
02433     lol_info.version = RSBAC_AUTH_P_LIST_VERSION;
02434     lol_info.key = RSBAC_AUTH_LIST_KEY;
02435     lol_info.desc_size = sizeof(rsbac_pid_t);
02436     lol_info.data_size = 0;
02437     lol_info.subdesc_size = sizeof(struct rsbac_auth_cap_range_t);
02438     lol_info.subdata_size = 0;
02439     lol_info.max_age = 0;
02440     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
02441                                   &process_eff_handle,
02442                                   &lol_info,
02443                                   RSBAC_LIST_DEF_DATA,
02444                                   NULL,
02445                                   cap_compare,
02446                                   NULL,
02447                                   NULL,
02448                                   NULL,
02449                                   NULL,
02450                                   RSBAC_AUTH_P_EFF_LIST_NAME,
02451                                   RSBAC_AUTO_DEV);
02452     if(err)
02453       {
02454         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02455 
02456         if(tmp)
02457           {
02458             rsbac_printk(KERN_WARNING
02459                    "rsbac_init_auth(): Registering AUTH process eff cap list failed with error %s\n",
02460                    get_error_name(tmp, err));
02461             rsbac_kfree(tmp);
02462           }
02463       }
02464     lol_info.version = RSBAC_AUTH_P_LIST_VERSION;
02465     lol_info.key = RSBAC_AUTH_LIST_KEY;
02466     lol_info.desc_size = sizeof(rsbac_pid_t);
02467     lol_info.data_size = 0;
02468     lol_info.subdesc_size = sizeof(struct rsbac_auth_cap_range_t);
02469     lol_info.subdata_size = 0;
02470     lol_info.max_age = 0;
02471     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
02472                                   &process_fs_handle,
02473                                   &lol_info,
02474                                   RSBAC_LIST_DEF_DATA,
02475                                   NULL,
02476                                   cap_compare,
02477                                   NULL,
02478                                   NULL,
02479                                   NULL,
02480                                   NULL,
02481                                   RSBAC_AUTH_P_FS_LIST_NAME,
02482                                   RSBAC_AUTO_DEV);
02483     if(err)
02484       {
02485         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02486 
02487         if(tmp)
02488           {
02489             rsbac_printk(KERN_WARNING
02490                    "rsbac_init_auth(): Registering AUTH process fs cap list failed with error %s\n",
02491                    get_error_name(tmp, err));
02492             rsbac_kfree(tmp);
02493           }
02494       }
02495 #endif
02496 
02497 #ifdef CONFIG_RSBAC_AUTH_GROUP
02498     lol_info.version = RSBAC_AUTH_P_LIST_VERSION;
02499     lol_info.key = RSBAC_AUTH_LIST_KEY;
02500     lol_info.desc_size = sizeof(rsbac_pid_t);
02501     lol_info.data_size = 0;
02502     lol_info.subdesc_size = sizeof(struct rsbac_auth_cap_range_t);
02503     lol_info.subdata_size = 0;
02504     lol_info.max_age = 0;
02505     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
02506                                   &process_group_handle,
02507                                   &lol_info,
02508                                   RSBAC_LIST_DEF_DATA,
02509                                   NULL,
02510                                   cap_compare,
02511                                   NULL,
02512                                   NULL,
02513                                   NULL,
02514                                   NULL,
02515                                   RSBAC_AUTH_P_GROUP_LIST_NAME,
02516                                   RSBAC_AUTO_DEV);
02517     if(err)
02518       {
02519         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02520 
02521         if(tmp)
02522           {
02523             rsbac_printk(KERN_WARNING
02524                    "rsbac_init_auth(): Registering AUTH process group cap list failed with error %s\n",
02525                    get_error_name(tmp, err));
02526             rsbac_kfree(tmp);
02527           }
02528       }
02529 #ifdef CONFIG_RSBAC_AUTH_DAC_GROUP
02530     lol_info.version = RSBAC_AUTH_P_LIST_VERSION;
02531     lol_info.key = RSBAC_AUTH_LIST_KEY;
02532     lol_info.desc_size = sizeof(rsbac_pid_t);
02533     lol_info.data_size = 0;
02534     lol_info.subdesc_size = sizeof(struct rsbac_auth_cap_range_t);
02535     lol_info.subdata_size = 0;
02536     lol_info.max_age = 0;
02537     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
02538                                   &process_group_eff_handle,
02539                                   &lol_info,
02540                                   RSBAC_LIST_DEF_DATA,
02541                                   NULL,
02542                                   cap_compare,
02543                                   NULL,
02544                                   NULL,
02545                                   NULL,
02546                                   NULL,
02547                                   RSBAC_AUTH_P_GROUP_EFF_LIST_NAME,
02548                                   RSBAC_AUTO_DEV);
02549     if(err)
02550       {
02551         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02552 
02553         if(tmp)
02554           {
02555             rsbac_printk(KERN_WARNING
02556                    "rsbac_init_auth(): Registering AUTH process group eff cap list failed with error %s\n",
02557                    get_error_name(tmp, err));
02558             rsbac_kfree(tmp);
02559           }
02560       }
02561     lol_info.version = RSBAC_AUTH_P_LIST_VERSION;
02562     lol_info.key = RSBAC_AUTH_LIST_KEY;
02563     lol_info.desc_size = sizeof(rsbac_pid_t);
02564     lol_info.data_size = 0;
02565     lol_info.subdesc_size = sizeof(struct rsbac_auth_cap_range_t);
02566     lol_info.subdata_size = 0;
02567     lol_info.max_age = 0;
02568     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
02569                                   &process_group_fs_handle,
02570                                   &lol_info,
02571                                   RSBAC_LIST_DEF_DATA,
02572                                   NULL,
02573                                   cap_compare,
02574                                   NULL,
02575                                   NULL,
02576                                   NULL,
02577                                   NULL,
02578                                   RSBAC_AUTH_P_GROUP_FS_LIST_NAME,
02579                                   RSBAC_AUTO_DEV);
02580     if(err)
02581       {
02582         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02583 
02584         if(tmp)
02585           {
02586             rsbac_printk(KERN_WARNING
02587                    "rsbac_init_auth(): Registering AUTH process group fs cap list failed with error %s\n",
02588                    get_error_name(tmp, err));
02589             rsbac_kfree(tmp);
02590           }
02591       }
02592 #endif
02593 #endif /* AUTH_GROUP */
02594 
02595     /* Init FD lists */
02596     device_list_head.lock = RW_LOCK_UNLOCKED;
02597     device_list_head.head = NULL;
02598     device_list_head.tail = NULL;
02599     device_list_head.curr = NULL;
02600     device_list_head.count = 0;
02601 
02602     /* read all data */
02603 #ifdef CONFIG_RSBAC_DEBUG
02604     if (rsbac_debug_ds_auth)
02605       rsbac_printk(KERN_INFO "rsbac_init_auth(): Registering FD lists\n");
02606 #endif
02607     device_p = create_device_item(rsbac_root_dev);
02608     if (!device_p)
02609       {
02610         rsbac_printk(KERN_CRIT "rsbac_init_auth(): Could not add device!\n");
02611         return(-RSBAC_ECOULDNOTADDDEVICE);
02612       }
02613     if((err = auth_register_fd_lists(device_p,rsbac_root_dev)))
02614       {
02615         char tmp[RSBAC_MAXNAMELEN];
02616 
02617         rsbac_printk(KERN_WARNING
02618                "rsbac_init_auth(): File/Dir cap set registration failed for dev %02u:%02u, err %s!\n",
02619                RSBAC_MAJOR(rsbac_root_dev), RSBAC_MINOR(rsbac_root_dev), get_error_name(tmp,err));
02620       }
02621     /* wait for write access to device_list_head */
02622     rsbac_write_lock_irq(&device_list_head.lock, &dflags);
02623     device_p = add_device_item(device_p);
02624     /* device was added, allow access */
02625     rsbac_write_unlock_irq(&device_list_head.lock, &dflags);
02626     if (!device_p)
02627       {
02628         rsbac_printk(KERN_CRIT "rsbac_init_auth(): Could not add device!\n");
02629         return(-RSBAC_ECOULDNOTADDDEVICE);
02630       }
02631 
02632     #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS)
02633     tmp_entry_p = create_proc_entry("auth_devices",
02634                                     S_IFREG | S_IRUGO,
02635                                     proc_rsbac_root_p);
02636     if(tmp_entry_p)
02637       {
02638         tmp_entry_p->get_info = auth_devices_proc_info;
02639       }
02640     tmp_entry_p = create_proc_entry("stats_auth",
02641                                     S_IFREG | S_IRUGO,
02642                                     proc_rsbac_root_p);
02643     if(tmp_entry_p)
02644       {
02645         tmp_entry_p->get_info = stats_auth_proc_info;
02646       }
02647     tmp_entry_p = create_proc_entry("auth_caplist",
02648                                     S_IFREG | S_IRUGO,
02649                                     proc_rsbac_root_p);
02650     if(tmp_entry_p)
02651       {
02652         tmp_entry_p->get_info = auth_caplist_proc_info;
02653       }
02654     #endif
02655 
02656 #ifdef CONFIG_RSBAC_DEBUG
02657     if (rsbac_debug_ds_auth)
02658       rsbac_printk(KERN_DEBUG "rsbac_init_auth(): Ready.\n");
02659 #endif
02660     return(err);
02661   };

int rsbac_mount_auth kdev_t  kdev  ) 
 

Definition at line 2663 of file auth_data_structures.c.

References add_device_item(), auth_register_fd_lists(), clear_device_item(), create_device_item(), get_error_name(), rsbac_auth_device_list_head_t::lock, lookup_device(), rsbac_auth_device_list_item_t::mount_count, RSBAC_ECOULDNOTADDDEVICE, RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), RSBAC_MAXNAMELEN, and rsbac_printk().

Referenced by rsbac_mount().

02664   {
02665     int err = 0;
02666     struct rsbac_auth_device_list_item_t * device_p;
02667     struct rsbac_auth_device_list_item_t * new_device_p;
02668     u_long dflags;
02669 
02670     if (!rsbac_is_initialized())
02671       {
02672         rsbac_printk(KERN_WARNING "rsbac_mount_auth(): RSBAC not initialized\n");
02673         return(-RSBAC_ENOTINITIALIZED);
02674       }
02675 #ifdef CONFIG_RSBAC_DEBUG
02676     if (rsbac_debug_ds_auth)
02677       rsbac_printk(KERN_DEBUG "rsbac_mount_auth(): mounting device %02u:%02u\n",
02678                    RSBAC_MAJOR(kdev),RSBAC_MINOR(kdev));
02679 #endif
02680     /* wait for write access to device_list_head */
02681     rsbac_read_lock(&device_list_head.lock, &dflags);
02682     device_p = lookup_device(kdev);
02683     /* repeated mount? */
02684     if(device_p)
02685       {
02686         rsbac_printk(KERN_WARNING "rsbac_mount_auth: repeated mount %u of device %02u:%02u\n",
02687                device_p->mount_count, RSBAC_MAJOR(kdev), RSBAC_MINOR(kdev));
02688         device_p->mount_count++;
02689         rsbac_read_unlock(&device_list_head.lock, &dflags);
02690         return 0;
02691       }
02692     rsbac_read_unlock(&device_list_head.lock, &dflags);
02693 
02694     new_device_p = create_device_item(kdev);
02695     if(!new_device_p)
02696       return -RSBAC_ECOULDNOTADDDEVICE;
02697 
02698     /* register lists */
02699     if((err = auth_register_fd_lists(new_device_p, kdev)))
02700       {
02701         char tmp[RSBAC_MAXNAMELEN];
02702 
02703         rsbac_printk(KERN_WARNING
02704                "rsbac_mount_auth(): File/Dir ACL registration failed for dev %02u:%02u, err %s!\n",
02705                RSBAC_MAJOR(kdev), RSBAC_MINOR(kdev), get_error_name(tmp,err));
02706       }
02707 
02708     /* wait for read access to device_list_head */
02709     rsbac_read_lock(&device_list_head.lock, &dflags);
02710     /* make sure to only add, if this device item has not been added in the meantime */
02711     device_p = lookup_device(kdev);
02712     if(device_p)
02713       {
02714         rsbac_printk(KERN_WARNING
02715                "rsbac_mount_auth(): mount race for device %02u:%02u detected!\n",
02716                RSBAC_MAJOR(kdev), RSBAC_MINOR(kdev));
02717         device_p->mount_count++;
02718         rsbac_read_unlock(&device_list_head.lock, &dflags);
02719         clear_device_item(new_device_p);
02720       }
02721     else
02722       {
02723         rsbac_read_unlock(&device_list_head.lock, &dflags);
02724         rsbac_write_lock_irq(&device_list_head.lock, &dflags);
02725         device_p = add_device_item(new_device_p);
02726         rsbac_write_unlock_irq(&device_list_head.lock, &dflags);
02727         if(!device_p)
02728           {
02729             rsbac_printk(KERN_WARNING "rsbac_mount_auth: adding device %02u:%02u failed!\n",
02730                    RSBAC_MAJOR(kdev), RSBAC_MINOR(kdev));
02731             clear_device_item(new_device_p);
02732             err = -RSBAC_ECOULDNOTADDDEVICE;
02733           }
02734       }
02735     return(err);
02736   };

int rsbac_stats_auth void   ) 
 

Definition at line 2783 of file auth_data_structures.c.

References A_none, rsbac_attribute_value_t::dummy, rsbac_auth_device_list_item_t::handles, rsbac_auth_device_list_head_t::head, rsbac_auth_device_list_item_t::id, rsbac_auth_device_list_head_t::lock, rsbac_auth_device_list_item_t::next, R_GET_STATUS_DATA, rsbac_adf_request(), RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), rsbac_list_lol_all_subcount(), rsbac_list_lol_count(), rsbac_printk(), rsbac_target_id_t::scd, ST_rsbac, and T_SCD.

Referenced by rsbac_stats().

02784   {
02785     u_int                                     cap_set_count = 0;
02786     u_int                                     member_count = 0;
02787     u_long dflags;
02788     struct rsbac_auth_device_list_item_t   * device_p;
02789     int i;
02790   
02791     union rsbac_target_id_t       rsbac_target_id;
02792     union rsbac_attribute_value_t rsbac_attribute_value;
02793 
02794     if (!rsbac_is_initialized())
02795       {
02796         rsbac_printk(KERN_WARNING "rsbac_stats_auth(): RSBAC not initialized\n");
02797         return(-RSBAC_ENOTINITIALIZED);
02798       }
02799 #ifdef CONFIG_RSBAC_DEBUG
02800     if (rsbac_debug_aef_auth)
02801       rsbac_printk(KERN_DEBUG "rsbac_stats_auth(): calling ADF\n");
02802 #endif
02803     rsbac_target_id.scd = ST_rsbac;
02804     rsbac_attribute_value.dummy = 0;
02805     if (!rsbac_adf_request(R_GET_STATUS_DATA,
02806                            current->pid,
02807                            T_SCD,
02808                            rsbac_target_id,
02809                            A_none,
02810                            rsbac_attribute_value))
02811       {
02812         return -EPERM;
02813       }
02814 
02815     rsbac_printk(KERN_INFO "AUTH Status\n-----------\n");
02816 
02817     rsbac_printk(KERN_INFO "%lu process cap set items, sum of %lu members\n",
02818                    rsbac_list_lol_count(process_handle),
02819                    rsbac_list_lol_all_subcount(process_handle));
02820 
02821     /* protect device list */
02822     rsbac_read_lock(&device_list_head.lock, &dflags);
02823     device_p = device_list_head.head;
02824     while(device_p)
02825       {
02826         /* reset counters */
02827         cap_set_count = 0;
02828         member_count = 0;
02829         for(i=0 ; i < RSBAC_AUTH_NR_CAP_FD_LISTS; i++)
02830           {
02831             cap_set_count += rsbac_list_lol_count(device_p->handles[i]);
02832             member_count += rsbac_list_lol_all_subcount(device_p->handles[i]);
02833           }
02834         rsbac_printk(KERN_INFO "device %02u:%02u has %u file cap set items, sum of %u members\n",
02835                          RSBAC_MAJOR(device_p->id),
02836                          RSBAC_MINOR(device_p->id),
02837                          cap_set_count,member_count);
02838         device_p = device_p->next;
02839       }
02840     /* unprotect device list */
02841     rsbac_read_unlock(&device_list_head.lock, &dflags);
02842     return(0);
02843   };

int rsbac_umount_auth kdev_t  kdev  ) 
 

Definition at line 2740 of file auth_data_structures.c.

References rsbac_auth_device_list_head_t::lock, lookup_device(), rsbac_auth_device_list_item_t::mount_count, remove_device_item(), RSBAC_ENOTINITIALIZED, rsbac_is_initialized(), and rsbac_printk().

Referenced by rsbac_umount().

02741   {
02742     u_long flags;
02743     struct rsbac_auth_device_list_item_t * device_p;
02744 
02745     if (!rsbac_is_initialized())
02746       {
02747         rsbac_printk(KERN_WARNING "rsbac_umount(): RSBAC not initialized\n");
02748         return(-RSBAC_ENOTINITIALIZED);
02749       }
02750 
02751 #ifdef CONFIG_RSBAC_DEBUG
02752     if (rsbac_debug_ds_auth)
02753       rsbac_printk(KERN_DEBUG "rsbac_umount_auth(): umounting device %02u:%02u\n",
02754                    RSBAC_MAJOR(kdev), RSBAC_MINOR(kdev));
02755 #endif
02756     /* sync of attribute lists was done in rsbac_umount */
02757     /* wait for write access to device_list_head */
02758     rsbac_write_lock(&device_list_head.lock, &flags);
02759     /* OK, nobody else is working on it... */
02760     device_p = lookup_device(kdev);
02761     if(device_p)
02762       {
02763         if(device_p->mount_count == 1)
02764           remove_device_item(kdev);
02765         else
02766           {
02767             if(device_p->mount_count > 1)
02768               device_p->mount_count--;
02769             else
02770               rsbac_printk(KERN_WARNING "rsbac_mount_auth: device %02u:%02u has mount_count < 1!\n",
02771                            RSBAC_MAJOR(kdev), RSBAC_MINOR(kdev));
02772           }
02773       }
02774 
02775     /* allow access */
02776     rsbac_write_unlock(&device_list_head.lock, &flags);
02777     return(0);
02778   }


Generated on Sun May 21 14:30:57 2006 for RSBAC by  doxygen 1.4.2