mac_main.c File Reference

#include <linux/string.h>
#include <rsbac/aci.h>
#include <rsbac/mac.h>
#include <rsbac/adf_main.h>
#include <rsbac/error.h>
#include <rsbac/helpers.h>
#include <rsbac/getname.h>
#include <rsbac/debug.h>
#include <rsbac/rkmem.h>

Go to the source code of this file.

Functions

static enum rsbac_adf_req_ret_t mac_check_role (rsbac_uid_t owner, enum rsbac_system_role_t role)
static enum rsbac_adf_req_ret_t auto_write_attr (rsbac_pid_t pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_attribute_t t_level_attr, enum rsbac_attribute_t t_cat_attr, rsbac_boolean_t set_level)
static enum rsbac_adf_req_ret_t auto_write (rsbac_pid_t pid, enum rsbac_target_t target, union rsbac_target_id_t tid, rsbac_boolean_t set_level)
static enum rsbac_adf_req_ret_t auto_read_attr (rsbac_pid_t pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_attribute_t t_level_attr, enum rsbac_attribute_t t_cat_attr, rsbac_boolean_t set_level)
static enum rsbac_adf_req_ret_t auto_read (rsbac_pid_t pid, enum rsbac_target_t target, union rsbac_target_id_t tid, rsbac_boolean_t set_level)
static enum rsbac_adf_req_ret_t auto_read_write_attr (rsbac_pid_t pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_attribute_t t_level_attr, enum rsbac_attribute_t t_cat_attr, rsbac_boolean_t set_level)
static enum rsbac_adf_req_ret_t auto_read_write (rsbac_pid_t pid, enum rsbac_target_t target, union rsbac_target_id_t tid, rsbac_boolean_t set_level)
enum rsbac_adf_req_ret_t rsbac_adf_request_mac (enum rsbac_adf_request_t request, rsbac_pid_t caller_pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_attribute_t attr, union rsbac_attribute_value_t attr_val, rsbac_uid_t owner)
int rsbac_adf_set_attr_mac (enum rsbac_adf_request_t request, rsbac_pid_t caller_pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_target_t new_target, union rsbac_target_id_t new_tid, enum rsbac_attribute_t attr, union rsbac_attribute_value_t attr_val, rsbac_uid_t owner)


Function Documentation

static enum rsbac_adf_req_ret_t auto_read rsbac_pid_t  pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
rsbac_boolean_t  set_level
[static]
 

Definition at line 1530 of file mac_main.c.

References A_mac_categories, A_security_level, and auto_read_attr().

Referenced by rsbac_adf_request_mac(), and rsbac_adf_set_attr_mac().

01534   {
01535     return auto_read_attr(pid,
01536                           target,
01537                           tid,
01538                           A_security_level,
01539                           A_mac_categories,
01540                           set_level);
01541   }

static enum rsbac_adf_req_ret_t auto_read_attr rsbac_pid_t  pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_attribute_t  t_level_attr,
enum rsbac_attribute_t  t_cat_attr,
rsbac_boolean_t  set_level
[static]
 

Definition at line 928 of file mac_main.c.

References A_current_sec_level, A_mac_categories, A_mac_curr_categories, A_mac_file_flags, A_mac_process_flags, A_max_read_categories, A_max_read_open, A_min_write_categories, A_min_write_open, A_none, A_security_level, rsbac_attribute_value_t::current_sec_level, FALSE, get_target_name(), GRANTED, MAC, MAC_auto, rsbac_attribute_value_t::mac_categories, rsbac_attribute_value_t::mac_file_flags, MAC_override, rsbac_attribute_value_t::mac_process_flags, MAC_read_up, MAC_trusted, rsbac_attribute_value_t::max_read_open, NOT_GRANTED, rsbac_target_id_t::process, rsbac_get_attr, rsbac_kfree(), rsbac_kmalloc(), RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_set_attr, rsbac_attribute_value_t::security_level, T_DIR, T_FIFO, T_FILE, T_PROCESS, T_SYMLINK, TRUE, and u64tostrmac().

Referenced by auto_read(), rsbac_adf_request_mac(), and rsbac_adf_set_attr_mac().

00934   {
00935     rsbac_security_level_t        curr_level;
00936     rsbac_mac_category_vector_t   curr_categories;
00937     rsbac_security_level_t        target_sec_level;
00938     rsbac_mac_category_vector_t   target_categories;
00939     union rsbac_target_id_t       i_tid;
00940     union rsbac_attribute_value_t attr_val1;
00941     union rsbac_attribute_value_t attr_val2;
00942     rsbac_mac_process_flags_t     flags;
00943     rsbac_boolean_t                       mac_auto_used_level = FALSE;
00944     rsbac_boolean_t                       mac_auto_used_cat = FALSE;
00945     rsbac_boolean_t                       set_level_level = FALSE;
00946     rsbac_boolean_t                       set_level_cat = FALSE;
00947 
00948     /* first check for mac_override, which allows everything */
00949     i_tid.process = pid;
00950     if (rsbac_get_attr(MAC,
00951                        T_PROCESS,
00952                        i_tid,
00953                        A_mac_process_flags,
00954                        &attr_val1,
00955                        FALSE))
00956       { /* failed! */
00957         rsbac_ds_get_error("mac_auto_read", A_none);
00958         return(NOT_GRANTED);
00959       }
00960     flags = attr_val1.mac_process_flags;
00961     if(flags & MAC_override)
00962       return GRANTED;
00963 
00964     /* Get current security level */
00965     if (rsbac_get_attr(MAC,
00966                        T_PROCESS,
00967                        i_tid,
00968                        A_current_sec_level,
00969                        &attr_val1,
00970                        FALSE))
00971       { /* failed! */
00972         rsbac_ds_get_error("mac_auto_read", A_none);
00973         return(NOT_GRANTED);
00974       }
00975     curr_level = attr_val1.security_level;
00976     /* Get current categories */
00977     if (rsbac_get_attr(MAC,
00978                        T_PROCESS,
00979                        i_tid,
00980                        A_mac_curr_categories,
00981                        &attr_val1,
00982                        FALSE))
00983       { /* failed! */
00984         rsbac_ds_get_error("mac_auto_read", A_none);
00985         return(NOT_GRANTED);
00986       }
00987     curr_categories = attr_val1.mac_categories;
00988     /* Get target security level */
00989     if (rsbac_get_attr(MAC,
00990                        target,
00991                        tid,
00992                        t_level_attr,
00993                        &attr_val1,
00994                        TRUE))
00995       { /* failed! */
00996         rsbac_ds_get_error("mac_auto_read", A_none);
00997         return(NOT_GRANTED);
00998       }
00999     target_sec_level = attr_val1.security_level;
01000     /* Get target categories */
01001     if (rsbac_get_attr(MAC,
01002                        target,
01003                        tid,
01004                        t_cat_attr,
01005                        &attr_val1,
01006                        TRUE))
01007       { /* failed! */
01008         rsbac_ds_get_error("mac_auto_read", A_none);
01009         return(NOT_GRANTED);
01010       }
01011     target_categories = attr_val1.mac_categories;
01012 
01013     if(target_sec_level > curr_level)
01014       {
01015         if (rsbac_get_attr(MAC,
01016                            T_PROCESS,
01017                            i_tid,
01018                            A_security_level,
01019                            &attr_val1,
01020                            FALSE))
01021           { /* failed! */
01022             rsbac_ds_get_error("mac_auto_read", A_none);
01023             return(NOT_GRANTED);
01024           }
01025         if(attr_val1.security_level < target_sec_level)
01026           {
01027 #ifdef CONFIG_RSBAC_DEBUG
01028             if(rsbac_debug_adf_mac)
01029               {
01030                 rsbac_printk(KERN_DEBUG
01031                        "mac_auto_read(): pid %u/%.15s: security_level %u under target_sec_level %u, no override -> NOT_GRANTED!\n",
01032                        current->pid, current->comm,
01033                        attr_val1.security_level, target_sec_level);
01034               }
01035 #endif
01036             return(NOT_GRANTED);
01037           }
01038         /* curr_level < target_level <= max_level -> need mac_auto, read_up or trusted (with read option) */
01039         if(flags & MAC_auto)
01040           {
01041             /* check min_write boundary */
01042             if (rsbac_get_attr(MAC,
01043                                T_PROCESS,
01044                                i_tid,
01045                                A_min_write_open,
01046                                &attr_val1,
01047                                FALSE))
01048               { /* failed! */
01049                 rsbac_ds_get_error("mac_auto_read", A_none);
01050                 return(NOT_GRANTED);
01051               }
01052             if(attr_val1.security_level < target_sec_level)
01053               {
01054                 if(   !(flags & MAC_read_up)
01055 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01056                    && !(flags & MAC_trusted)
01057 #endif
01058                   )
01059                   {
01060                     /* Try mac_file_flags on the target, if FD object */
01061                     switch(target)
01062                       {
01063                         case T_FILE:
01064                         case T_DIR:
01065                         case T_FIFO:
01066                         case T_SYMLINK:
01067                           if (rsbac_get_attr(MAC,
01068                                              target,
01069                                              tid,
01070                                              A_mac_file_flags,
01071                                              &attr_val1,
01072                                              TRUE))
01073                             { /* failed! */
01074                               rsbac_ds_get_error("mac_auto_read", A_none);
01075                               return(NOT_GRANTED);
01076                             }
01077                           if(   (attr_val1.mac_file_flags & MAC_read_up)
01078 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01079                              || (attr_val1.mac_file_flags & MAC_trusted)
01080 #endif
01081                             )
01082                             {
01083                               break;
01084                             }
01085                           /* fall through */
01086 
01087                         default:
01088 #ifdef CONFIG_RSBAC_DEBUG
01089                           if(rsbac_debug_adf_mac)
01090                             {
01091                               rsbac_printk(KERN_DEBUG
01092                                      "mac_auto_read(): pid %u/%.15s: min_write_open %u under target_sec_level %u, no read_up or trusted -> NOT_GRANTED!\n",
01093                                      current->pid, current->comm,
01094                                      attr_val1.security_level, target_sec_level);
01095                             }
01096 #endif
01097                           return(NOT_GRANTED);
01098                       }
01099                   }
01100               }
01101             else
01102               {
01103                 mac_auto_used_level = TRUE;
01104                 set_level_level = TRUE;
01105               }
01106           }
01107         else
01108           {
01109             if(   !(flags & MAC_read_up)
01110 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01111                && !(flags & MAC_trusted)
01112 #endif
01113               )
01114               {
01115                 /* Try mac_file_flags on the target, if FD object */
01116                 switch(target)
01117                   {
01118                     case T_FILE:
01119                     case T_DIR:
01120                     case T_FIFO:
01121                     case T_SYMLINK:
01122                       if (rsbac_get_attr(MAC,
01123                                          target,
01124                                          tid,
01125                                          A_mac_file_flags,
01126                                          &attr_val1,
01127                                          TRUE))
01128                         { /* failed! */
01129                           rsbac_ds_get_error("mac_auto_read", A_none);
01130                           return(NOT_GRANTED);
01131                         }
01132                       if(   (attr_val1.mac_file_flags & MAC_read_up)
01133 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01134                          || (attr_val1.mac_file_flags & MAC_trusted)
01135 #endif
01136                         )
01137                         {
01138                           break;
01139                         }
01140                       /* fall through */
01141 
01142                     default:
01143 #ifdef CONFIG_RSBAC_DEBUG
01144                       if(rsbac_debug_adf_mac)
01145                         {
01146                           rsbac_printk(KERN_DEBUG
01147                                  "mac_auto_read(): pid %u/%.15s: current level %u under target_sec_level %u, no auto, read_up or trusted -> NOT_GRANTED!\n",
01148                                  current->pid, current->comm,
01149                                  curr_level, target_sec_level);
01150                         }
01151 #endif
01152                       return(NOT_GRANTED);
01153                   }
01154               }
01155           }
01156       }
01157     else
01158     if(target_sec_level < curr_level)
01159       {
01160         if(flags & MAC_auto)
01161           {
01162             mac_auto_used_level = TRUE;
01163           }
01164       }
01165     if((target_categories & curr_categories) != target_categories)
01166       {
01167         if (rsbac_get_attr(MAC,
01168                            T_PROCESS,
01169                            i_tid,
01170                            A_mac_categories,
01171                            &attr_val1,
01172                            FALSE))
01173           { /* failed! */
01174             rsbac_ds_get_error("mac_auto_read", A_none);
01175             return(NOT_GRANTED);
01176           }
01177         if((target_categories & attr_val1.mac_categories) != target_categories)
01178           {
01179 #ifdef CONFIG_RSBAC_DEBUG
01180             if(rsbac_debug_adf_mac)
01181               {
01182                 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01183 
01184                 if(tmp)
01185                   {
01186                     char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01187 
01188                     if(tmp2)
01189                       {
01190                         u64tostrmac(tmp, attr_val1.mac_categories);
01191                         u64tostrmac(tmp2, target_categories);
01192                         rsbac_printk(KERN_DEBUG
01193                                "mac_auto_write(): pid %u/%.15s: max_categories %s under target categories %s, no override -> NOT_GRANTED!\n",
01194                                current->pid, current->comm,
01195                                tmp,
01196                                tmp2);
01197                         rsbac_kfree(tmp2);
01198                       }
01199                     rsbac_kfree(tmp);
01200                   }
01201               }
01202 #endif
01203             return(NOT_GRANTED);
01204           }
01205         /* curr_categories < target_categories <= max_categories -> need mac_auto, read_up or trusted */
01206         if(flags & MAC_auto)
01207           {
01208             /* check min_write boundary */
01209             if (rsbac_get_attr(MAC,
01210                                T_PROCESS,
01211                                i_tid,
01212                                A_min_write_categories,
01213                                &attr_val1,
01214                                FALSE))
01215               { /* failed! */
01216                 rsbac_ds_get_error("mac_auto_read", A_none);
01217                 return(NOT_GRANTED);
01218               }
01219             if((target_categories & attr_val1.mac_categories) != target_categories)
01220               {
01221                 if(   !(flags & MAC_read_up)
01222 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01223                    && !(flags & MAC_trusted)
01224 #endif
01225                   )
01226                   {
01227                     /* Try mac_file_flags on the target, if FD object */
01228                     switch(target)
01229                       {
01230                         case T_FILE:
01231                         case T_DIR:
01232                         case T_FIFO:
01233                         case T_SYMLINK:
01234                           if (rsbac_get_attr(MAC,
01235                                              target,
01236                                              tid,
01237                                              A_mac_file_flags,
01238                                              &attr_val1,
01239                                              TRUE))
01240                             { /* failed! */
01241                               rsbac_ds_get_error("mac_auto_read", A_none);
01242                               return(NOT_GRANTED);
01243                             }
01244                           if(   (attr_val1.mac_file_flags & MAC_read_up)
01245 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01246                              || (attr_val1.mac_file_flags & MAC_trusted)
01247 #endif
01248                             )
01249                             {
01250                               break;
01251                             }
01252                           /* fall through */
01253 
01254                         default:
01255 #ifdef CONFIG_RSBAC_DEBUG
01256                           if(rsbac_debug_adf_mac)
01257                             {
01258                               char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01259 
01260                               if(tmp)
01261                                 {
01262                                   char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01263 
01264                                   if(tmp2)
01265                                     {
01266                                       u64tostrmac(tmp, attr_val1.mac_categories);
01267                                       u64tostrmac(tmp2, target_categories);
01268                                       rsbac_printk(KERN_DEBUG
01269                                              "mac_auto_write(): pid %u/%.15s: min_write_categories %s under target categories %s, no read_up or trusted with read option -> NOT_GRANTED!\n",
01270                                              current->pid, current->comm,
01271                                              tmp,
01272                                              tmp2);
01273                                       rsbac_kfree(tmp2);
01274                                     }
01275                                   rsbac_kfree(tmp);
01276                                 }
01277                             }
01278 #endif
01279                           return(NOT_GRANTED);
01280                       }
01281                   }
01282               }
01283             else
01284               {
01285                 mac_auto_used_cat = TRUE;
01286                 set_level_cat = TRUE;
01287               }
01288           }
01289         else
01290           {
01291             if(   !(flags & MAC_read_up)
01292 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01293                && !(flags & MAC_trusted)
01294 #endif
01295               )
01296               {
01297                 /* Try mac_file_flags on the target, if FD object */
01298                 switch(target)
01299                   {
01300                     case T_FILE:
01301                     case T_DIR:
01302                     case T_FIFO:
01303                     case T_SYMLINK:
01304                       if (rsbac_get_attr(MAC,
01305                                          target,
01306                                          tid,
01307                                          A_mac_file_flags,
01308                                          &attr_val1,
01309                                          TRUE))
01310                         { /* failed! */
01311                           rsbac_ds_get_error("mac_auto_read", A_none);
01312                           return(NOT_GRANTED);
01313                         }
01314                       if(   (attr_val1.mac_file_flags & MAC_read_up)
01315 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01316                          || (attr_val1.mac_file_flags & MAC_trusted)
01317 #endif
01318                         )
01319                         {
01320                           break;
01321                         }
01322                       /* fall through */
01323 
01324                     default:
01325 #ifdef CONFIG_RSBAC_DEBUG
01326                       if(rsbac_debug_adf_mac)
01327                         {
01328                           char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01329 
01330                           if(tmp)
01331                             {
01332                               char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01333 
01334                               if(tmp2)
01335                                 {
01336                                   u64tostrmac(tmp, curr_categories);
01337                                   u64tostrmac(tmp2, target_categories);
01338                                   rsbac_printk(KERN_DEBUG
01339                                          "mac_auto_write(): pid %u/%.15s: curr_categories %s under target categories %s, no auto, read_up or trusted with read option -> NOT_GRANTED!\n",
01340                                          current->pid, current->comm,
01341                                          tmp,
01342                                          tmp2);
01343                                   rsbac_kfree(tmp2);
01344                                 }
01345                               rsbac_kfree(tmp);
01346                             }
01347                         }
01348 #endif
01349                       return(NOT_GRANTED);
01350                   }
01351               }
01352           }
01353       }
01354     else
01355     if((target_categories & curr_categories) != curr_categories)
01356       {
01357         if(flags & MAC_auto)
01358           {
01359             mac_auto_used_level = TRUE;
01360           }
01361       }
01362 
01363     /* grant area */
01364 
01365     /* adjust current_sec_level and max_read_level, */
01366     /* if set_level is true and mac_auto has been used*/
01367     if(set_level && mac_auto_used_level)
01368       {
01369         i_tid.process = pid;
01370         attr_val1.current_sec_level = target_sec_level;
01371         if(set_level_level)
01372           {
01373 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
01374             char * target_type_name;
01375             char * target_id_name;
01376 
01377             target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01378             if(target_type_name)
01379               {
01380                 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
01381                 target_id_name
01382                   = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
01383                   /* max. path name len + some extra */
01384                 #else
01385                 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
01386                   /* max. file name len + some extra */
01387                 #endif
01388                 if(target_id_name)
01389                   {
01390                     get_target_name(target_type_name, target, target_id_name, tid);
01391 
01392                     rsbac_printk(KERN_INFO
01393                            "mac_auto_read(): Changing process %u (%.15s, owner %u) current level from %u to %u for %s %s\n",
01394                            pid,
01395                            current->comm,
01396                            current->uid,
01397                            curr_level,
01398                            target_sec_level,
01399                            target_type_name,
01400                            target_id_name);
01401                     rsbac_kfree(target_id_name);
01402                   }
01403                 rsbac_kfree(target_type_name);
01404               }
01405 #endif
01406             if(rsbac_set_attr(MAC,
01407                               T_PROCESS,
01408                               i_tid,
01409                               A_current_sec_level,
01410                               attr_val1))
01411               { /* failed! */
01412                 rsbac_ds_set_error("mac_auto_read", A_none);
01413                 return(NOT_GRANTED);
01414               }
01415           }
01416         if (rsbac_get_attr(MAC,
01417                            T_PROCESS,
01418                            i_tid,
01419                            A_max_read_open,
01420                            &attr_val2,
01421                            TRUE))
01422           { /* failed! */
01423             rsbac_ds_get_error("mac_auto_read", A_none);
01424             return(NOT_GRANTED);
01425           }
01426         if(attr_val1.max_read_open > attr_val2.max_read_open)
01427           {
01428             if (rsbac_set_attr(MAC,
01429                                T_PROCESS,
01430                                i_tid,
01431                                A_max_read_open,
01432                                attr_val1))
01433               { /* failed! */
01434                 rsbac_ds_set_error("mac_auto_read", A_none);
01435                 return(NOT_GRANTED);
01436               }
01437           }
01438       }
01439     /* adjust current_categories and max_read_categories, */
01440     /* if set_level is true and mac_auto has been used*/
01441     if(set_level && mac_auto_used_cat)
01442       {
01443         i_tid.process = pid;
01444         attr_val1.mac_categories = target_categories;
01445         if(set_level_cat)
01446           {
01447 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
01448             char * target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01449             if(target_type_name)
01450               {
01451                 char * target_id_name;
01452 
01453                 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
01454                 target_id_name
01455                   = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
01456                   /* max. path name len + some extra */
01457                 #else
01458                 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
01459                   /* max. file name len + some extra */
01460                 #endif
01461                 if(target_id_name)
01462                   {
01463                     char * tmp1 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01464                     if(tmp1)
01465                       {
01466                         char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01467                         if(tmp2)
01468                           {
01469                             get_target_name(target_type_name, target, target_id_name, tid);
01470 
01471                             rsbac_printk(KERN_INFO
01472                                    "mac_auto_read(): Changing process %u (15%s, owner %u) current categories from %s to %s for %s %s\n",
01473                                    pid,
01474                                    current->comm,
01475                                    current->uid,
01476                                    u64tostrmac(tmp1, curr_categories),
01477                                    u64tostrmac(tmp2, target_categories),
01478                                    target_type_name,
01479                                    target_id_name);
01480                             rsbac_kfree(tmp2);
01481                           }
01482                         rsbac_kfree(tmp1);
01483                       }
01484                     rsbac_kfree(target_id_name);
01485                   }
01486                 rsbac_kfree(target_type_name);
01487               }
01488 #endif
01489             if(rsbac_set_attr(MAC,
01490                               T_PROCESS,
01491                               i_tid,
01492                               A_mac_curr_categories,
01493                               attr_val1))
01494               { /* failed! */
01495                 rsbac_ds_set_error("mac_auto_read", A_none);
01496                 return(NOT_GRANTED);
01497               }
01498           }
01499         if (rsbac_get_attr(MAC,
01500                            T_PROCESS,
01501                            i_tid,
01502                            A_max_read_categories,
01503                            &attr_val2,
01504                            TRUE))
01505           { /* failed! */
01506             rsbac_ds_get_error("mac_auto_read", A_none);
01507             return(NOT_GRANTED);
01508           }
01509         if((attr_val1.mac_categories & attr_val2.mac_categories)
01510            != attr_val1.mac_categories
01511           )
01512           {
01513             if (rsbac_set_attr(MAC,
01514                                T_PROCESS,
01515                                i_tid,
01516                                A_max_read_categories,
01517                                attr_val1))
01518               { /* failed! */
01519                 rsbac_ds_set_error("mac_auto_read", A_none);
01520                 return(NOT_GRANTED);
01521               }
01522           }
01523       }
01524 
01525     /* Everything done, so return */
01526     return(GRANTED);
01527   }

static enum rsbac_adf_req_ret_t auto_read_write rsbac_pid_t  pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
rsbac_boolean_t  set_level
[static]
 

Definition at line 2581 of file mac_main.c.

References A_mac_categories, A_security_level, and auto_read_write_attr().

Referenced by rsbac_adf_request_mac(), and rsbac_adf_set_attr_mac().

02585   {
02586     return auto_read_write_attr(pid,
02587                                 target,
02588                                 tid,
02589                                 A_security_level,
02590                                 A_mac_categories,
02591                                 set_level);
02592   }

static enum rsbac_adf_req_ret_t auto_read_write_attr rsbac_pid_t  pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_attribute_t  t_level_attr,
enum rsbac_attribute_t  t_cat_attr,
rsbac_boolean_t  set_level
[static]
 

Definition at line 1548 of file mac_main.c.

References A_current_sec_level, A_mac_categories, A_mac_curr_categories, A_mac_file_flags, A_mac_min_categories, A_mac_process_flags, A_max_read_categories, A_max_read_open, A_min_security_level, A_min_write_categories, A_min_write_open, A_none, A_security_level, rsbac_attribute_value_t::current_sec_level, FALSE, get_target_name(), GRANTED, MAC, MAC_auto, rsbac_attribute_value_t::mac_categories, rsbac_attribute_value_t::mac_file_flags, MAC_override, rsbac_attribute_value_t::mac_process_flags, MAC_read_up, MAC_trusted, MAC_write_down, MAC_write_up, rsbac_attribute_value_t::max_read_open, rsbac_attribute_value_t::min_write_open, NOT_GRANTED, rsbac_target_id_t::process, rsbac_get_attr, rsbac_kfree(), rsbac_kmalloc(), RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_set_attr, rsbac_attribute_value_t::security_level, T_DIR, T_FIFO, T_FILE, T_PROCESS, T_SYMLINK, TRUE, and u64tostrmac().

Referenced by auto_read_write(), rsbac_adf_request_mac(), and rsbac_adf_set_attr_mac().

01554   {
01555     rsbac_security_level_t        curr_level;
01556     rsbac_mac_category_vector_t   curr_categories;
01557     rsbac_security_level_t        target_sec_level;
01558     rsbac_mac_category_vector_t   target_categories;
01559     union rsbac_target_id_t       i_tid;
01560     union rsbac_attribute_value_t attr_val1;
01561     union rsbac_attribute_value_t attr_val2;
01562     rsbac_mac_process_flags_t     flags;
01563     rsbac_boolean_t                       mac_auto_used_level = FALSE;
01564     rsbac_boolean_t                       mac_auto_used_cat = FALSE;
01565     rsbac_boolean_t                       raise_object_level = FALSE;
01566     rsbac_boolean_t                       raise_object_cat = FALSE;
01567 
01568     /* first check for mac_override, which allows everything */
01569     i_tid.process = pid;
01570     if (rsbac_get_attr(MAC,
01571                        T_PROCESS,
01572                        i_tid,
01573                        A_mac_process_flags,
01574                        &attr_val1,
01575                        FALSE))
01576       { /* failed! */
01577         rsbac_ds_get_error("mac_auto_read_write", A_none);
01578         return(NOT_GRANTED);
01579       }
01580     flags = attr_val1.mac_process_flags;
01581     if(flags & MAC_override)
01582       return GRANTED;
01583 
01584     /* Get current security level */
01585     if (rsbac_get_attr(MAC,
01586                        T_PROCESS,
01587                        i_tid,
01588                        A_current_sec_level,
01589                        &attr_val1,
01590                        FALSE))
01591       { /* failed! */
01592         rsbac_ds_get_error("mac_auto_read_write", A_none);
01593         return(NOT_GRANTED);
01594       }
01595     curr_level = attr_val1.security_level;
01596     /* Get current categories */
01597     if (rsbac_get_attr(MAC,
01598                        T_PROCESS,
01599                        i_tid,
01600                        A_mac_curr_categories,
01601                        &attr_val1,
01602                        FALSE))
01603       { /* failed! */
01604         rsbac_ds_get_error("mac_auto_read_write", A_none);
01605         return(NOT_GRANTED);
01606       }
01607     curr_categories = attr_val1.mac_categories;
01608     /* Get target security level */
01609     if (rsbac_get_attr(MAC,
01610                        target,
01611                        tid,
01612                        t_level_attr,
01613                        &attr_val1,
01614                        TRUE))
01615       { /* failed! */
01616         rsbac_ds_get_error("mac_auto_read_write", A_none);
01617         return(NOT_GRANTED);
01618       }
01619     target_sec_level = attr_val1.security_level;
01620     /* Get target categories */
01621     if (rsbac_get_attr(MAC,
01622                        target,
01623                        tid,
01624                        t_cat_attr,
01625                        &attr_val1,
01626                        TRUE))
01627       { /* failed! */
01628         rsbac_ds_get_error("mac_auto_read_write", A_none);
01629         return(NOT_GRANTED);
01630       }
01631     target_categories = attr_val1.mac_categories;
01632 
01633     if(target_sec_level > curr_level)
01634       {
01635         if (rsbac_get_attr(MAC,
01636                            T_PROCESS,
01637                            i_tid,
01638                            A_security_level,
01639                            &attr_val1,
01640                            FALSE))
01641           { /* failed! */
01642             rsbac_ds_get_error("mac_auto_read_write", A_none);
01643             return(NOT_GRANTED);
01644           }
01645         if(attr_val1.security_level < target_sec_level)
01646           {
01647 #ifdef CONFIG_RSBAC_DEBUG
01648             if(rsbac_debug_adf_mac)
01649               {
01650                 rsbac_printk(KERN_DEBUG
01651                        "mac_auto_read_write(): pid %u/%.15s: security_level %u under target_sec_level %u, no override -> NOT_GRANTED!\n",
01652                        current->pid, current->comm,
01653                        attr_val1.security_level, target_sec_level);
01654               }
01655 #endif
01656             return(NOT_GRANTED);
01657           }
01658         /* curr_level < target_level <= max_level */
01659         /* -> need mac_auto, (write_up && read_up) or trusted (with read option) */
01660         if(flags & MAC_auto)
01661           {
01662             /* check min_write boundary */
01663             if (rsbac_get_attr(MAC,
01664                                T_PROCESS,
01665                                i_tid,
01666                                A_min_write_open,
01667                                &attr_val1,
01668                                FALSE))
01669               { /* failed! */
01670                 rsbac_ds_get_error("mac_auto_read_write", A_none);
01671                 return(NOT_GRANTED);
01672               }
01673             if(attr_val1.security_level < target_sec_level)
01674               {
01675                 if(   !((flags & MAC_write_up) && (flags & MAC_read_up))
01676 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01677                    && !(flags & MAC_trusted)
01678 #endif
01679                   )
01680                   {
01681                     /* Try mac_file_flags on the target, if FD object */
01682                     switch(target)
01683                       {
01684                         case T_FILE:
01685                         case T_DIR:
01686                         case T_FIFO:
01687                         case T_SYMLINK:
01688                           if (rsbac_get_attr(MAC,
01689                                              target,
01690                                              tid,
01691                                              A_mac_file_flags,
01692                                              &attr_val1,
01693                                              TRUE))
01694                             { /* failed! */
01695                               rsbac_ds_get_error("mac_auto_read_write", A_none);
01696                               return(NOT_GRANTED);
01697                             }
01698                           if(   (   (attr_val1.mac_file_flags & MAC_write_up)
01699                                  && (attr_val1.mac_file_flags & MAC_read_up)
01700                                 )
01701 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01702                              || (flags & MAC_trusted)
01703 #endif
01704                             )
01705                             {
01706                               break;
01707                             }
01708                           /* fall through */
01709 
01710                         default:
01711 #ifdef CONFIG_RSBAC_DEBUG
01712                           if(rsbac_debug_adf_mac)
01713                             {
01714                               rsbac_printk(KERN_DEBUG
01715                                      "mac_auto_read_write(): pid %u/%.15s: min_write_open %u under target_sec_level %u, no read_up or trusted -> NOT_GRANTED!\n",
01716                                      current->pid, current->comm,
01717                                      attr_val1.security_level, target_sec_level);
01718                             }
01719 #endif
01720                           return(NOT_GRANTED);
01721                       }
01722                   }
01723               }
01724             else
01725               mac_auto_used_level = TRUE;
01726           }
01727         else
01728           {
01729             if(   !((flags & MAC_write_up) && (flags & MAC_read_up))
01730 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01731                && !(flags & MAC_trusted)
01732 #endif
01733               )
01734               {
01735                 /* Try mac_file_flags on the target, if FD object */
01736                 switch(target)
01737                   {
01738                     case T_FILE:
01739                     case T_DIR:
01740                     case T_FIFO:
01741                     case T_SYMLINK:
01742                       if (rsbac_get_attr(MAC,
01743                                          target,
01744                                          tid,
01745                                          A_mac_file_flags,
01746                                          &attr_val1,
01747                                          TRUE))
01748                         { /* failed! */
01749                           rsbac_ds_get_error("mac_auto_read_write", A_none);
01750                           return(NOT_GRANTED);
01751                         }
01752                       if(   (   (attr_val1.mac_file_flags & MAC_write_up)
01753                              && (attr_val1.mac_file_flags & MAC_read_up)
01754                             )
01755 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01756                          || (flags & MAC_trusted)
01757 #endif
01758                         )
01759                         {
01760                           break;
01761                         }
01762                       /* fall through */
01763 
01764                     default:
01765 #ifdef CONFIG_RSBAC_DEBUG
01766                       if(rsbac_debug_adf_mac)
01767                         {
01768                           rsbac_printk(KERN_DEBUG
01769                                  "mac_auto_read_write(): pid %u/%.15s: current level %u under target_sec_level %u, no auto, (write_up && read_up) or trusted -> NOT_GRANTED!\n",
01770                                  current->pid, current->comm,
01771                                  curr_level, target_sec_level);
01772                         }
01773 #endif
01774                       return(NOT_GRANTED);
01775                   }
01776               }
01777           }
01778       }
01779     else
01780     if(target_sec_level < curr_level)
01781       {
01782         if (rsbac_get_attr(MAC,
01783                            T_PROCESS,
01784                            i_tid,
01785                            A_min_security_level,
01786                            &attr_val1,
01787                            FALSE))
01788           { /* failed! */
01789             rsbac_ds_get_error("mac_auto_read_write", A_none);
01790             return(NOT_GRANTED);
01791           }
01792         if(attr_val1.security_level > target_sec_level)
01793           {
01794 #ifdef CONFIG_RSBAC_DEBUG
01795             if(rsbac_debug_adf_mac)
01796               {
01797                 rsbac_printk(KERN_DEBUG
01798                        "mac_auto_read_write(): pid %u/%.15s: min_security_level %u over target_sec_level %u, no override -> NOT_GRANTED!\n",
01799                        current->pid, current->comm,
01800                        attr_val1.security_level, target_sec_level);
01801               }
01802 #endif
01803             return(NOT_GRANTED);
01804           }
01805         /* min_level <= target_level < curr_level -> need mac_auto, write_down or trusted */
01806         if(flags & MAC_auto)
01807           {
01808             /* check max_read boundary */
01809             if (rsbac_get_attr(MAC,
01810                                T_PROCESS,
01811                                i_tid,
01812                                A_max_read_open,
01813                                &attr_val1,
01814                                FALSE))
01815               { /* failed! */
01816                 rsbac_ds_get_error("mac_auto_read_write", A_none);
01817                 return(NOT_GRANTED);
01818               }
01819             if(attr_val1.security_level > target_sec_level)
01820               {
01821                 if(   !(flags & MAC_write_down)
01822                    && !(flags & MAC_trusted)
01823                   )
01824                   {
01825                     /* Try mac_file_flags on the target, if FD object */
01826                     switch(target)
01827                       {
01828                         case T_FILE:
01829                         case T_DIR:
01830                         case T_FIFO:
01831                         case T_SYMLINK:
01832                           if (rsbac_get_attr(MAC,
01833                                              target,
01834                                              tid,
01835                                              A_mac_file_flags,
01836                                              &attr_val1,
01837                                              TRUE))
01838                             { /* failed! */
01839                               rsbac_ds_get_error("mac_auto_read_write", A_none);
01840                               return(NOT_GRANTED);
01841                             }
01842                           if(   (attr_val1.mac_file_flags & MAC_write_down)
01843                              || (attr_val1.mac_file_flags & MAC_trusted)
01844                             )
01845                             {
01846                               if(attr_val1.mac_file_flags & MAC_auto)
01847                                 {
01848                                   raise_object_level = TRUE;
01849                                 }
01850                               break;
01851                             }
01852                           /* fall through */
01853 
01854                         default:
01855 #ifdef CONFIG_RSBAC_DEBUG
01856                           if(rsbac_debug_adf_mac)
01857                             {
01858                               rsbac_printk(KERN_DEBUG
01859                                      "mac_auto_read_write(): pid %u/%.15s: max_read_open %u over target_sec_level %u, no write_down or trusted -> NOT_GRANTED!\n",
01860                                      current->pid, current->comm,
01861                                      attr_val1.security_level, target_sec_level);
01862                             }
01863 #endif
01864                           return(NOT_GRANTED);
01865                       }
01866                   }
01867               }
01868             else
01869               mac_auto_used_level = TRUE;
01870           }
01871         else
01872           {
01873             if(   !(flags & MAC_write_down)
01874                && !(flags & MAC_trusted)
01875               )
01876               {
01877                 /* Try mac_file_flags on the target, if FD object */
01878                 switch(target)
01879                   {
01880                     case T_FILE:
01881                     case T_DIR:
01882                     case T_FIFO:
01883                     case T_SYMLINK:
01884                       if (rsbac_get_attr(MAC,
01885                                          target,
01886                                          tid,
01887                                          A_mac_file_flags,
01888                                          &attr_val1,
01889                                          TRUE))
01890                         { /* failed! */
01891                           rsbac_ds_get_error("mac_auto_read_write", A_none);
01892                           return(NOT_GRANTED);
01893                         }
01894                       if(   (attr_val1.mac_file_flags & MAC_write_down)
01895                          || (attr_val1.mac_file_flags & MAC_trusted)
01896                         )
01897                         {
01898                           if(attr_val1.mac_file_flags & MAC_auto)
01899                             {
01900                               raise_object_level = TRUE;
01901                             }
01902                           break;
01903                         }
01904                       /* fall through */
01905 
01906                     default:
01907 #ifdef CONFIG_RSBAC_DEBUG
01908                       if(rsbac_debug_adf_mac)
01909                         {
01910                           rsbac_printk(KERN_DEBUG
01911                                  "mac_auto_read_write(): pid %u/%.15s: current security_level %u over target_sec_level %u, no auto, write_down or trusted -> NOT_GRANTED!\n",
01912                                  current->pid, current->comm,
01913                                  curr_level, target_sec_level);
01914                         }
01915 #endif
01916                       return(NOT_GRANTED);
01917                   }
01918               }
01919           }
01920       }
01921     if((target_categories & curr_categories) != target_categories)
01922       {
01923         if (rsbac_get_attr(MAC,
01924                            T_PROCESS,
01925                            i_tid,
01926                            A_mac_categories,
01927                            &attr_val1,
01928                            FALSE))
01929           { /* failed! */
01930             rsbac_ds_get_error("mac_auto_read_write", A_none);
01931             return(NOT_GRANTED);
01932           }
01933         if((target_categories & attr_val1.mac_categories) != target_categories)
01934           {
01935 #ifdef CONFIG_RSBAC_DEBUG
01936             if(rsbac_debug_adf_mac)
01937               {
01938                 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01939 
01940                 if(tmp)
01941                   {
01942                     char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01943 
01944                     if(tmp2)
01945                       {
01946                         u64tostrmac(tmp, attr_val1.mac_categories);
01947                         u64tostrmac(tmp2, target_categories);
01948                         rsbac_printk(KERN_DEBUG
01949                                "mac_auto_read_write(): pid %u/%.15s: max_categories %s under target categories %s, no override -> NOT_GRANTED!\n",
01950                                current->pid, current->comm,
01951                                tmp,
01952                                tmp2);
01953                         rsbac_kfree(tmp2);
01954                       }
01955                     rsbac_kfree(tmp);
01956                   }
01957               }
01958 #endif
01959             return(NOT_GRANTED);
01960           }
01961         /* curr_categories < target_categories <= max_categories */
01962         /* -> need mac_auto, (read_up && write_up) or trusted (with read option) */
01963         if(flags & MAC_auto)
01964           {
01965             /* check min_write boundary */
01966             if (rsbac_get_attr(MAC,
01967                                T_PROCESS,
01968                                i_tid,
01969                                A_min_write_categories,
01970                                &attr_val1,
01971                                FALSE))
01972               { /* failed! */
01973                 rsbac_ds_get_error("mac_auto_read_write", A_none);
01974                 return(NOT_GRANTED);
01975               }
01976             if((target_categories & attr_val1.mac_categories) != target_categories)
01977               {
01978                 if(   !((flags & MAC_write_up) && (flags & MAC_read_up))
01979 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01980                    && !(flags & MAC_trusted)
01981 #endif
01982                   )
01983                   {
01984                     /* Try mac_file_flags on the target, if FD object */
01985                     switch(target)
01986                       {
01987                         case T_FILE:
01988                         case T_DIR:
01989                         case T_FIFO:
01990                         case T_SYMLINK:
01991                           if (rsbac_get_attr(MAC,
01992                                              target,
01993                                              tid,
01994                                              A_mac_file_flags,
01995                                              &attr_val1,
01996                                              TRUE))
01997                             { /* failed! */
01998                               rsbac_ds_get_error("mac_auto_read_write", A_none);
01999                               return(NOT_GRANTED);
02000                             }
02001                           if(   (   (attr_val1.mac_file_flags & MAC_write_up)
02002                                  && (attr_val1.mac_file_flags & MAC_read_up)
02003                                 )
02004 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
02005                              || (flags & MAC_trusted)
02006 #endif
02007                             )
02008                             {
02009                               break;
02010                             }
02011                           /* fall through */
02012 
02013                         default:
02014 #ifdef CONFIG_RSBAC_DEBUG
02015                           if(rsbac_debug_adf_mac)
02016                             {
02017                               char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02018 
02019                               if(tmp)
02020                                 {
02021                                   char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02022 
02023                                   if(tmp2)
02024                                     {
02025                                       u64tostrmac(tmp, attr_val1.mac_categories);
02026                                       u64tostrmac(tmp2, target_categories);
02027                                       rsbac_printk(KERN_DEBUG
02028                                              "mac_auto_read_write(): pid %u/%.15s: min_write_categories %s under target categories %s, no (read_up and write_up) or trusted with read option -> NOT_GRANTED!\n",
02029                                              current->pid, current->comm,
02030                                              tmp,
02031                                              tmp2);
02032                                       rsbac_kfree(tmp2);
02033                                     }
02034                                   rsbac_kfree(tmp);
02035                                 }
02036                             }
02037 #endif
02038                           return(NOT_GRANTED);
02039                       }
02040                   }
02041               }
02042             else
02043               mac_auto_used_cat = TRUE;
02044           }
02045         else
02046           {
02047             if(   !((flags & MAC_write_up) && (flags & MAC_read_up))
02048 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
02049                && !(flags & MAC_trusted)
02050 #endif
02051               )
02052               {
02053                 /* Try mac_file_flags on the target, if FD object */
02054                 switch(target)
02055                   {
02056                     case T_FILE:
02057                     case T_DIR:
02058                     case T_FIFO:
02059                     case T_SYMLINK:
02060                       if (rsbac_get_attr(MAC,
02061                                          target,
02062                                          tid,
02063                                          A_mac_file_flags,
02064                                          &attr_val1,
02065                                          TRUE))
02066                         { /* failed! */
02067                           rsbac_ds_get_error("mac_auto_read_write", A_none);
02068                           return(NOT_GRANTED);
02069                         }
02070                       if(   (   (attr_val1.mac_file_flags & MAC_write_up)
02071                              && (attr_val1.mac_file_flags & MAC_read_up)
02072                             )
02073 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
02074                          || (flags & MAC_trusted)
02075 #endif
02076                         )
02077                         {
02078                           break;
02079                         }
02080                       /* fall through */
02081 
02082                     default:
02083 #ifdef CONFIG_RSBAC_DEBUG
02084                       if(rsbac_debug_adf_mac)
02085                         {
02086                           char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02087 
02088                           if(tmp)
02089                             {
02090                               char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02091 
02092                               if(tmp2)
02093                                 {
02094                                   u64tostrmac(tmp, curr_categories);
02095                                   u64tostrmac(tmp2, target_categories);
02096                                   rsbac_printk(KERN_DEBUG
02097                                          "mac_auto_read_write(): pid %u/%.15s: curr_categories %s under target categories %s, no auto, (read_up and write_up) or trusted -> NOT_GRANTED!\n",
02098                                          current->pid, current->comm,
02099                                          tmp,
02100                                          tmp2);
02101                                   rsbac_kfree(tmp2);
02102                                 }
02103                               rsbac_kfree(tmp);
02104                             }
02105                         }
02106 #endif
02107                       return(NOT_GRANTED);
02108                   }
02109               }
02110           }
02111       }
02112     else
02113     if((target_categories & curr_categories) != curr_categories)
02114       {
02115         if (rsbac_get_attr(MAC,
02116                            T_PROCESS,
02117                            i_tid,
02118                            A_mac_min_categories,
02119                            &attr_val1,
02120                            FALSE))
02121           { /* failed! */
02122             rsbac_ds_get_error("mac_auto_read_write", A_none);
02123             return(NOT_GRANTED);
02124           }
02125         if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
02126           {
02127 #ifdef CONFIG_RSBAC_DEBUG
02128             if(rsbac_debug_adf_mac)
02129               {
02130                 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02131 
02132                 if(tmp)
02133                   {
02134                     char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02135 
02136                     if(tmp2)
02137                       {
02138                         u64tostrmac(tmp, attr_val1.mac_categories);
02139                         u64tostrmac(tmp2, target_categories);
02140                         rsbac_printk(KERN_DEBUG
02141                                "mac_auto_read_write(): pid %u/%.15s: min_categories %s over target categories %s, no override -> NOT_GRANTED!\n",
02142                                current->pid, current->comm,
02143                                tmp,
02144                                tmp2);
02145                         rsbac_kfree(tmp2);
02146                       }
02147                     rsbac_kfree(tmp);
02148                   }
02149               }
02150 #endif
02151             return(NOT_GRANTED);
02152           }
02153         /* min_level <= target_level < curr_level -> need mac_auto, write_down or trusted */
02154         if(flags & MAC_auto)
02155           {
02156             /* check max_read boundary */
02157             if (rsbac_get_attr(MAC,
02158                                T_PROCESS,
02159                                i_tid,
02160                                A_max_read_categories,
02161                                &attr_val1,
02162                                FALSE))
02163               { /* failed! */
02164                 rsbac_ds_get_error("mac_auto_read_write", A_none);
02165                 return(NOT_GRANTED);
02166               }
02167             if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
02168               {
02169                 if(   !(flags & MAC_write_down)
02170                    && !(flags & MAC_trusted)
02171                   )
02172                   {
02173                     /* Try mac_file_flags on the target, if FD object */
02174                     switch(target)
02175                       {
02176                         case T_FILE:
02177                         case T_DIR:
02178                         case T_FIFO:
02179                         case T_SYMLINK:
02180                           if (rsbac_get_attr(MAC,
02181                                              target,
02182                                              tid,
02183                                              A_mac_file_flags,
02184                                              &attr_val1,
02185                                              TRUE))
02186                             { /* failed! */
02187                               rsbac_ds_get_error("mac_auto_read_write", A_none);
02188                               return(NOT_GRANTED);
02189                             }
02190                           if(   (attr_val1.mac_file_flags & MAC_write_down)
02191                              || (attr_val1.mac_file_flags & MAC_trusted)
02192                             )
02193                             {
02194                               if(attr_val1.mac_file_flags & MAC_auto)
02195                                 {
02196                                   raise_object_cat = TRUE;
02197                                 }
02198                               break;
02199                             }
02200                           /* fall through */
02201 
02202                         default:
02203 #ifdef CONFIG_RSBAC_DEBUG
02204                           if(rsbac_debug_adf_mac)
02205                             {
02206                               char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02207 
02208                               if(tmp)
02209                                 {
02210                                   char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02211 
02212                                   if(tmp2)
02213                                     {
02214                                       u64tostrmac(tmp, attr_val1.mac_categories);
02215                                       u64tostrmac(tmp2, target_categories);
02216                                       rsbac_printk(KERN_DEBUG
02217                                              "mac_auto_read_write(): pid %u/%.15s: max_read_categories %s over target categories %s, no write_down or trusted -> NOT_GRANTED!\n",
02218                                              current->pid, current->comm,
02219                                              tmp,
02220                                              tmp2);
02221                                       rsbac_kfree(tmp2);
02222                                     }
02223                                   rsbac_kfree(tmp);
02224                                 }
02225                             }
02226 #endif
02227                           return(NOT_GRANTED);
02228                       }
02229                   }
02230               }
02231             else
02232               mac_auto_used_cat = TRUE;
02233           }
02234         else
02235           {
02236             if(   !(flags & MAC_write_down)
02237                && !(flags & MAC_trusted)
02238               )
02239               {
02240                 /* Try mac_file_flags on the target, if FD object */
02241                 switch(target)
02242                   {
02243                     case T_FILE:
02244                     case T_DIR:
02245                     case T_FIFO:
02246                     case T_SYMLINK:
02247                       if (rsbac_get_attr(MAC,
02248                                          target,
02249                                          tid,
02250                                          A_mac_file_flags,
02251                                          &attr_val1,
02252                                          TRUE))
02253                         { /* failed! */
02254                           rsbac_ds_get_error("mac_auto_read_write", A_none);
02255                           return(NOT_GRANTED);
02256                         }
02257                       if(   (attr_val1.mac_file_flags & MAC_write_down)
02258                          || (attr_val1.mac_file_flags & MAC_trusted)
02259                         )
02260                         {
02261                           if(attr_val1.mac_file_flags & MAC_auto)
02262                             {
02263                               raise_object_cat = TRUE;
02264                             }
02265                           break;
02266                         }
02267                       /* fall through */
02268 
02269                     default:
02270 #ifdef CONFIG_RSBAC_DEBUG
02271                       if(rsbac_debug_adf_mac)
02272                         {
02273                           char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02274 
02275                           if(tmp)
02276                             {
02277                               char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02278 
02279                               if(tmp2)
02280                                 {
02281                                   u64tostrmac(tmp, curr_categories);
02282                                   u64tostrmac(tmp2, target_categories);
02283                                   rsbac_printk(KERN_DEBUG
02284                                          "mac_auto_read_write(): pid %u/%.15s: curr_categories %s over target categories %s, no auto, write_down or trusted -> NOT_GRANTED!\n",
02285                                          current->pid, current->comm,
02286                                          tmp,
02287                                          tmp2);
02288                                   rsbac_kfree(tmp2);
02289                                 }
02290                               rsbac_kfree(tmp);
02291                             }
02292                         }
02293 #endif
02294                       return(NOT_GRANTED);
02295                   }
02296               }
02297           }
02298       }
02299 
02300     /* grant area */
02301 
02302     /* adjust current_sec_level and min_write_level, */
02303     /* if set_level is true and mac_auto has been used*/
02304     if(   set_level
02305        && (   mac_auto_used_level
02306            || raise_object_level
02307           )
02308       )
02309       {
02310 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
02311         {
02312           char * target_type_name;
02313           char * target_id_name;
02314 
02315           target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02316           if(target_type_name)
02317             {
02318               #ifdef CONFIG_RSBAC_LOG_FULL_PATH
02319               target_id_name
02320                 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
02321                 /* max. path name len + some extra */
02322               #else
02323               target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
02324                 /* max. file name len + some extra */
02325               #endif
02326               if(target_id_name)
02327                 {
02328                   get_target_name(target_type_name, target, target_id_name, tid);
02329 
02330                   if(mac_auto_used_level)
02331                     {
02332                       rsbac_printk(KERN_INFO
02333                                    "mac_auto_read_write(): Changing process %u (%.15s, owner %u) current level from %u to %u for %s %s\n",
02334                                    pid,
02335                                    current->comm,
02336                                    current->uid,
02337                                    curr_level,
02338                                    target_sec_level,
02339                                    target_type_name,
02340                                    target_id_name);
02341                     }
02342                   else
02343                     {
02344                       rsbac_printk(KERN_INFO
02345                              "mac_auto_read_write(): Process %u (%.15s, owner %u): Raising object level from %u to %u for %s %s\n",
02346                              pid,
02347                              current->comm,
02348                              current->uid,
02349                              target_sec_level,
02350                              curr_level,
02351                              target_type_name,
02352                              target_id_name);
02353                     }
02354                   rsbac_kfree(target_id_name);
02355                 }
02356               rsbac_kfree(target_type_name);
02357             }
02358         }
02359 #endif
02360         if(mac_auto_used_level)
02361           {
02362             i_tid.process = pid;
02363             attr_val1.current_sec_level = target_sec_level;
02364             if (rsbac_get_attr(MAC,
02365                                T_PROCESS,
02366                                i_tid,
02367                                A_min_write_open,
02368                                &attr_val2,
02369                                TRUE))
02370               { /* failed! */
02371                 rsbac_ds_get_error("mac_auto_read_write", A_none);
02372                 return(NOT_GRANTED);
02373               }
02374             if(attr_val1.min_write_open < attr_val2.min_write_open)
02375               {
02376                 if (rsbac_set_attr(MAC,
02377                                    T_PROCESS,
02378                                    i_tid,
02379                                    A_min_write_open,
02380                                    attr_val1))
02381                   { /* failed! */
02382                     rsbac_ds_set_error("mac_auto_read_write", A_none);
02383                     return(NOT_GRANTED);
02384                   }
02385               }
02386             if (rsbac_get_attr(MAC,
02387                                T_PROCESS,
02388                                i_tid,
02389                                A_max_read_open,
02390                                &attr_val2,
02391                                TRUE))
02392               { /* failed! */
02393                 rsbac_ds_get_error("mac_auto_read_write", A_none);
02394                 return(NOT_GRANTED);
02395               }
02396             if(attr_val1.max_read_open > attr_val2.max_read_open)
02397               {
02398                 if (rsbac_set_attr(MAC,
02399                                    T_PROCESS,
02400                                    i_tid,
02401                                    A_max_read_open,
02402                                    attr_val1))
02403                   { /* failed! */
02404                     rsbac_ds_set_error("mac_auto_read_write", A_none);
02405                     return(NOT_GRANTED);
02406                   }
02407               }
02408             if (rsbac_set_attr(MAC,
02409                                T_PROCESS,
02410                                i_tid,
02411                                A_current_sec_level,
02412                                attr_val1))
02413               { /* failed! */
02414                 rsbac_ds_set_error("mac_auto_read_write", A_none);
02415                 return(NOT_GRANTED);
02416               }
02417           }
02418         else
02419           {
02420             attr_val1.security_level = curr_level;
02421             if (rsbac_set_attr(MAC,
02422                                target,
02423                                tid,
02424                                A_security_level,
02425                                attr_val1))
02426               { /* failed! */
02427                 rsbac_ds_set_error("mac_auto_read_write", A_none);
02428                 return(NOT_GRANTED);
02429               }
02430           }
02431       }
02432     /* adjust current_categories and min_write_categories, */
02433     /* if set_level is true and mac_auto has been used*/
02434     if(   set_level
02435        && (   mac_auto_used_cat
02436            || raise_object_cat
02437           )
02438       )
02439       {
02440 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
02441         {
02442           char * target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02443           if(target_type_name)
02444             {
02445               char * target_id_name;
02446 
02447               #ifdef CONFIG_RSBAC_LOG_FULL_PATH
02448               target_id_name
02449                 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
02450                 /* max. path name len + some extra */
02451               #else
02452               target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
02453                 /* max. file name len + some extra */
02454               #endif
02455               if(target_id_name)
02456                 {
02457                   char * tmp1 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02458                   if(tmp1)
02459                     {
02460                       char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02461                       if(tmp2)
02462                         {
02463                           get_target_name(target_type_name, target, target_id_name, tid);
02464 
02465                           if(mac_auto_used_cat)
02466                             {
02467                               rsbac_printk(KERN_INFO
02468                                      "mac_auto_read_write(): Changing process %u (%.15s, owner %u) current categories from %s to %s for %s %s\n",
02469                                      pid,
02470                                      current->comm,
02471                                      current->uid,
02472                                      u64tostrmac(tmp1, curr_categories),
02473                                      u64tostrmac(tmp2, target_categories),
02474                                      target_type_name,
02475                                      target_id_name);
02476                             }
02477                           else
02478                             {
02479                               rsbac_printk(KERN_INFO
02480                                      "mac_auto_read_write(): Process %u (%.15s, owner %u): raising current categories from %s to %s for %s %s\n",
02481                                      pid,
02482                                      current->comm,
02483                                      current->uid,
02484                                      u64tostrmac(tmp2, target_categories),
02485                                      u64tostrmac(tmp1, curr_categories),
02486                                      target_type_name,
02487                                      target_id_name);
02488                             }
02489                           rsbac_kfree(tmp2);
02490                         }
02491                       rsbac_kfree(tmp1);
02492                     }
02493                   rsbac_kfree(target_id_name);
02494                 }
02495               rsbac_kfree(target_type_name);
02496             }
02497         }
02498 #endif
02499         if(mac_auto_used_cat)
02500           {
02501             i_tid.process = pid;
02502             attr_val1.mac_categories = target_categories;
02503             if (rsbac_get_attr(MAC,
02504                                T_PROCESS,
02505                                i_tid,
02506                                A_min_write_categories,
02507                                &attr_val2,
02508                                TRUE))
02509               { /* failed! */
02510                 rsbac_ds_set_error("mac_auto_read_write", A_none);
02511                 return(NOT_GRANTED);
02512               }
02513             if((attr_val1.mac_categories & attr_val2.mac_categories)
02514                != attr_val2.mac_categories
02515               )
02516               {
02517                 if (rsbac_set_attr(MAC,
02518                                    T_PROCESS,
02519                                    i_tid,
02520                                    A_min_write_categories,
02521                                    attr_val1))
02522                   { /* failed! */
02523                     rsbac_ds_set_error("mac_auto_read_write", A_none);
02524                     return(NOT_GRANTED);
02525                   }
02526               }
02527             if (rsbac_get_attr(MAC,
02528                                T_PROCESS,
02529                                i_tid,
02530                                A_max_read_categories,
02531                                &attr_val2,
02532                                TRUE))
02533               { /* failed! */
02534                 rsbac_ds_get_error("mac_auto_read_write", A_none);
02535                 return(NOT_GRANTED);
02536               }
02537             if((attr_val1.mac_categories & attr_val2.mac_categories)
02538                != attr_val1.mac_categories
02539               )
02540               {
02541                 if (rsbac_set_attr(MAC,
02542                                    T_PROCESS,
02543                                    i_tid,
02544                                    A_max_read_categories,
02545                                    attr_val1))
02546                   { /* failed! */
02547                     rsbac_ds_set_error("mac_auto_read_write", A_none);
02548                     return(NOT_GRANTED);
02549                   }
02550               }
02551             if (rsbac_set_attr(MAC,
02552                                T_PROCESS,
02553                                i_tid,
02554                                A_mac_curr_categories,
02555                                attr_val1))
02556               { /* failed! */
02557                 rsbac_ds_set_error("mac_auto_read_write", A_none);
02558                 return(NOT_GRANTED);
02559               }
02560           }
02561         else
02562           {
02563             attr_val1.mac_categories = curr_categories;
02564             if (rsbac_set_attr(MAC,
02565                                target,
02566                                tid,
02567                                A_mac_categories,
02568                                attr_val1))
02569               { /* failed! */
02570                 rsbac_ds_set_error("mac_auto_read_write", A_none);
02571                 return(NOT_GRANTED);
02572               }
02573           }
02574       }
02575 
02576     /* Everything done, so return */
02577     return(GRANTED);
02578   }

static enum rsbac_adf_req_ret_t auto_write rsbac_pid_t  pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
rsbac_boolean_t  set_level
[static]
 

Definition at line 911 of file mac_main.c.

References A_mac_categories, A_security_level, and auto_write_attr().

Referenced by rsbac_adf_request_mac(), and rsbac_adf_set_attr_mac().

00915   {
00916     return auto_write_attr(pid,
00917                            target,
00918                            tid,
00919                            A_security_level,
00920                            A_mac_categories,
00921                            set_level);
00922   }

static enum rsbac_adf_req_ret_t auto_write_attr rsbac_pid_t  pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_attribute_t  t_level_attr,
enum rsbac_attribute_t  t_cat_attr,
rsbac_boolean_t  set_level
[static]
 

Definition at line 83 of file mac_main.c.

References A_current_sec_level, A_mac_categories, A_mac_curr_categories, A_mac_file_flags, A_mac_min_categories, A_mac_process_flags, A_max_read_categories, A_max_read_open, A_min_security_level, A_min_write_categories, A_min_write_open, A_none, A_security_level, rsbac_attribute_value_t::current_sec_level, FALSE, get_target_name(), GRANTED, MAC, MAC_auto, rsbac_attribute_value_t::mac_categories, rsbac_attribute_value_t::mac_file_flags, MAC_override, rsbac_attribute_value_t::mac_process_flags, MAC_trusted, MAC_write_down, MAC_write_up, rsbac_attribute_value_t::min_write_open, NOT_GRANTED, rsbac_target_id_t::process, rsbac_get_attr, rsbac_kfree(), rsbac_kmalloc(), RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_set_attr, rsbac_attribute_value_t::security_level, T_DIR, T_FIFO, T_FILE, T_PROCESS, T_SYMLINK, TRUE, and u64tostrmac().

Referenced by auto_write(), rsbac_adf_request_mac(), and rsbac_adf_set_attr_mac().

00089   {
00090     rsbac_security_level_t        curr_level;
00091     rsbac_mac_category_vector_t   curr_categories;
00092     rsbac_security_level_t        target_sec_level;
00093     rsbac_mac_category_vector_t   target_categories;
00094     union rsbac_target_id_t       i_tid;
00095     union rsbac_attribute_value_t attr_val1;
00096     union rsbac_attribute_value_t attr_val2;
00097     rsbac_mac_process_flags_t     flags;
00098     rsbac_boolean_t                       mac_auto_used_level = FALSE;
00099     rsbac_boolean_t                       mac_auto_used_cat = FALSE;
00100     rsbac_boolean_t                       raise_object_level = FALSE;
00101     rsbac_boolean_t                       raise_object_cat = FALSE;
00102 
00103     /* first check for mac_override, which allows everything */
00104     i_tid.process = pid;
00105     if (rsbac_get_attr(MAC,
00106                        T_PROCESS,
00107                        i_tid,
00108                        A_mac_process_flags,
00109                        &attr_val1,
00110                        FALSE))
00111       { /* failed! */
00112         rsbac_ds_get_error("mac_auto_write", A_none);
00113         return(NOT_GRANTED);
00114       }
00115     flags = attr_val1.mac_process_flags;
00116     if(flags & MAC_override)
00117       return GRANTED;
00118 
00119     /* Get current security level */
00120     if (rsbac_get_attr(MAC,
00121                        T_PROCESS,
00122                        i_tid,
00123                        A_current_sec_level,
00124                        &attr_val1,
00125                        FALSE))
00126       { /* failed! */
00127         rsbac_ds_get_error("mac_auto_write", A_none);
00128         return(NOT_GRANTED);
00129       }
00130     curr_level = attr_val1.security_level;
00131     /* Get current categories */
00132     if (rsbac_get_attr(MAC,
00133                        T_PROCESS,
00134                        i_tid,
00135                        A_mac_curr_categories,
00136                        &attr_val1,
00137                        FALSE))
00138       { /* failed! */
00139         rsbac_ds_get_error("mac_auto_write", A_none);
00140         return(NOT_GRANTED);
00141       }
00142     curr_categories = attr_val1.mac_categories;
00143     /* Get target security level */
00144     if (rsbac_get_attr(MAC,
00145                        target,
00146                        tid,
00147                        t_level_attr,
00148                        &attr_val1,
00149                        TRUE))
00150       { /* failed! */
00151         rsbac_ds_get_error("mac_auto_write", A_none);
00152         return(NOT_GRANTED);
00153       }
00154     target_sec_level = attr_val1.security_level;
00155     /* Get target categories */
00156     if (rsbac_get_attr(MAC,
00157                        target,
00158                        tid,
00159                        t_cat_attr,
00160                        &attr_val1,
00161                        TRUE))
00162       { /* failed! */
00163         rsbac_ds_get_error("mac_auto_write", A_none);
00164         return(NOT_GRANTED);
00165       }
00166     target_categories = attr_val1.mac_categories;
00167 
00168     if(target_sec_level > curr_level)
00169       {
00170         if (rsbac_get_attr(MAC,
00171                            T_PROCESS,
00172                            i_tid,
00173                            A_security_level,
00174                            &attr_val1,
00175                            FALSE))
00176           { /* failed! */
00177             rsbac_ds_get_error("mac_auto_write", A_none);
00178             return(NOT_GRANTED);
00179           }
00180         if(attr_val1.security_level < target_sec_level)
00181           {
00182 #ifdef CONFIG_RSBAC_DEBUG
00183             if(rsbac_debug_adf_mac)
00184               {
00185                 rsbac_printk(KERN_DEBUG
00186                        "mac_auto_write(): pid %u/%.15s: security_level %u under target_sec_level %u, no override -> NOT_GRANTED!\n",
00187                        current->pid, current->comm,
00188                        attr_val1.security_level, target_sec_level);
00189               }
00190 #endif
00191             return(NOT_GRANTED);
00192           }
00193         /* curr_level < target_level <= max_level -> need mac_auto, write_up, trusted (at process)
00194            or shared (at object) */
00195         if(flags & MAC_auto)
00196           mac_auto_used_level = TRUE;
00197         else
00198           {
00199             if(   !(flags & MAC_write_up)
00200                && !(flags & MAC_trusted)
00201               )
00202               {
00203                 /* Try mac_file_flags on the target, if FD object */
00204                 switch(target)
00205                   {
00206                     case T_FILE:
00207                     case T_DIR:
00208                     case T_FIFO:
00209                     case T_SYMLINK:
00210                       if (rsbac_get_attr(MAC,
00211                                          target,
00212                                          tid,
00213                                          A_mac_file_flags,
00214                                          &attr_val1,
00215                                          TRUE))
00216                         { /* failed! */
00217                           rsbac_ds_get_error("mac_auto_write", A_none);
00218                           return(NOT_GRANTED);
00219                         }
00220                       if(   (attr_val1.mac_file_flags & MAC_write_up)
00221                          || (attr_val1.mac_file_flags & MAC_trusted)
00222                         )
00223                         {
00224                           break;
00225                         }
00226                       /* fall through */
00227 
00228                     default:
00229 #ifdef CONFIG_RSBAC_DEBUG
00230                       if(rsbac_debug_adf_mac)
00231                         {
00232                           rsbac_printk(KERN_DEBUG
00233                                  "mac_auto_write(): pid %u/%.15s: current security_level %u under target_sec_level %u, no auto, write_up, trusted -> NOT_GRANTED!\n",
00234                                  current->pid, current->comm,
00235                                  curr_level, target_sec_level);
00236                         }
00237 #endif
00238                       return(NOT_GRANTED);
00239                   }
00240               }
00241           }
00242       }
00243     else
00244     if(target_sec_level < curr_level)
00245       {
00246         if (rsbac_get_attr(MAC,
00247                            T_PROCESS,
00248                            i_tid,
00249                            A_min_security_level,
00250                            &attr_val1,
00251                            FALSE))
00252           { /* failed! */
00253             rsbac_ds_get_error("mac_auto_write", A_none);
00254             return(NOT_GRANTED);
00255           }
00256         if(attr_val1.security_level > target_sec_level)
00257           {
00258 #ifdef CONFIG_RSBAC_DEBUG
00259             if(rsbac_debug_adf_mac)
00260               {
00261                 rsbac_printk(KERN_DEBUG
00262                        "mac_auto_write(): pid %u/%.15s: min_security_level %u over target_sec_level %u, no override -> NOT_GRANTED!\n",
00263                        current->pid, current->comm,
00264                        attr_val1.security_level, target_sec_level);
00265               }
00266 #endif
00267             return(NOT_GRANTED);
00268           }
00269         /* min_level <= target_level < curr_level -> need mac_auto, write_down or trusted */
00270         if(flags & MAC_auto)
00271           {
00272             /* check max_read boundary */
00273             if (rsbac_get_attr(MAC,
00274                                T_PROCESS,
00275                                i_tid,
00276                                A_max_read_open,
00277                                &attr_val1,
00278                                FALSE))
00279               { /* failed! */
00280                 rsbac_ds_get_error("mac_auto_write", A_none);
00281                 return(NOT_GRANTED);
00282               }
00283             if(attr_val1.security_level > target_sec_level)
00284               {
00285                 if(   !(flags & MAC_write_down)
00286                    && !(flags & MAC_trusted)
00287                   )
00288                   {
00289                     /* Try mac_file_flags on the target, if FD object */
00290                     switch(target)
00291                       {
00292                         case T_FILE:
00293                         case T_DIR:
00294                         case T_FIFO:
00295                         case T_SYMLINK:
00296                           if (rsbac_get_attr(MAC,
00297                                              target,
00298                                              tid,
00299                                              A_mac_file_flags,
00300                                              &attr_val1,
00301                                              TRUE))
00302                             { /* failed! */
00303                               rsbac_ds_get_error("mac_auto_write", A_none);
00304                               return(NOT_GRANTED);
00305                             }
00306                           if(   (attr_val1.mac_file_flags & MAC_write_down)
00307                              || (attr_val1.mac_file_flags & MAC_trusted)
00308                             )
00309                             {
00310                               if(attr_val1.mac_file_flags & MAC_auto)
00311                                 {
00312                                   raise_object_level = TRUE;
00313                                 }
00314                               break;
00315                             }
00316                           /* fall through */
00317 
00318                         default:
00319 #ifdef CONFIG_RSBAC_DEBUG
00320                           if(rsbac_debug_adf_mac)
00321                             {
00322                               rsbac_printk(KERN_DEBUG
00323                                      "mac_auto_write(): pid %u/%.15s: max_read_open %u over target_sec_level %u, no write_down or trusted -> NOT_GRANTED!\n",
00324                                      current->pid, current->comm,
00325                                      attr_val1.security_level, target_sec_level);
00326                             }
00327 #endif
00328                           return(NOT_GRANTED);
00329                       }
00330                   }
00331               }
00332             else
00333               mac_auto_used_level = TRUE;
00334           }
00335         else
00336           {
00337             if(   !(flags & MAC_write_down)
00338                && !(flags & MAC_trusted)
00339               )
00340               {
00341                 /* Try mac_file_flags on the target, if FD object */
00342                 switch(target)
00343                   {
00344                     case T_FILE:
00345                     case T_DIR:
00346                     case T_FIFO:
00347                     case T_SYMLINK:
00348                       if (rsbac_get_attr(MAC,
00349                                          target,
00350                                          tid,
00351                                          A_mac_file_flags,
00352                                          &attr_val1,
00353                                          TRUE))
00354                         { /* failed! */
00355                           rsbac_ds_get_error("mac_auto_write", A_none);
00356                           return(NOT_GRANTED);
00357                         }
00358                       if(   (attr_val1.mac_file_flags & MAC_write_down)
00359                          || (attr_val1.mac_file_flags & MAC_trusted)
00360                         )
00361                         {
00362                           if(attr_val1.mac_file_flags & MAC_auto)
00363                             {
00364                               raise_object_level = TRUE;
00365                             }
00366                           break;
00367                         }
00368                       /* fall through */
00369 
00370                     default:
00371 #ifdef CONFIG_RSBAC_DEBUG
00372                       if(rsbac_debug_adf_mac)
00373                         {
00374                           rsbac_printk(KERN_DEBUG
00375                                  "mac_auto_write(): pid %u/%.15s: current security_level %u over target_sec_level %u, no auto, write_down or trusted -> NOT_GRANTED!\n",
00376                                  current->pid, current->comm,
00377                                  curr_level, target_sec_level);
00378                         }
00379 #endif
00380                       return(NOT_GRANTED);
00381                   }
00382               }
00383           }
00384       }
00385 
00386     if((target_categories & curr_categories) != target_categories)
00387       {
00388         if (rsbac_get_attr(MAC,
00389                            T_PROCESS,
00390                            i_tid,
00391                            A_mac_categories,
00392                            &attr_val1,
00393                            FALSE))
00394           { /* failed! */
00395             rsbac_ds_get_error("mac_auto_write", A_none);
00396             return(NOT_GRANTED);
00397           }
00398         if((target_categories & attr_val1.mac_categories) != target_categories)
00399           {
00400 #ifdef CONFIG_RSBAC_DEBUG
00401             if(rsbac_debug_adf_mac)
00402               {
00403                 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00404 
00405                 if(tmp)
00406                   {
00407                     char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00408 
00409                     if(tmp2)
00410                       {
00411                         u64tostrmac(tmp, attr_val1.mac_categories);
00412                         u64tostrmac(tmp2, target_categories);
00413                         rsbac_printk(KERN_DEBUG
00414                                "mac_auto_write(): pid %u/%.15s: max_categories %s under target categories %s, no override -> NOT_GRANTED!\n",
00415                                current->pid, current->comm,
00416                                tmp,
00417                                tmp2);
00418                         rsbac_kfree(tmp2);
00419                       }
00420                     rsbac_kfree(tmp);
00421                   }
00422               }
00423 #endif
00424             return(NOT_GRANTED);
00425           }
00426         /* curr_categories < target_categories <= max_categories -> need mac_auto, write_up or trusted */
00427         if(flags & MAC_auto)
00428           mac_auto_used_cat = TRUE;
00429         else
00430           {
00431             if(   !(flags & MAC_write_up)
00432                && !(flags & MAC_trusted)
00433               )
00434               {
00435                 /* Try mac_file_flags on the target, if FD object */
00436                 switch(target)
00437                   {
00438                     case T_FILE:
00439                     case T_DIR:
00440                     case T_FIFO:
00441                     case T_SYMLINK:
00442                       if (rsbac_get_attr(MAC,
00443                                          target,
00444                                          tid,
00445                                          A_mac_file_flags,
00446                                          &attr_val1,
00447                                          TRUE))
00448                         { /* failed! */
00449                           rsbac_ds_get_error("mac_auto_write", A_none);
00450                           return(NOT_GRANTED);
00451                         }
00452                       if(   (attr_val1.mac_file_flags & MAC_write_up)
00453                          || (attr_val1.mac_file_flags & MAC_trusted)
00454                         )
00455                         break;
00456                       /* fall through */
00457 
00458                     default:
00459 #ifdef CONFIG_RSBAC_DEBUG
00460                       if(rsbac_debug_adf_mac)
00461                         {
00462                           char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00463 
00464                           if(tmp)
00465                             {
00466                               char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00467 
00468                               if(tmp2)
00469                                 {
00470                                   u64tostrmac(tmp, curr_categories);
00471                                   u64tostrmac(tmp2, target_categories);
00472                                   rsbac_printk(KERN_DEBUG
00473                                          "mac_auto_write(): pid %u/%.15s: curr_categories %s under target categories %s, no auto, write_up or trusted -> NOT_GRANTED!\n",
00474                                          current->pid, current->comm,
00475                                          tmp,
00476                                          tmp2);
00477                                   rsbac_kfree(tmp2);
00478                                 }
00479                               rsbac_kfree(tmp);
00480                             }
00481                         }
00482 #endif
00483                       return(NOT_GRANTED);
00484                   }
00485               }
00486           }
00487       }
00488     else
00489     if((target_categories & curr_categories) != curr_categories)
00490       {
00491         if (rsbac_get_attr(MAC,
00492                            T_PROCESS,
00493                            i_tid,
00494                            A_mac_min_categories,
00495                            &attr_val1,
00496                            FALSE))
00497           { /* failed! */
00498             rsbac_ds_get_error("mac_auto_write", A_none);
00499             return(NOT_GRANTED);
00500           }
00501         if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
00502           {
00503 #ifdef CONFIG_RSBAC_DEBUG
00504             if(rsbac_debug_adf_mac)
00505               {
00506                 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00507 
00508                 if(tmp)
00509                   {
00510                     char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00511 
00512                     if(tmp2)
00513                       {
00514                         u64tostrmac(tmp, attr_val1.mac_categories);
00515                         u64tostrmac(tmp2, target_categories);
00516                         rsbac_printk(KERN_DEBUG
00517                                "mac_auto_write(): pid %u/%.15s: min_categories %s over target categories %s, no override -> NOT_GRANTED!\n",
00518                                current->pid, current->comm,
00519                                tmp,
00520                                tmp2);
00521                         rsbac_kfree(tmp2);
00522                       }
00523                     rsbac_kfree(tmp);
00524                   }
00525               }
00526 #endif
00527             return(NOT_GRANTED);
00528           }
00529         /* min_level <= target_level < curr_level -> need mac_auto, write_down or trusted */
00530         if(flags & MAC_auto)
00531           {
00532             /* check max_read boundary */
00533             if (rsbac_get_attr(MAC,
00534                                T_PROCESS,
00535                                i_tid,
00536                                A_max_read_categories,
00537                                &attr_val1,
00538                                FALSE))
00539               { /* failed! */
00540                 rsbac_ds_get_error("mac_auto_write", A_none);
00541                 return(NOT_GRANTED);
00542               }
00543             if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
00544               {
00545                 if(   !(flags & MAC_write_down)
00546                    && !(flags & MAC_trusted)
00547                   )
00548                   {
00549                     /* Try mac_file_flags on the target, if FD object */
00550                     switch(target)
00551                       {
00552                         case T_FILE:
00553                         case T_DIR:
00554                         case T_FIFO:
00555                         case T_SYMLINK:
00556                           if (rsbac_get_attr(MAC,
00557                                              target,
00558                                              tid,
00559                                              A_mac_file_flags,
00560                                              &attr_val1,
00561                                              TRUE))
00562                             { /* failed! */
00563                               rsbac_ds_get_error("mac_auto_write", A_none);
00564                               return(NOT_GRANTED);
00565                             }
00566                           if(   (attr_val1.mac_file_flags & MAC_write_down)
00567                              || (attr_val1.mac_file_flags & MAC_trusted)
00568                             )
00569                             {
00570                               if(attr_val1.mac_file_flags & MAC_auto)
00571                                 {
00572                                   raise_object_cat = TRUE;
00573                                 }
00574                               break;
00575                             }
00576                           /* fall through */
00577 
00578                         default:
00579 #ifdef CONFIG_RSBAC_DEBUG
00580                           if(rsbac_debug_adf_mac)
00581                             {
00582                               char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00583 
00584                               if(tmp)
00585                                 {
00586                                   char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00587 
00588                                   if(tmp2)
00589                                     {
00590                                       u64tostrmac(tmp, attr_val1.mac_categories);
00591                                       u64tostrmac(tmp2, target_categories);
00592                                       rsbac_printk(KERN_DEBUG
00593                                              "mac_auto_write(): pid %u/%.15s: max_read_categories %s over target categories %s, no write_down or trusted -> NOT_GRANTED!\n",
00594                                              current->pid, current->comm,
00595                                              tmp,
00596                                              tmp2);
00597                                       rsbac_kfree(tmp2);
00598                                     }
00599                                   rsbac_kfree(tmp);
00600                                 }
00601                             }
00602 #endif
00603                           return(NOT_GRANTED);
00604                       }
00605                   }
00606               }
00607             else
00608               mac_auto_used_cat = TRUE;
00609           }
00610         else
00611           {
00612             if(   !(flags & MAC_write_down)
00613                && !(flags & MAC_trusted)
00614               )
00615               {
00616                 /* Try mac_file_flags on the target, if FD object */
00617                 switch(target)
00618                   {
00619                     case T_FILE:
00620                     case T_DIR:
00621                     case T_FIFO:
00622                     case T_SYMLINK:
00623                       if (rsbac_get_attr(MAC,
00624                                          target,
00625                                          tid,
00626                                          A_mac_file_flags,
00627                                          &attr_val1,
00628                                          TRUE))
00629                         { /* failed! */
00630                           rsbac_ds_get_error("mac_auto_write", A_none);
00631                           return(NOT_GRANTED);
00632                         }
00633                       if(   (attr_val1.mac_file_flags & MAC_write_down)
00634                          || (attr_val1.mac_file_flags & MAC_trusted)
00635                         )
00636                         {
00637                           if(attr_val1.mac_file_flags & MAC_auto)
00638                             {
00639                               raise_object_cat = TRUE;
00640                             }
00641                           break;
00642                         }
00643                       /* fall through */
00644 
00645                     default:
00646 #ifdef CONFIG_RSBAC_DEBUG
00647                       if(rsbac_debug_adf_mac)
00648                         {
00649                           char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00650 
00651                           if(tmp)
00652                             {
00653                               char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00654 
00655                               if(tmp2)
00656                                 {
00657                                   u64tostrmac(tmp, curr_categories);
00658                                   u64tostrmac(tmp2, target_categories);
00659                                   rsbac_printk(KERN_DEBUG
00660                                          "mac_auto_write(): pid %u/%.15s: curr_categories %s over target categories %s, no auto, write_down or trusted -> NOT_GRANTED!\n",
00661                                          current->pid, current->comm,
00662                                          tmp,
00663                                          tmp2);
00664                                   rsbac_kfree(tmp2);
00665                                 }
00666                               rsbac_kfree(tmp);
00667                             }
00668                         }
00669 #endif
00670                       return(NOT_GRANTED);
00671                   }
00672               }
00673           }
00674       }
00675 
00676     /* grant area */
00677 
00678     /* adjust current_sec_level and min_write_level, */
00679     /* if set_level is true and mac_auto has been used*/
00680     if(   set_level
00681        && (   mac_auto_used_level
00682            || raise_object_level
00683           )
00684       )
00685       {
00686 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
00687         {
00688           char * target_type_name;
00689           char * target_id_name;
00690 
00691           target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00692           if(target_type_name)
00693             {
00694               #ifdef CONFIG_RSBAC_LOG_FULL_PATH
00695               target_id_name
00696                 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
00697                 /* max. path name len + some extra */
00698               #else
00699               target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
00700                 /* max. file name len + some extra */
00701               #endif
00702               if(target_id_name)
00703                 {
00704                   get_target_name(target_type_name, target, target_id_name, tid);
00705 
00706                   if(mac_auto_used_level)
00707                     {
00708                       rsbac_printk(KERN_INFO
00709                              "mac_auto_write(): Changing process %u (%.15s, owner %u) current level from %u to %u for %s %s\n",
00710                              pid,
00711                              current->comm,
00712                              current->uid,
00713                              curr_level,
00714                              target_sec_level,
00715                              target_type_name,
00716                              target_id_name);
00717                     }
00718                   else
00719                     {
00720                       rsbac_printk(KERN_INFO
00721                              "mac_auto_write(): Process %u (%.15s, owner %u): Raising object level from %u to %u for %s %s\n",
00722                              pid,
00723                              current->comm,
00724                              current->uid,
00725                              target_sec_level,
00726                              curr_level,
00727                              target_type_name,
00728                              target_id_name);
00729                     }
00730                   rsbac_kfree(target_id_name);
00731                 }
00732               rsbac_kfree(target_type_name);
00733             }
00734         }
00735 #endif
00736         if(mac_auto_used_level)
00737           {
00738             i_tid.process = pid;
00739             attr_val1.current_sec_level = target_sec_level;
00740             if (rsbac_get_attr(MAC,
00741                                T_PROCESS,
00742                                i_tid,
00743                                A_min_write_open,
00744                                &attr_val2,
00745                                TRUE))
00746               { /* failed! */
00747                 rsbac_ds_get_error("mac_auto_write", A_none);
00748                 return(NOT_GRANTED);
00749               }
00750             if(attr_val1.min_write_open < attr_val2.min_write_open)
00751               {
00752                 if (rsbac_set_attr(MAC,
00753                                    T_PROCESS,
00754                                    i_tid,
00755                                    A_min_write_open,
00756                                    attr_val1))
00757                   { /* failed! */
00758                     rsbac_ds_set_error("mac_auto_write", A_none);
00759                     return(NOT_GRANTED);
00760                   }
00761               }
00762             if (rsbac_set_attr(MAC,
00763                                T_PROCESS,
00764                                i_tid,
00765                                A_current_sec_level,
00766                                attr_val1))
00767               { /* failed! */
00768                 rsbac_ds_set_error("mac_auto_write", A_none);
00769                 return(NOT_GRANTED);
00770               }
00771           }
00772         else
00773           {
00774             attr_val1.security_level = curr_level;
00775             if (rsbac_set_attr(MAC,
00776                                target,
00777                                tid,
00778                                A_security_level,
00779                                attr_val1))
00780               { /* failed! */
00781                 rsbac_ds_set_error("mac_auto_write", A_none);
00782                 return(NOT_GRANTED);
00783               }
00784           }
00785       }
00786     /* adjust current_categories and min_write_categories, */
00787     /* if set_level is true and mac_auto has been used*/
00788     if(   set_level
00789        && (   mac_auto_used_cat
00790            || raise_object_cat
00791           )
00792       )
00793       {
00794 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
00795         {
00796           char * target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00797           if(target_type_name)
00798             {
00799               char * target_id_name;
00800 
00801               #ifdef CONFIG_RSBAC_LOG_FULL_PATH
00802               target_id_name
00803                 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
00804                 /* max. path name len + some extra */
00805               #else
00806               target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
00807                 /* max. file name len + some extra */
00808               #endif
00809               if(target_id_name)
00810                 {
00811                   char * tmp1 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00812                   if(tmp1)
00813                     {
00814                       char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00815                       if(tmp2)
00816                         {
00817                           get_target_name(target_type_name, target, target_id_name, tid);
00818 
00819                           if(mac_auto_used_cat)
00820                             {
00821                               rsbac_printk(KERN_INFO
00822                                      "mac_auto_write(): Changing process %u (%.15s, owner %u) current categories from %s to %s for %s %s\n",
00823                                      pid,
00824                                      current->comm,
00825                                      current->uid,
00826                                      u64tostrmac(tmp1, curr_categories),
00827                                      u64tostrmac(tmp2, target_categories),
00828                                      target_type_name,
00829                                      target_id_name);
00830                             }
00831                           else
00832                             {
00833                               rsbac_printk(KERN_INFO
00834                                      "mac_auto_write(): Process %u (%.15s, owner %u): raising current categories from %s to %s for %s %s\n",
00835                                      pid,
00836                                      current->comm,
00837                                      current->uid,
00838                                      u64tostrmac(tmp2, target_categories),
00839                                      u64tostrmac(tmp1, curr_categories),
00840                                      target_type_name,
00841                                      target_id_name);
00842                             }
00843                           rsbac_kfree(tmp2);
00844                         }
00845                       rsbac_kfree(tmp1);
00846                     }
00847                   rsbac_kfree(target_id_name);
00848                 }
00849               rsbac_kfree(target_type_name);
00850             }
00851         }
00852 #endif
00853         if(mac_auto_used_cat)
00854           {
00855             i_tid.process = pid;
00856             attr_val1.mac_categories = target_categories;
00857             if (rsbac_get_attr(MAC,
00858                                T_PROCESS,
00859                                i_tid,
00860                                A_min_write_categories,
00861                                &attr_val2,
00862                                TRUE))
00863               { /* failed! */
00864                 rsbac_ds_get_error("mac_auto_write", A_none);
00865                 return(NOT_GRANTED);
00866               }
00867             if((attr_val1.mac_categories & attr_val2.mac_categories)
00868                != attr_val2.mac_categories
00869               )
00870               {
00871                 if (rsbac_set_attr(MAC,
00872                                    T_PROCESS,
00873                                    i_tid,
00874                                    A_min_write_categories,
00875                                    attr_val1))
00876                   { /* failed! */
00877                     rsbac_ds_set_error("mac_auto_write", A_none);
00878                     return(NOT_GRANTED);
00879                   }
00880               }
00881             if (rsbac_set_attr(MAC,
00882                                T_PROCESS,
00883                                i_tid,
00884                                A_mac_curr_categories,
00885                                attr_val1))
00886               { /* failed! */
00887                 rsbac_ds_set_error("mac_auto_write", A_none);
00888                 return(NOT_GRANTED);
00889               }
00890           }
00891         else
00892           {
00893             attr_val1.mac_categories = curr_categories;
00894             if (rsbac_set_attr(MAC,
00895                                target,
00896                                tid,
00897                                A_mac_categories,
00898                                attr_val1))
00899               { /* failed! */
00900                 rsbac_ds_set_error("mac_auto_write", A_none);
00901                 return(NOT_GRANTED);
00902               }
00903           }
00904       }
00905 
00906     /* Everything done, so return */
00907     return(GRANTED);
00908   }

static enum rsbac_adf_req_ret_t mac_check_role rsbac_uid_t  owner,
enum rsbac_system_role_t  role
[static]
 

Definition at line 33 of file mac_main.c.

References A_mac_role, GRANTED, MAC, NOT_GRANTED, rsbac_get_attr, rsbac_printk(), rsbac_attribute_value_t::system_role, T_USER, TRUE, and rsbac_target_id_t::user.

Referenced by rsbac_adf_request_mac().

00034   {
00035     union rsbac_target_id_t i_tid;
00036     union rsbac_attribute_value_t i_attr_val1;
00037 
00038     i_tid.user = owner;
00039     if (rsbac_get_attr(MAC,
00040                        T_USER,
00041                        i_tid,
00042                        A_mac_role,
00043                        &i_attr_val1,
00044                        TRUE))
00045       {
00046         rsbac_ds_get_error("mac_check_role", A_mac_role);
00047         return(NOT_GRANTED);
00048       }
00049     /* if correct role, then grant */
00050     if (i_attr_val1.system_role == role)
00051       return(GRANTED);
00052     else
00053       {
00054 #ifdef CONFIG_RSBAC_DEBUG
00055         if(rsbac_debug_adf_mac)
00056           {
00057             rsbac_printk(KERN_DEBUG
00058                    "mac_check_role(): pid %u/%.15s: wrong mac_role %u -> NOT_GRANTED!\n",
00059                    current->pid, current->comm,
00060                    i_attr_val1.system_role);
00061           }
00062 #endif
00063         return(NOT_GRANTED);
00064       }
00065   }

enum rsbac_adf_req_ret_t rsbac_adf_request_mac enum rsbac_adf_request_t  request,
rsbac_pid_t  caller_pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_attribute_t  attr,
union rsbac_attribute_value_t  attr_val,
rsbac_uid_t  owner
 

Definition at line 2599 of file mac_main.c.

References A_audit_uid, A_auid_exempt, A_auth_last_auth, A_auth_learn, A_auth_may_set_cap, A_auth_may_setuid, A_current_sec_level, A_fake_root_uid, A_initial_security_level, A_linux_dac_disable, A_local_log_array_high, A_local_log_array_low, A_local_mac_categories, A_local_sec_level, A_log_array_high, A_log_array_low, A_log_program_based, A_log_user_based, A_mac_auto, A_mac_categories, A_mac_check, A_mac_curr_categories, A_mac_file_flags, A_mac_initial_categories, A_mac_min_categories, A_mac_process_flags, A_mac_prop_trusted, A_mac_role, A_mac_user_flags, A_max_read_categories, A_max_read_open, A_min_security_level, A_min_write_categories, A_min_write_open, A_none, A_pseudo, A_remote_ip, A_remote_log_array_high, A_remote_log_array_low, A_remote_mac_categories, A_remote_sec_level, A_security_level, A_symlink_add_mac_level, A_symlink_add_remote_ip, A_symlink_add_uid, A_system_role, AUTH, auto_read(), auto_read_attr(), auto_read_write(), auto_read_write_attr(), auto_write(), auto_write_attr(), D_block, rsbac_target_id_t::dev, DO_NOT_CARE, FALSE, FREEZE, GRANTED, MAC, rsbac_attribute_value_t::mac_check, mac_check_role(), NOT_GRANTED, R_ACCEPT, R_ADD_TO_KERNEL, R_ALTER, R_APPEND_OPEN, R_BIND, R_CHANGE_GROUP, R_CHANGE_OWNER, R_CHDIR, R_CLONE, R_CONNECT, R_CREATE, R_DELETE, R_EXECUTE, R_GET_PERMISSIONS_DATA, R_GET_STATUS_DATA, R_LINK_HARD, R_LISTEN, R_MAP_EXEC, R_MODIFY_ACCESS_DATA, R_MODIFY_ATTRIBUTE, R_MODIFY_PERMISSIONS_DATA, R_MODIFY_SYSTEM_DATA, R_MOUNT, R_READ, R_READ_ATTRIBUTE, R_READ_OPEN, R_READ_WRITE_OPEN, R_RECEIVE, R_REMOVE_FROM_KERNEL, R_RENAME, R_SEARCH, R_SEND, R_SEND_SIGNAL, R_SHUTDOWN, R_SWITCH_LOG, R_SWITCH_MODULE, R_TERMINATE, R_TRACE, R_TRUNCATE, R_UMOUNT, R_WRITE, R_WRITE_OPEN, rsbac_get_attr, rsbac_set_attr, rsbac_target_id_t::scd, SOFTMODE, SR_administrator, SR_auditor, SR_security_officer, ST_ioports, ST_rlimit, ST_rsbac, ST_rsbac_remote_log, ST_rsbaclog, rsbac_attribute_value_t::system_role, T_DEV, T_DIR, T_FIFO, T_FILE, T_GROUP, T_IPC, T_NETDEV, T_NETOBJ, T_NETTEMP, T_NONE, T_PROCESS, T_SCD, T_SYMLINK, T_USER, TRUE, rsbac_dev_desc_t::type, UNDEFINED, and rsbac_target_id_t::user.

Referenced by rsbac_adf_request_int().

02606   {
02607     enum  rsbac_adf_req_ret_t result = DO_NOT_CARE;
02608     union rsbac_target_id_t       i_tid;
02609     union rsbac_attribute_value_t i_attr_val1;
02610 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
02611     union rsbac_attribute_value_t i_attr_val2;
02612 #endif
02613 
02614     switch (request)
02615       {
02616         case R_ADD_TO_KERNEL:
02617             switch(target)
02618               {
02619                 case T_FILE:
02620                 case T_DEV:
02621                 case T_NONE:
02622                   /* test owner's mac_role */
02623                   return mac_check_role(owner, SR_administrator);
02624 
02625                 /* all other cases are unknown */
02626                 default: return(DO_NOT_CARE);
02627               }
02628 
02629         case R_ALTER:
02630             /* only for IPC */
02631             if (target == T_IPC)
02632               {
02633                 /* and perform auto-write without setting attributes */
02634                 return(auto_write(caller_pid,
02635                                   target,
02636                                   tid,
02637                                   FALSE));
02638               }
02639             else
02640             /* all other targets are unknown */
02641               return (DO_NOT_CARE);
02642             break;
02643 
02644         case R_APPEND_OPEN:
02645             switch(target)
02646               {
02647                 case T_FILE:
02648                 case T_FIFO:
02649                   /* and perform auto-write without setting attributes */
02650                   return(auto_write(caller_pid,
02651                                     target,
02652                                     tid,
02653                                     FALSE));
02654                   break;
02655                 case T_IPC:
02656                   /* and perform auto-write without setting attributes */
02657                   return(auto_write(caller_pid,
02658                                     target,
02659                                     tid,
02660                                     FALSE));
02661                   break;
02662                 case T_DEV:
02663                   /* Only check for devices with mac_check set */
02664                   if (rsbac_get_attr(MAC,
02665                                      T_DEV,
02666                                      tid,
02667                                      A_mac_check,
02668                                      &i_attr_val1,
02669                                      FALSE))
02670                     {
02671                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
02672                       return(NOT_GRANTED);
02673                     }
02674                   if(!i_attr_val1.mac_check)
02675                     return(DO_NOT_CARE);
02676                   /* and perform auto-write without setting attributes */
02677                   return(auto_write(caller_pid,
02678                                     target,
02679                                     tid,
02680                                     FALSE));
02681                   break;
02682                 /* all other cases are unknown */
02683                 default: return(DO_NOT_CARE);
02684               }
02685 
02686         case R_CHANGE_GROUP:
02687             switch(target)
02688               {
02689                 case T_FILE:
02690                 case T_DIR:
02691                 case T_FIFO:
02692                 case T_SYMLINK:
02693                   /* and perform auto-write without setting attributes */
02694                   return(auto_write(caller_pid,
02695                                     target,
02696                                     tid,
02697                                     FALSE));
02698                 case T_IPC:
02699                   /* and perform auto-write without setting attributes */
02700                   return(auto_write(caller_pid,
02701                                     target,
02702                                     tid,
02703                                     FALSE));
02704                   
02705 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02706                 case T_USER:
02707                   /* Security Officer? */
02708                   return mac_check_role(owner, SR_security_officer);
02709 #endif
02710                 /* We do not care about */
02711                 /* all other cases */
02712                 default: return(DO_NOT_CARE);
02713               }
02714 
02715         case R_CHANGE_OWNER:
02716             switch(target)
02717               {
02718                 case T_FILE:
02719                 case T_DIR:
02720                 case T_FIFO:
02721                 case T_SYMLINK:
02722                   /* and perform auto-write without setting attributes */
02723                   return(auto_write(caller_pid,
02724                                     target,
02725                                     tid,
02726                                     FALSE));
02727 
02728                 case T_IPC:
02729                   return(auto_write(caller_pid,
02730                                     target,
02731                                     tid,
02732                                     FALSE));
02733                   
02734                 /* all other cases are unknown */
02735                 default:
02736                   return(DO_NOT_CARE);
02737               }
02738 
02739         case R_CHDIR:
02740             switch(target)
02741               {
02742                 case T_DIR:
02743                   /* and perform auto-read without setting attributes */
02744                   return(auto_read(caller_pid,
02745                                    target,
02746                                    tid,
02747                                    FALSE));
02748                   break;
02749                 /* all other cases are unknown */
02750                 default: return(DO_NOT_CARE);
02751               }
02752 
02753         case R_CLONE:
02754             if (target == T_PROCESS)
02755               return(GRANTED);
02756             else
02757               return(DO_NOT_CARE);
02758 
02759         case R_CREATE:
02760             switch(target)
02761               {
02762                 /* Creating dir or (pseudo) file IN target dir! */
02763                 case T_DIR: 
02764 #ifdef CONFIG_RSBAC_MAC_LIGHT
02765                   return GRANTED;
02766 #else             
02767                   /* Mode of created item is ignored! */
02768                   /* and perform auto-write without setting attributes */
02769                   return(auto_write(caller_pid,
02770                                     target,
02771                                     tid,
02772                                     FALSE));
02773 #endif
02774                   break;
02775                   
02776 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02777                 case T_NETTEMP:
02778                   return mac_check_role(owner, SR_security_officer);
02779 
02780                 case T_NETOBJ:
02781                   /* and perform auto-write without setting attributes */
02782                   return(auto_write_attr(caller_pid,
02783                                          target,
02784                                          tid,
02785                                          A_local_sec_level,
02786                                          A_local_mac_categories,
02787                                          FALSE));
02788 #endif
02789 
02790 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02791                 case T_USER:
02792                 case T_GROUP:
02793                   /* Security Officer? */
02794                   return mac_check_role(owner, SR_security_officer);
02795 #endif
02796                 /* all other cases are unknown */
02797                 default: return(DO_NOT_CARE);
02798               }
02799 
02800         case R_DELETE:
02801             switch(target)
02802               {
02803                 case T_FILE:
02804                 case T_DIR:
02805                 case T_FIFO:
02806                 case T_SYMLINK:
02807                   /* and perform auto-write without setting attributes */
02808                   return(auto_write(caller_pid,
02809                                     target,
02810                                     tid,
02811                                     FALSE));
02812                   break;
02813                 case T_IPC:
02814                   /* and perform auto-write without setting attributes */
02815                   return(auto_write(caller_pid,
02816                                     target,
02817                                     tid,
02818                                     FALSE));
02819                   break;
02820 
02821 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02822                 case T_NETTEMP:
02823                   return mac_check_role(owner, SR_security_officer);
02824 #endif
02825 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02826                 case T_USER:
02827                 case T_GROUP:
02828                   /* Security Officer? */
02829                   return mac_check_role(owner, SR_security_officer);
02830 #endif
02831 
02832                 /* all other cases are unknown */
02833                 default: return(DO_NOT_CARE);
02834               }
02835 
02836         case R_EXECUTE:
02837         case R_MAP_EXEC:
02838             switch(target)
02839               {
02840                 case T_FILE:
02841                   /* and perform auto-read without setting attributes */
02842                   return(auto_read(caller_pid,
02843                                    target,
02844                                    tid,
02845                                    FALSE));
02846 
02847                 /* all other cases are unknown */
02848                 default:
02849                   return(DO_NOT_CARE);
02850               }
02851 
02852         case R_GET_PERMISSIONS_DATA:
02853             switch(target)
02854               {
02855 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02856                 case T_USER:
02857                 case T_GROUP:
02858                   /* Security Officer? */
02859                   return mac_check_role(owner, SR_security_officer);
02860 #endif
02861 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02862                 case T_NETOBJ:
02863                   /* and perform auto-read without setting attributes */
02864                   return(auto_read_attr(caller_pid,
02865                                          target,
02866                                          tid,
02867                                          A_local_sec_level,
02868                                          A_local_mac_categories,
02869                                          FALSE));
02870 #endif
02871 
02872                 default:
02873                   return(DO_NOT_CARE);
02874                }
02875 
02876         case R_GET_STATUS_DATA:
02877             switch(target)
02878               {
02879                 case T_SCD:
02880                   /* target rsbaclog? only for secoff */
02881                   if (tid.scd != ST_rsbaclog)
02882                     return(GRANTED);
02883                   /* Secoff? */
02884                   if(mac_check_role(owner, SR_security_officer) == NOT_GRANTED)
02885                     return mac_check_role(owner, SR_auditor);
02886                   else
02887                     return GRANTED;
02888 
02889                 case T_PROCESS:
02890                   /* perform auto-read without setting attributes */
02891                   return(auto_read_attr(caller_pid,
02892                                         target,
02893                                         tid,
02894                                         A_current_sec_level,
02895                                         A_mac_curr_categories,
02896                                         FALSE));
02897 
02898 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02899                 case T_NETOBJ:
02900                   /* and perform auto-read without setting attributes */
02901                   return(auto_read_attr(caller_pid,
02902                                          target,
02903                                          tid,
02904                                          A_local_sec_level,
02905                                          A_local_mac_categories,
02906                                          FALSE));
02907 #endif
02908 
02909                 default:
02910                   return(DO_NOT_CARE);
02911                }
02912 
02913         case R_LINK_HARD:
02914             switch(target)
02915               {
02916                 case T_FILE:
02917                 case T_FIFO:
02918                 case T_SYMLINK:
02919                   /* and perform auto-write without setting attributes */
02920                   return(auto_write(caller_pid,
02921                                     target,
02922                                     tid,
02923                                     FALSE));
02924                   break;
02925                 /* all other cases are unknown */
02926                 default: return(DO_NOT_CARE);
02927               }
02928 
02929         case R_MODIFY_ACCESS_DATA:
02930             switch(target)
02931               {
02932                 case T_FILE:
02933                 case T_DIR:
02934                 case T_FIFO:
02935                 case T_SYMLINK:
02936                   /* and perform auto-write without setting attributes */
02937                   return(auto_write(caller_pid,
02938                                     target,
02939                                     tid,
02940                                     FALSE));
02941                   break;
02942                 /* all other cases are unknown */
02943                 default: return(DO_NOT_CARE);
02944               }
02945 
02946         case R_MODIFY_ATTRIBUTE:
02947             switch(attr)
02948               {
02949                 case A_security_level:
02950                 case A_initial_security_level:
02951                 case A_local_sec_level:
02952                 case A_remote_sec_level:
02953                 case A_min_security_level:
02954                 case A_mac_categories:
02955                 case A_mac_initial_categories:
02956                 case A_local_mac_categories:
02957                 case A_remote_mac_categories:
02958                 case A_mac_min_categories:
02959                 case A_mac_user_flags:
02960                 case A_mac_process_flags:
02961                 case A_mac_file_flags:
02962                 case A_system_role:
02963                 case A_mac_role:
02964                 case A_current_sec_level:
02965                 case A_mac_curr_categories:
02966                 case A_min_write_open:
02967                 case A_max_read_open:
02968                 case A_min_write_categories:
02969                 case A_max_read_categories:
02970                 case A_mac_check:
02971                 case A_mac_auto:
02972                 case A_mac_prop_trusted:
02973                 case A_symlink_add_mac_level:
02974                 #ifdef CONFIG_RSBAC_MAC_GEN_PROT
02975                 case A_pseudo:
02976                 case A_log_array_low:
02977                 case A_log_array_high:
02978                 case A_local_log_array_low:
02979                 case A_local_log_array_high:
02980                 case A_remote_log_array_low:
02981                 case A_remote_log_array_high:
02982                 case A_log_program_based:
02983                 case A_log_user_based:
02984                 case A_symlink_add_remote_ip:
02985                 case A_symlink_add_uid:
02986                 case A_linux_dac_disable:
02987                 case A_fake_root_uid:
02988                 case A_audit_uid:
02989                 case A_auid_exempt:
02990                 case A_remote_ip:
02991                 #endif
02992                 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
02993                 case A_auth_may_setuid:
02994                 case A_auth_may_set_cap:
02995                 case A_auth_start_uid:
02996                 case A_auth_start_euid:
02997                 case A_auth_start_gid:
02998                 case A_auth_start_egid:
02999                 case A_auth_program_file:
03000                 case A_auth_learn:
03001                 case A_auth_add_f_cap:
03002                 case A_auth_remove_f_cap:
03003                 case A_auth_last_auth:
03004                 #endif
03005                 /* All attributes (remove target!) */
03006                 case A_none:
03007                   /* Security Officer? */
03008                   return mac_check_role(owner, SR_security_officer);
03009 
03010                 default:
03011                   return(DO_NOT_CARE);
03012               }
03013 
03014         case R_MODIFY_PERMISSIONS_DATA:
03015             switch(target)
03016               {
03017                 case T_FILE:
03018                 case T_DIR:
03019                 case T_FIFO:
03020                 case T_SYMLINK:
03021                 case T_IPC:
03022                   /* and perform auto-write without setting attributes */
03023                   return(auto_write(caller_pid,
03024                                     target,
03025                                     tid,
03026                                     FALSE));
03027                   break;
03028                   
03029                 case T_SCD:
03030                   #ifdef CONFIG_RSBAC_USER_MOD_IOPERM
03031                   if(tid.scd == ST_ioports)
03032                     return GRANTED;
03033                   #endif
03034                   /* Security Officer? */
03035                   i_tid.user = owner;
03036                   if (rsbac_get_attr(MAC,
03037                                      T_USER,
03038                                      i_tid,
03039                                      A_mac_role,
03040                                      &i_attr_val1,
03041                                      TRUE))
03042                     {
03043                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03044                       return(NOT_GRANTED);
03045                     }
03046                   /* if sec_officer, then grant */
03047                   if (i_attr_val1.system_role == SR_security_officer)
03048                     return(GRANTED);
03049                   /* For booting: if administrator and ioports, then grant */
03050                   if (   (i_attr_val1.system_role == SR_administrator)
03051                       && (tid.scd == ST_ioports) )
03052                     return(GRANTED);
03053                   else
03054                     return(NOT_GRANTED);
03055 
03056 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
03057                 case T_NETOBJ:
03058                   /* and perform auto-write without setting attributes */
03059                   return(auto_write_attr(caller_pid,
03060                                          target,
03061                                          tid,
03062                                          A_local_sec_level,
03063                                          A_local_mac_categories,
03064                                          FALSE));
03065 #endif
03066 
03067 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03068                 case T_USER:
03069                 case T_GROUP:
03070                   /* Security Officer? */
03071                   return mac_check_role(owner, SR_security_officer);
03072 #endif
03073 #ifdef CONFIG_RSBAC_ALLOW_DAC_DISABLE
03074                 /* switching Linux DAC */
03075                 case T_NONE:
03076                   /* Security Officer? */
03077                   i_tid.user = owner;
03078                   if (rsbac_get_attr(MAC,
03079                                      T_USER,
03080                                      i_tid,
03081                                      A_mac_role,
03082                                      &i_attr_val1,
03083                                      TRUE))
03084                     {
03085                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03086                       return(NOT_GRANTED);
03087                     }
03088                   /* if sec_officer, then grant */
03089                   if (i_attr_val1.system_role == SR_security_officer)
03090                     return(GRANTED);
03091                   else
03092                     return(NOT_GRANTED);
03093 #endif
03094 
03095                 /* all other cases are unknown */
03096                 default: return(DO_NOT_CARE);
03097               }
03098 
03099         case R_MODIFY_SYSTEM_DATA:
03100             switch(target)
03101               {
03102                 case T_SCD:
03103                   /* target rlimit? no problem, but needed -> grant */
03104                   if (tid.scd == ST_rlimit)
03105                     return(GRANTED);
03106                   /* Get role */
03107                   i_tid.user = owner;
03108                   if (rsbac_get_attr(MAC,
03109                                      T_USER,
03110                                      i_tid,
03111                                      A_mac_role,
03112                                      &i_attr_val1,
03113                                      TRUE))
03114                     {
03115                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03116                       return(NOT_GRANTED);
03117                     }
03118                   /* if rsbaclog: grant only for secoff and auditor */
03119                   if(tid.scd == ST_rsbaclog)
03120                     {
03121                       if (   (i_attr_val1.system_role == SR_security_officer)
03122                           || (i_attr_val1.system_role == SR_auditor)
03123                          )
03124                         return(GRANTED);
03125                       else
03126                         return(NOT_GRANTED);
03127                     }
03128                   /* if rsbac_log_remote: grant only for secoff */
03129                   if(tid.scd == ST_rsbac_remote_log)
03130                     {
03131                       if (   (i_attr_val1.system_role == SR_security_officer)
03132                          )
03133                         return(GRANTED);
03134                       else
03135                         return(NOT_GRANTED);
03136                     }
03137                   /* if rsbac: grant for secoff and adminr */
03138                   if(tid.scd == ST_rsbac)
03139                     {
03140                       if (   (i_attr_val1.system_role == SR_security_officer)
03141                           || (i_attr_val1.system_role == SR_administrator)
03142                          )
03143                         return(GRANTED);
03144                       else
03145                         return(NOT_GRANTED);
03146                     }
03147                   /* if administrator, then grant */
03148                   if (i_attr_val1.system_role == SR_administrator)
03149                     return(GRANTED);
03150                   else
03151                     return(NOT_GRANTED);
03152                   
03153                 case T_DEV:
03154                   if(tid.dev.type == D_block)
03155                     return mac_check_role(owner, SR_administrator);
03156                   else
03157                     return DO_NOT_CARE;
03158 
03159                 case T_PROCESS:
03160                   /* and perform auto-write without setting attributes */
03161                   return(auto_write_attr(caller_pid,
03162                                          target,
03163                                          tid,
03164                                          A_current_sec_level,
03165                                          A_mac_curr_categories,
03166                                          FALSE));
03167 
03168 #ifdef CONFIG_RSBAC_MAC_NET_DEV_PROT
03169                 case T_NETDEV:
03170                   return mac_check_role(owner, SR_administrator);
03171 #endif
03172 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
03173                 case T_NETOBJ:
03174                   /* and perform auto-write without setting attributes */
03175                   return(auto_write_attr(caller_pid,
03176                                          target,
03177                                          tid,
03178                                          A_local_sec_level,
03179                                          A_local_mac_categories,
03180                                          FALSE));
03181 #endif
03182 
03183                 /* all other cases are unknown */
03184                 default: return(DO_NOT_CARE);
03185               }
03186 
03187         case R_MOUNT:
03188             switch(target)
03189               {
03190                 case T_FILE:
03191                 case T_DIR:
03192                 case T_DEV:
03193                   /* test owner's mac_role: Administrator? */
03194 #ifndef CONFIG_RSBAC_MAC_LIGHT
03195                   if(mac_check_role(owner, SR_administrator) == NOT_GRANTED)
03196                     return(NOT_GRANTED);
03197 #endif
03198                   /* test read-write access to mount dir / dev: */
03199                   /* and perform auto-read(-write) without setting of attributes */
03200                   if(   (target == T_DEV)
03201                      && (attr == A_mode)
03202                      && (attr_val.mode & MS_RDONLY))
03203                     return(auto_read(caller_pid,
03204                                      target,
03205                                      tid,
03206                                      FALSE));
03207                   else
03208                     return(auto_read_write(caller_pid,
03209                                            target,
03210                                            tid,
03211                                            FALSE));
03212 
03213                 /* all other cases are unknown */
03214                 default: return(DO_NOT_CARE);
03215               }
03216 
03217         case R_READ:
03218             switch(target)
03219               {
03220                 case T_DIR:
03221 #ifdef CONFIG_RSBAC_RW
03222                 case T_IPC:
03223                 case T_FILE:
03224                 case T_FIFO:
03225 #endif
03226                   /* and perform auto-read without setting attributes */
03227                   return(auto_read(caller_pid,
03228                                    target,
03229                                    tid,
03230                                    FALSE));
03231                   break;
03232 
03233 #ifdef CONFIG_RSBAC_RW
03234                 case T_DEV:
03235                   /* Only check for devices with mac_check set */
03236                   if (rsbac_get_attr(MAC,
03237                                      T_DEV,
03238                                      tid,
03239                                      A_mac_check,
03240                                      &i_attr_val1,
03241                                      FALSE))
03242                     {
03243                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03244                       return(NOT_GRANTED);
03245                     }
03246                   if(!i_attr_val1.mac_check)
03247                     return(DO_NOT_CARE);
03248                   /* and perform auto-read without setting attributes */
03249                   return(auto_read(caller_pid,
03250                                    target,
03251                                    tid,
03252                                    FALSE));
03253                   break;
03254 #endif
03255 
03256 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03257                 case T_NETTEMP:
03258                   if(mac_check_role(owner, SR_security_officer) == GRANTED)
03259                     return GRANTED;
03260                   return mac_check_role(owner, SR_administrator);
03261 
03262                 case T_NETOBJ:
03263                   /* and perform auto-read without setting attributes */
03264                   return(auto_read_attr(caller_pid,
03265                                         target,
03266                                         tid,
03267                                         A_remote_sec_level,
03268                                         A_remote_mac_categories,
03269                                         FALSE));
03270 #endif
03271 
03272 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03273                 case T_USER:
03274                 case T_GROUP:
03275                   /* Security Officer or Admin? */
03276                   if(mac_check_role(owner, SR_security_officer) == GRANTED)
03277                     return GRANTED;
03278                   else
03279                     return mac_check_role(owner, SR_administrator);
03280 #endif
03281                 /* all other cases are unknown */
03282                 default: return(DO_NOT_CARE);
03283               }
03284 
03285 
03286         case R_READ_ATTRIBUTE:
03287             switch(attr)
03288               {
03289                 case A_owner:
03290                 case A_security_level:
03291                 case A_local_sec_level:
03292                 case A_remote_sec_level:
03293                 case A_min_security_level:
03294                 case A_mac_categories:
03295                 case A_local_mac_categories:
03296                 case A_remote_mac_categories:
03297                 case A_mac_min_categories:
03298                 case A_pseudo:
03299                 case A_system_role:
03300                 case A_mac_role:
03301                 case A_current_sec_level:
03302                 case A_min_write_open:
03303                 case A_max_read_open:
03304                 case A_mac_user_flags:
03305                 case A_mac_process_flags:
03306                 case A_mac_check:
03307                 case A_mac_auto:
03308                 case A_mac_prop_trusted:
03309                 case A_mac_file_flags:
03310                 case A_initial_security_level:
03311                 case A_mac_initial_categories:
03312                 case A_symlink_add_mac_level:
03313                 #ifdef CONFIG_RSBAC_MAC_GEN_PROT
03314                 case A_log_array_low:
03315                 case A_log_array_high:
03316                 case A_log_program_based:
03317                 case A_log_user_based:
03318                 case A_symlink_add_remote_ip:
03319                 case A_symlink_add_uid:
03320                 case A_fake_root_uid:
03321                 case A_audit_uid:
03322                 case A_auid_exempt:
03323                 case A_remote_ip:
03324                 #endif
03325                 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
03326                 case A_auth_may_setuid:
03327                 case A_auth_may_set_cap:
03328                 case A_auth_start_uid:
03329                 case A_auth_start_euid:
03330                 case A_auth_start_gid:
03331                 case A_auth_start_egid:
03332                 case A_auth_program_file:
03333                 case A_auth_learn:
03334                 case A_auth_last_auth:
03335                 #endif
03336                   /* Security Officer ot Admin? */
03337                   if(mac_check_role(owner, SR_security_officer) == GRANTED)
03338                     return GRANTED;
03339                   else
03340                     return mac_check_role(owner, SR_administrator);
03341 
03342                 default:
03343                   return(DO_NOT_CARE);
03344               }
03345 
03346         case R_READ_OPEN:
03347             switch(target)
03348               {
03349                 case T_FILE:
03350                 case T_DIR:
03351                 case T_FIFO:
03352                 case T_IPC:
03353                   /* and perform auto-read without setting attributes */
03354                   return(auto_read(caller_pid,
03355                                    target,
03356                                    tid,
03357                                    FALSE));
03358                   break;
03359                 case T_DEV:
03360                   /* Only check for devices with mac_check set */
03361                   if (rsbac_get_attr(MAC,
03362                                      T_DEV,
03363                                      tid,
03364                                      A_mac_check,
03365                                      &i_attr_val1,
03366                                      FALSE))
03367                     {
03368                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03369                       return(NOT_GRANTED);
03370                     }
03371                   if(!i_attr_val1.mac_check)
03372                     return(DO_NOT_CARE);
03373                   /* and perform auto-read without setting attributes */
03374                   return(auto_read(caller_pid,
03375                                    target,
03376                                    tid,
03377                                    FALSE));
03378                   break;
03379                 /* all other cases are unknown */
03380                 default: return(DO_NOT_CARE);
03381               }
03382 
03383         case R_READ_WRITE_OPEN:
03384             switch(target)
03385               {
03386                 case T_FILE:
03387                 case T_FIFO:
03388                 case T_IPC:
03389                   /* and perform auto-read-write without setting attributes */
03390                   return(auto_read_write(caller_pid,
03391                                          target,
03392                                          tid,
03393                                          FALSE));
03394 
03395                 case T_DEV:
03396                   /* Only check for devices with mac_check set */
03397                   if (rsbac_get_attr(MAC,
03398                                      T_DEV,
03399                                      tid,
03400                                      A_mac_check,
03401                                      &i_attr_val1,
03402                                      FALSE))
03403                     {
03404                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03405                       return(NOT_GRANTED);
03406                     }
03407                   if(!i_attr_val1.mac_check)
03408                     return(DO_NOT_CARE);
03409                   /* and perform auto-read-write without setting attributes */
03410                   return(auto_read_write(caller_pid,
03411                                          target,
03412                                          tid,
03413                                          FALSE));
03414 
03415                 /* all other cases are unknown */
03416                 default: return(DO_NOT_CARE);
03417               }
03418 
03419         case R_REMOVE_FROM_KERNEL:
03420             switch(target)
03421               {
03422                 case T_FILE:
03423                 case T_DEV:
03424                 case T_NONE:
03425                   /* test owner's mac_role */
03426                   return mac_check_role(owner, SR_administrator);
03427 
03428                 /* all other cases are unknown */
03429                 default: return(DO_NOT_CARE);
03430               }
03431 
03432         case R_SHUTDOWN:
03433             switch(target)
03434               {
03435                 case T_NONE:
03436                   /* test owner's mac_role */
03437                   return mac_check_role(owner, SR_administrator);
03438 
03439                 /* all other cases are unknown */
03440                 default: return(DO_NOT_CARE);
03441               }
03442 
03443         case R_RENAME:
03444             switch(target)
03445               {
03446                 case T_FILE:
03447                 case T_DIR:
03448                 case T_FIFO:
03449                 case T_SYMLINK:
03450                   /* and perform auto-write without setting attributes */
03451                   result = auto_write(caller_pid,
03452                                       target,
03453                                       tid,
03454                                       FALSE);
03455                   /* if parent dir might change, convert inherit to explicit level/cat:
03456                      get and set effective value */
03457                   if(   (   (result == GRANTED)
03458                          || (result == DO_NOT_CARE)
03459                         )
03460                      && (   (attr != A_new_dir_dentry_p)
03461                          || (attr_val.new_dir_dentry_p != tid.file.dentry_p->d_parent)
03462                         )
03463                     )
03464                     {
03465                       if (rsbac_get_attr(MAC,
03466                                          target,
03467                                          tid,
03468                                          A_security_level,
03469                                          &i_attr_val1,
03470                                          TRUE))
03471                         { /* failed! */
03472                           rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03473                           return(NOT_GRANTED);
03474                         }
03475                       if(rsbac_set_attr(MAC,
03476                                         target,
03477                                         tid,
03478                                         A_security_level,
03479                                         i_attr_val1))
03480                         { /* failed! */
03481                           rsbac_ds_set_error("rsbac_adf_request_mac", A_none);
03482                           return(NOT_GRANTED);
03483                         }
03484                       if (rsbac_get_attr(MAC,
03485                                          target,
03486                                          tid,
03487                                          A_mac_categories,
03488                                          &i_attr_val1,
03489                                          TRUE))
03490                         { /* failed! */
03491                           rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03492                           return(NOT_GRANTED);
03493                         }
03494                       if(rsbac_set_attr(MAC,
03495                                         target,
03496                                         tid,
03497                                         A_mac_categories,
03498                                         i_attr_val1))
03499                         { /* failed! */
03500                           rsbac_ds_set_error("rsbac_adf_request_mac", A_none);
03501                           return(NOT_GRANTED);
03502                         }
03503                     }
03504                   return result;
03505                   break;
03506 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03507                 case T_USER:
03508                 case T_GROUP:
03509                   /* Security Officer? */
03510                   return mac_check_role(owner, SR_security_officer);
03511 #endif
03512                 /* all other cases are unknown */
03513                 default: return(DO_NOT_CARE);
03514               }
03515 
03516 
03517         case R_SEARCH:
03518             switch(target)
03519               {
03520                 case T_DIR:
03521                 case T_SYMLINK:
03522                   /* and perform auto-read without setting attributes */
03523                   return(auto_read(caller_pid,
03524                                    target,
03525                                    tid,
03526                                    FALSE));
03527                   break;
03528                 /* all other cases are unknown */
03529                 default: return(DO_NOT_CARE);
03530               }
03531 
03532         case R_SEND_SIGNAL:
03533             switch(target)
03534               {
03535                 case T_PROCESS:
03536                   /* and perform auto-write without setting attributes */
03537                   return(auto_write_attr(caller_pid,
03538                                          target,
03539                                          tid,
03540                                          A_current_sec_level,
03541                                          A_mac_curr_categories,
03542                                          FALSE));
03543 
03544                 /* all other cases are unknown */
03545                 default:
03546                   return(DO_NOT_CARE);
03547               }
03548 
03549 /*      case R_SHUTDOWN: see R_REMOVE_FROM_KERNEL */
03550 
03551         case R_SWITCH_LOG:
03552             switch(target)
03553               {
03554                 case T_NONE:
03555                   /* test owner's mac_role */
03556                   return mac_check_role(owner, SR_security_officer);
03557 
03558                 /* all other cases are unknown */
03559                 default: return(DO_NOT_CARE);
03560               }
03561 
03562         case R_SWITCH_MODULE:
03563             switch(target)
03564               {
03565                 case T_NONE:
03566                   /* we need the switch_target */
03567                   if(attr != A_switch_target)
03568                     return(UNDEFINED);
03569                   /* do not care for other modules */
03570                   if(   (attr_val.switch_target != MAC)
03571                      #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
03572                      && (attr_val.switch_target != AUTH)
03573                      #endif
03574                      #ifdef CONFIG_RSBAC_SOFTMODE
03575                      && (attr_val.switch_target != SOFTMODE)
03576                      #endif
03577                      #ifdef CONFIG_RSBAC_FREEZE
03578                      && (attr_val.switch_target != FREEZE)
03579                      #endif
03580                     )
03581                     return(DO_NOT_CARE);
03582                   /* test owner's mac_role */
03583                   return mac_check_role(owner, SR_security_officer);
03584 
03585                 /* all other cases are unknown */
03586                 default: return(DO_NOT_CARE);
03587               }
03588 
03589         /* notify only, handled by adf-dispatcher */
03590         case R_TERMINATE:
03591             if (target == T_PROCESS)
03592               return(DO_NOT_CARE);
03593             else
03594               return(DO_NOT_CARE);
03595 
03596         case R_TRACE:
03597             switch(target)
03598               {
03599                 case T_PROCESS:
03600                   /* and perform auto-read-write without setting attributes */
03601                   return(auto_read_write_attr(caller_pid,
03602                                               target,
03603                                               tid,
03604                                               A_current_sec_level,
03605                                               A_mac_curr_categories,
03606                                               FALSE));
03607 
03608                 /* all other cases are unknown */
03609                 default:
03610                   return(DO_NOT_CARE);
03611               }
03612 
03613         case R_TRUNCATE:
03614             switch(target)
03615               {
03616                 case T_FILE:
03617                   /* and perform auto-write without setting attributes */
03618                   return(auto_write(caller_pid,
03619                                     target,
03620                                     tid,
03621                                     FALSE));
03622                   break;
03623                 /* all other cases are unknown */
03624                 default: return(DO_NOT_CARE);
03625               }
03626 
03627         case R_UMOUNT:
03628             switch(target)
03629               {
03630                 case T_FILE:
03631                 case T_DIR:
03632                 case T_DEV:
03633 #ifdef CONFIG_RSBAC_MAC_LIGHT
03634                   return(GRANTED);
03635 #else
03636                   return mac_check_role(owner, SR_administrator);
03637 #endif
03638                 /* all other cases are unknown */
03639                 default: return(DO_NOT_CARE);
03640               }
03641 
03642         case R_WRITE:
03643             switch(target)
03644               {
03645                 case T_DIR: 
03646                 case T_IPC:
03647 #ifdef CONFIG_RSBAC_RW
03648                 case T_FILE:
03649                 case T_FIFO:
03650 #endif
03651                   /* Mode of created item is ignored! */
03652                   /* and perform auto-write without setting attributes */
03653                   return(auto_write(caller_pid,
03654                                     target,
03655                                     tid,
03656                                     FALSE));
03657                   
03658 
03659 #ifdef CONFIG_RSBAC_RW
03660                 case T_DEV:
03661                   /* Only check for devices with mac_check set */
03662                   if (rsbac_get_attr(MAC,
03663                                      T_DEV,
03664                                      tid,
03665                                      A_mac_check,
03666                                      &i_attr_val1,
03667                                      FALSE))
03668                     {
03669                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03670                       return(NOT_GRANTED);
03671                     }
03672                   if(!i_attr_val1.mac_check)
03673                     return(DO_NOT_CARE);
03674                   /* and perform auto-write without setting attributes */
03675                   return(auto_write(caller_pid,
03676                                     target,
03677                                     tid,
03678                                     FALSE));
03679                   break;
03680 #endif
03681 
03682 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03683                 case T_NETTEMP:
03684                   return mac_check_role(owner, SR_security_officer);
03685 
03686                 case T_NETOBJ:
03687                   /* test write access to target: get its sec_level */
03688                   if (rsbac_get_attr(MAC,
03689                                      target,
03690                                      tid,
03691                                      A_remote_sec_level,
03692                                      &i_attr_val1,
03693                                      TRUE))
03694                     {
03695                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03696                       return(NOT_GRANTED);
03697                     }
03698                   if (rsbac_get_attr(MAC,
03699                                      target,
03700                                      tid,
03701                                      A_remote_mac_categories,
03702                                      &i_attr_val2,
03703                                      TRUE))
03704                     {
03705                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03706                       return(NOT_GRANTED);
03707                     }
03708                   /* and perform auto-write without setting attributes */
03709                   return(auto_write_attr(caller_pid,
03710                                          target,
03711                                          tid,
03712                                          A_remote_sec_level,
03713                                          A_remote_mac_categories,
03714                                          FALSE));
03715 #endif
03716 
03717 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03718                 case T_USER:
03719                 case T_GROUP:
03720                   /* Security Officer? */
03721                   return mac_check_role(owner, SR_security_officer);
03722 #endif
03723                 /* all other cases are unknown */
03724                 default: return(DO_NOT_CARE);
03725               }
03726 
03727         case R_WRITE_OPEN:
03728             switch(target)
03729               {
03730                 case T_FILE:
03731                 case T_FIFO:
03732                 case T_IPC:
03733                   /* and perform auto-write without setting attributes */
03734                   return(auto_write(caller_pid,
03735                                     target,
03736                                     tid,
03737                                     FALSE));
03738                   break;
03739                 case T_DEV:
03740                   /* Only check for devices with mac_check set */
03741                   if (rsbac_get_attr(MAC,
03742                                      T_DEV,
03743                                      tid,
03744                                      A_mac_check,
03745                                      &i_attr_val1,
03746                                      FALSE))
03747                     {
03748                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03749                       return(NOT_GRANTED);
03750                     }
03751                   if(!i_attr_val1.mac_check)
03752                     return(DO_NOT_CARE);
03753                   /* and perform auto-write without setting attributes */
03754                   return(auto_write(caller_pid,
03755                                     target,
03756                                     tid,
03757                                     FALSE));
03758 
03759                 /* all other cases are unknown */
03760                 default: return(DO_NOT_CARE);
03761               }
03762 
03763         case R_SEND:
03764             switch(target)
03765               {
03766                 case T_DEV:
03767                   /* Only check for devices with mac_check set */
03768                   if (rsbac_get_attr(MAC,
03769                                      T_DEV,
03770                                      tid,
03771                                      A_mac_check,
03772                                      &i_attr_val1,
03773                                      FALSE))
03774                     {
03775                       rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03776                       return(NOT_GRANTED);
03777                     }
03778                   if(!i_attr_val1.mac_check)
03779                     return(DO_NOT_CARE);
03780                   /* and perform auto-write without setting attributes */
03781                   return(auto_write(caller_pid,
03782                                     target,
03783                                     tid,
03784                                     FALSE));
03785 
03786 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03787                 case T_NETOBJ:
03788                   /* and perform auto-read-write without setting attributes */
03789                   return(auto_read_write_attr(caller_pid,
03790                                               target,
03791                                               tid,
03792                                               A_remote_sec_level,
03793                                               A_remote_mac_categories,
03794                                               FALSE));
03795 
03796 #endif
03797                 /* all other cases are unknown */
03798                 default: return(DO_NOT_CARE);
03799               }
03800 
03801 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03802         case R_BIND:
03803         case R_LISTEN:
03804             switch(target)
03805               {
03806                 case T_NETOBJ:
03807                   /* and perform auto-read-write without setting attributes */
03808                   return(auto_read_write_attr(caller_pid,
03809                                               target,
03810                                               tid,
03811                                               A_local_sec_level,
03812                                               A_local_mac_categories,
03813                                               FALSE));
03814 
03815                 /* all other cases are unknown */
03816                 default: return(DO_NOT_CARE);
03817               }
03818 
03819         case R_ACCEPT:
03820         case R_CONNECT:
03821         case R_RECEIVE:
03822             switch(target)
03823               {
03824                 case T_NETOBJ:
03825                   /* and perform auto-read-write without setting attributes */
03826                   return(auto_read_write_attr(caller_pid,
03827                                               target,
03828                                               tid,
03829                                               A_remote_sec_level,
03830                                               A_remote_mac_categories,
03831                                               FALSE));
03832 
03833                 /* all other cases are unknown */
03834                 default: return(DO_NOT_CARE);
03835               }
03836 #endif /* NET_OBJ_PROT */
03837 
03838 /*********************/
03839         default: return DO_NOT_CARE;
03840       }
03841 
03842     return(result);
03843   } /* end of rsbac_adf_request_mac() */

int rsbac_adf_set_attr_mac enum rsbac_adf_request_t  request,
rsbac_pid_t  caller_pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_target_t  new_target,
union rsbac_target_id_t  new_tid,
enum rsbac_attribute_t  attr,
union rsbac_attribute_value_t  attr_val,
rsbac_uid_t  owner
 

Definition at line 3857 of file mac_main.c.

References A_current_sec_level, A_initial_security_level, A_local_mac_categories, A_local_sec_level, A_mac_auto, A_mac_categories, A_mac_check, A_mac_curr_categories, A_mac_initial_categories, A_mac_min_categories, A_mac_process_flags, A_mac_prop_trusted, A_mac_user_flags, A_max_read_categories, A_max_read_open, A_min_security_level, A_min_write_categories, A_min_write_open, A_none, A_remote_mac_categories, A_remote_sec_level, A_security_level, auto_read(), auto_read_attr(), auto_read_write(), auto_read_write_attr(), auto_write(), auto_write_attr(), DO_NOT_CARE, FALSE, GRANTED, MAC, MAC_allow_auto, rsbac_attribute_value_t::mac_auto, MAC_auto, rsbac_attribute_value_t::mac_categories, rsbac_attribute_value_t::mac_check, rsbac_attribute_value_t::mac_process_flags, MAC_program_auto, rsbac_attribute_value_t::mac_prop_trusted, MAC_trusted, rsbac_attribute_value_t::mac_user_flags, rsbac_attribute_value_t::max_read_open, rsbac_attribute_value_t::min_write_open, rsbac_attribute_value_t::owner, rsbac_target_id_t::process, R_ACCEPT, R_APPEND_OPEN, R_BIND, R_CHANGE_OWNER, R_CLONE, R_CONNECT, R_CREATE, R_DELETE, R_EXECUTE, R_LISTEN, R_MOUNT, R_READ, R_READ_OPEN, R_READ_WRITE_OPEN, R_RECEIVE, R_SEARCH, R_SEND, R_TRACE, R_WRITE, R_WRITE_OPEN, RSBAC_EDECISIONMISMATCH, RSBAC_EINVALIDATTR, RSBAC_EREADFAILED, RSBAC_EWRITEFAILED, rsbac_get_attr, rsbac_mac_copy_fp_truset(), rsbac_mac_copy_pp_truset(), RSBAC_MAC_MAX_CAT_VECTOR, RSBAC_MAC_MIN_CAT_VECTOR, RSBAC_MAC_P_FLAGS, rsbac_mac_p_truset_member(), rsbac_printk(), rsbac_set_attr, rsbac_attribute_value_t::security_level, SL_max, SL_min, T_DEV, T_DIR, T_FIFO, T_FILE, T_IPC, T_NETOBJ, T_PROCESS, T_SYMLINK, T_USER, TRUE, and rsbac_target_id_t::user.

Referenced by rsbac_adf_set_attr().

03867   {
03868     enum  rsbac_adf_req_ret_t result = DO_NOT_CARE;
03869     union rsbac_target_id_t       i_tid;
03870     union rsbac_attribute_value_t i_attr_val1;
03871     union rsbac_attribute_value_t i_attr_val2;
03872     union rsbac_attribute_value_t i_attr_val3;
03873     union rsbac_attribute_value_t i_attr_val4;
03874     union rsbac_attribute_value_t i_attr_val5;
03875     union rsbac_attribute_value_t i_attr_val6;
03876     union rsbac_attribute_value_t i_attr_val7;
03877     union rsbac_attribute_value_t i_attr_val8;
03878     union rsbac_attribute_value_t i_attr_val9;
03879     rsbac_boolean_t inherit;
03880 
03881     switch (request)
03882       {
03883         case R_APPEND_OPEN:
03884             switch(target)
03885               {
03886                 case T_FILE:
03887                 case T_FIFO:
03888                 case T_IPC:
03889                   /* test write access to target: get its sec_level */
03890                   if(   (target == T_FILE)
03891                      || (target == T_FIFO)
03892                     )
03893                     inherit = TRUE;
03894                   else
03895                     inherit = FALSE;
03896                   if (rsbac_get_attr(MAC,
03897                                      target,
03898                                      tid,
03899                                      A_security_level,
03900                                      &i_attr_val1,
03901                                      inherit))
03902                     {
03903                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03904                       return(-RSBAC_EREADFAILED);
03905                     }
03906                   if (rsbac_get_attr(MAC,
03907                                      target,
03908                                      tid,
03909                                      A_mac_categories,
03910                                      &i_attr_val2,
03911                                      inherit))
03912                     {
03913                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03914                       return(-RSBAC_EREADFAILED);
03915                     }
03916                   /* and perform auto-write with setting attributes */
03917                   result = auto_write(caller_pid,
03918                                       target,
03919                                       tid,
03920                                       TRUE);
03921                   if ((result == GRANTED) || (result == DO_NOT_CARE))
03922                     return(0);
03923                   else
03924                     return(-RSBAC_EDECISIONMISMATCH);
03925                   break;
03926                 case T_DEV:
03927                   /* Only check for devices with mac_check set */
03928                   if (rsbac_get_attr(MAC,
03929                                      T_DEV,
03930                                      tid,
03931                                      A_mac_check,
03932                                      &i_attr_val1,
03933                                      FALSE))
03934                     {
03935                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03936                       return(-RSBAC_EREADFAILED);
03937                     }
03938                   if(!i_attr_val1.mac_check)
03939                     return(0);
03940                   /* and perform auto-write with setting attributes */
03941                   result = auto_write(caller_pid,
03942                                       target,
03943                                       tid,
03944                                       TRUE);
03945                   if ((result == GRANTED) || (result == DO_NOT_CARE))
03946                     return(0);
03947                   else
03948                     return(-RSBAC_EDECISIONMISMATCH);
03949                   break;
03950                 /* all other cases are unknown */
03951                 default: return(0);
03952               }
03953 
03954         case R_CHANGE_OWNER:
03955             switch(target)
03956               {
03957                 /*  Changing process owner affects access decisions, */
03958                 /*  so attributes have to be adjusted.               */
03959                 case T_PROCESS:
03960                   /* For target process there MUST be a new owner specified */
03961                   if (attr != A_owner)
03962                     return(-RSBAC_EINVALIDATTR);
03963 
03964                   /* Get owner-sec-level and mac_categories for new owner */
03965                   i_tid.user = attr_val.owner;
03966                   if (rsbac_get_attr(MAC,
03967                                      T_USER,
03968                                      i_tid,
03969                                      A_security_level,
03970                                      &i_attr_val2,
03971                                      TRUE))
03972                     {
03973                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03974                       return(-RSBAC_EREADFAILED);
03975                     }
03976                   if (rsbac_get_attr(MAC,
03977                                      T_USER,
03978                                      i_tid,
03979                                      A_mac_categories,
03980                                      &i_attr_val3,
03981                                      TRUE))
03982                     {
03983                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03984                       return(-RSBAC_EREADFAILED);
03985                     }
03986                   /* set owner-sec-level and mac_categories for process to new values */
03987                   if (rsbac_set_attr(MAC,
03988                                      T_PROCESS,
03989                                      tid,
03990                                      A_security_level,
03991                                      i_attr_val2))
03992                     {
03993                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
03994                       return(-RSBAC_EWRITEFAILED);
03995                     }
03996                   if (rsbac_set_attr(MAC,
03997                                      T_PROCESS,
03998                                      tid,
03999                                      A_mac_categories,
04000                                      i_attr_val3))
04001                     {
04002                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04003                       return(-RSBAC_EWRITEFAILED);
04004                     }
04005                   /* Get min_write_open and min_write_categories of process */
04006                   if (rsbac_get_attr(MAC,
04007                                      T_PROCESS,
04008                                      tid,
04009                                      A_min_write_open,
04010                                      &i_attr_val4,
04011                                      TRUE))
04012                     {
04013                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04014                       return(-RSBAC_EREADFAILED);
04015                     }
04016                   if (rsbac_get_attr(MAC,
04017                                      T_PROCESS,
04018                                      tid,
04019                                      A_min_write_categories,
04020                                      &i_attr_val5,
04021                                      TRUE))
04022                     {
04023                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04024                       return(-RSBAC_EREADFAILED);
04025                     }
04026                   /* adjust min_write_open and min_write_categories, if too high */
04027                   if(i_attr_val2.security_level < i_attr_val4.min_write_open)
04028                     {
04029                       i_attr_val4.min_write_open = i_attr_val2.security_level;
04030                       if(rsbac_set_attr(MAC,
04031                                         T_PROCESS,
04032                                         tid,
04033                                         A_min_write_open,
04034                                         i_attr_val4))
04035                         {
04036                           rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04037                           return(-RSBAC_EWRITEFAILED);
04038                         }
04039                     }
04040                   /* does process have categories in min_write that the new owner has not? */
04041                   /* If yes, throw them out. */
04042                   if ((i_attr_val3.mac_categories & i_attr_val5.mac_categories)
04043                        != i_attr_val5.mac_categories)
04044                     {
04045                       i_attr_val5.mac_categories &= i_attr_val3.mac_categories;
04046                       if(rsbac_set_attr(MAC,
04047                                         T_PROCESS,
04048                                         tid,
04049                                         A_min_write_categories,
04050                                         i_attr_val5))
04051                         {
04052                           rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04053                           return(-RSBAC_EWRITEFAILED);
04054                         }
04055                     }
04056                   /* Get owner-initial-sec-level and mac_initial_categories for new owner */
04057                   /* These values will be adjusted by max_read / min_write and then used as */
04058                   /* new current level/categories. */
04059                   i_tid.user = attr_val.owner;
04060                   if (rsbac_get_attr(MAC,
04061                                      T_USER,
04062                                      i_tid,
04063                                      A_initial_security_level,
04064                                      &i_attr_val6,
04065                                      TRUE))
04066                     {
04067                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04068                       return(-RSBAC_EREADFAILED);
04069                     }
04070                   if (rsbac_set_attr(MAC,
04071                                      T_PROCESS,
04072                                      tid,
04073                                      A_initial_security_level,
04074                                      i_attr_val6))
04075                     {
04076                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04077                       return(-RSBAC_EWRITEFAILED);
04078                     }
04079 #if 0
04080                   /* restrict current_level to be a maximum of min_write */
04081                   if(i_attr_val6.security_level > i_attr_val4.min_write_open)
04082                     i_attr_val6.security_level = i_attr_val4.min_write_open;
04083 #endif
04084                   if (rsbac_get_attr(MAC,
04085                                      T_USER,
04086                                      i_tid,
04087                                      A_mac_initial_categories,
04088                                      &i_attr_val7,
04089                                      TRUE))
04090                     {
04091                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04092                       return(-RSBAC_EREADFAILED);
04093                     }
04094                   if (rsbac_set_attr(MAC,
04095                                      T_PROCESS,
04096                                      tid,
04097                                      A_mac_initial_categories,
04098                                      i_attr_val7))
04099                     {
04100                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04101                       return(-RSBAC_EWRITEFAILED);
04102                     }
04103 #if 0
04104                   /* restrict current_categories to be a maximum of min_write */
04105                   if((i_attr_val7.mac_categories & i_attr_val5.mac_categories) != i_attr_val7.mac_categories)
04106                     i_attr_val7.mac_categories &= i_attr_val5.mac_categories;
04107 #endif
04108                   /* Get owner-min-sec-level and mac_min_categories for new owner */
04109                   i_tid.user = attr_val.owner;
04110                   if (rsbac_get_attr(MAC,
04111                                      T_USER,
04112                                      i_tid,
04113                                      A_min_security_level,
04114                                      &i_attr_val8,
04115                                      TRUE))
04116                     {
04117                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04118                       return(-RSBAC_EREADFAILED);
04119                     }
04120                   if (rsbac_get_attr(MAC,
04121                                      T_USER,
04122                                      i_tid,
04123                                      A_mac_min_categories,
04124                                      &i_attr_val9,
04125                                      TRUE))
04126                     {
04127                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04128                       return(-RSBAC_EREADFAILED);
04129                     }
04130                   /* set owner-sec-level and mac_categories for process to new values */
04131                   /* owner is set by main dispatcher! */
04132                   if (rsbac_set_attr(MAC,
04133                                      T_PROCESS,
04134                                      tid,
04135                                      A_min_security_level,
04136                                      i_attr_val8))
04137                     {
04138                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04139                       return(-RSBAC_EWRITEFAILED);
04140                     }
04141                   if (rsbac_set_attr(MAC,
04142                                      T_PROCESS,
04143                                      tid,
04144                                      A_mac_min_categories,
04145                                      i_attr_val9))
04146                     {
04147                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04148                       return(-RSBAC_EWRITEFAILED);
04149                     }
04150                   /* Get max_read_open and max_read_categories of process */
04151                   if (rsbac_get_attr(MAC,
04152                                      T_PROCESS,
04153                                      tid,
04154                                      A_max_read_open,
04155                                      &i_attr_val4,
04156                                      TRUE))
04157                     {
04158                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04159                       return(-RSBAC_EREADFAILED);
04160                     }
04161                   if (rsbac_get_attr(MAC,
04162                                      T_PROCESS,
04163                                      tid,
04164                                      A_max_read_categories,
04165                                      &i_attr_val5,
04166                                      TRUE))
04167                     {
04168                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04169                       return(-RSBAC_EREADFAILED);
04170                     }
04171                   /* adjust max_read_open and max_read_categories, if too low */
04172                   if (i_attr_val8.security_level > i_attr_val4.max_read_open)
04173                     {
04174                       i_attr_val4.max_read_open = i_attr_val8.security_level;
04175                       if(rsbac_set_attr(MAC,
04176                                         T_PROCESS,
04177                                         tid,
04178                                         A_max_read_open,
04179                                         i_attr_val4))
04180                         {
04181                           rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04182                           return(-RSBAC_EWRITEFAILED);
04183                         }
04184                     }
04185 #if 0
04186                   /* adjust current sec level to a minimum of max_read */
04187                   if(i_attr_val6.security_level < i_attr_val4.max_read_open)
04188                     i_attr_val6.security_level = i_attr_val4.max_read_open;
04189 #endif
04190                   /* but never set it over new max_level or under new min_level */
04191                   if(i_attr_val6.security_level > i_attr_val2.security_level)
04192                     i_attr_val6.security_level = i_attr_val2.security_level;
04193                   else
04194                     if(i_attr_val6.security_level < i_attr_val8.security_level)
04195                       i_attr_val6.security_level = i_attr_val8.security_level;
04196                   if(rsbac_set_attr(MAC,
04197                                     T_PROCESS,
04198                                     tid,
04199                                     A_current_sec_level,
04200                                     i_attr_val6))
04201                     {
04202                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04203                       return(-RSBAC_EWRITEFAILED);
04204                     }
04205 
04206                   /* does new owner have categories in min_categories that the process max_read 
04207                      has not? */
04208                   /* If yes, add them. */
04209                   if ((i_attr_val9.mac_categories & i_attr_val5.mac_categories)
04210                        != i_attr_val9.mac_categories)
04211                     {
04212                       i_attr_val5.mac_categories |= i_attr_val9.mac_categories;
04213                       if(rsbac_set_attr(MAC,
04214                                         T_PROCESS,
04215                                         tid,
04216                                         A_max_read_categories,
04217                                         i_attr_val5))
04218                         {
04219                           rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04220                           return(-RSBAC_EWRITEFAILED);
04221                         }
04222                     }
04223 #if 0
04224                   /* adjust current categories to include all from max_read (from initial) */
04225                   if((i_attr_val7.mac_categories & i_attr_val5.mac_categories) != i_attr_val5.mac_categories)
04226                     i_attr_val7.mac_categories |= i_attr_val5.mac_categories;
04227 #endif
04228                   /* but never set it over new max_cats or under new min_cats */
04229                   if((i_attr_val7.mac_categories & i_attr_val3.mac_categories) != i_attr_val7.mac_categories)
04230                     i_attr_val7.mac_categories &= i_attr_val3.mac_categories;
04231                   else
04232                     if((i_attr_val7.mac_categories & i_attr_val9.mac_categories) != i_attr_val9.mac_categories)
04233                       i_attr_val7.mac_categories |= i_attr_val9.mac_categories;
04234                   if(rsbac_set_attr(MAC,
04235                                     T_PROCESS,
04236                                     tid,
04237                                     A_mac_curr_categories,
04238                                     i_attr_val7))
04239                     {
04240                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04241                       return(-RSBAC_EWRITEFAILED);
04242                     }
04243 
04244                   /* Get mac_user_flags from user */
04245                   i_tid.user = attr_val.owner;
04246                   if (rsbac_get_attr(MAC,
04247                                      T_USER,
04248                                      i_tid,
04249                                      A_mac_user_flags,
04250                                      &i_attr_val3,
04251                                      TRUE))
04252                     {
04253                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04254                       return(-RSBAC_EREADFAILED);
04255                     }
04256                   i_attr_val1.mac_process_flags = i_attr_val3.mac_user_flags;
04257                   /* adjust flags - first get old process flags*/
04258                   if (rsbac_get_attr(MAC,
04259                                      T_PROCESS,
04260                                      tid,
04261                                      A_mac_process_flags,
04262                                      &i_attr_val2,
04263                                      TRUE))
04264                     {
04265                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04266                       return(-RSBAC_EREADFAILED);
04267                     }
04268                   if(   (i_attr_val2.mac_process_flags & MAC_program_auto)
04269                      && (i_attr_val3.mac_user_flags & MAC_allow_auto)
04270                     )
04271                     i_attr_val1.mac_process_flags |= MAC_auto;
04272 
04273                   i_attr_val1.mac_process_flags &= RSBAC_MAC_P_FLAGS;
04274 
04275                   if(!(i_attr_val1.mac_process_flags & MAC_trusted))
04276                     {
04277                       if(rsbac_mac_p_truset_member(caller_pid, attr_val.owner))
04278                         i_attr_val1.mac_process_flags |= MAC_trusted;
04279                     }
04280                   /* Set mac_process_flags on process */
04281                   if (rsbac_set_attr(MAC,
04282                                      T_PROCESS,
04283                                      tid,
04284                                      A_mac_process_flags,
04285                                      i_attr_val1))
04286                     {
04287                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04288                       return(-RSBAC_EWRITEFAILED);
04289                     }
04290                   /* OK, we are ready */
04291                   return(0);
04292 
04293                 /* We do not care about other cases here */
04294                 default:
04295                   return(0);
04296               }
04297 
04298         case R_CLONE:
04299             if (target == T_PROCESS)
04300               {
04301                   /* Get owner from first process (provided on call) */
04302                   i_attr_val1.owner = owner;
04303                   /* Get owner-sec-level from first process */
04304                   if (rsbac_get_attr(MAC,
04305                                      T_PROCESS,
04306                                      tid,
04307                                      A_security_level,
04308                                      &i_attr_val2,
04309                                      FALSE))
04310                     {
04311                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04312                       return(-RSBAC_EREADFAILED);
04313                     }
04314                   /* Get current-sec-level from first process... */
04315                   if (rsbac_get_attr(MAC,
04316                                      T_PROCESS,
04317                                      tid,
04318                                      A_current_sec_level,
04319                                      &i_attr_val3,
04320                                      FALSE))
04321                     {
04322                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04323                       return(-RSBAC_EREADFAILED);
04324                     }
04325                   /* Get min_write_open from first process */
04326                   if (rsbac_get_attr(MAC,
04327                                      T_PROCESS,
04328                                      tid,
04329                                      A_min_write_open,
04330                                      &i_attr_val4,
04331                                      FALSE))
04332                     {
04333                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04334                       return(-RSBAC_EREADFAILED);
04335                     }
04336                   /* Get max_read_open from first process */
04337                   if (rsbac_get_attr(MAC,
04338                                      T_PROCESS,
04339                                      tid,
04340                                      A_max_read_open,
04341                                      &i_attr_val5,
04342                                      FALSE))
04343                     {
04344                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04345                       return(-RSBAC_EREADFAILED);
04346                     }
04347                   /* Get mac_process_flags from first process */
04348                   if (rsbac_get_attr(MAC,
04349                                      T_PROCESS,
04350                                      tid,
04351                                      A_mac_process_flags,
04352                                      &i_attr_val7,
04353                                      FALSE))
04354                     {
04355                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04356                       return(-RSBAC_EREADFAILED);
04357                     }
04358 
04359 #ifdef CONFIG_RSBAC_USE_RSBAC_OWNER
04360                   /* Set owner for new process */
04361                   if (rsbac_set_attr(MAC,
04362                                      T_PROCESS,
04363                                      new_tid,
04364                                      A_owner,
04365                                      i_attr_val1))
04366                     {
04367                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04368                       return(-RSBAC_EWRITEFAILED);
04369                     }
04370 #endif
04371                   /* Set owner_sec_level for new process */
04372                   if (rsbac_set_attr(MAC,
04373                                      T_PROCESS,
04374                                      new_tid,
04375                                      A_security_level,
04376                                      i_attr_val2))
04377                     {
04378                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04379                       return(-RSBAC_EWRITEFAILED);
04380                     }
04381                   /* Set current_sec_level for new process */
04382                   if (rsbac_set_attr(MAC,
04383                                      T_PROCESS,
04384                                      new_tid,
04385                                      A_current_sec_level,
04386                                      i_attr_val3))
04387                     {
04388                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04389                       return(-RSBAC_EWRITEFAILED);
04390                     }
04391                   /* Set min_write_open for new process */
04392                   if (rsbac_set_attr(MAC,
04393                                      T_PROCESS,
04394                                      new_tid,
04395                                      A_min_write_open,
04396                                      i_attr_val4))
04397                     {
04398                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04399                       return(-RSBAC_EWRITEFAILED);
04400                     }
04401                   /* Set max_read_open for new process */
04402                   if (rsbac_set_attr(MAC,
04403                                      T_PROCESS,
04404                                      new_tid,
04405                                      A_max_read_open,
04406                                      i_attr_val5))
04407                     {
04408                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04409                       return(-RSBAC_EWRITEFAILED);
04410                     }
04411                   /* Set mac_process_flags for new process */
04412                   if (rsbac_set_attr(MAC,
04413                                      T_PROCESS,
04414                                      new_tid,
04415                                      A_mac_process_flags,
04416                                      i_attr_val7))
04417                     {
04418                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04419                       return(-RSBAC_EWRITEFAILED);
04420                     }
04421 
04422                   /* Get mac_categories from first process */
04423                   if (rsbac_get_attr(MAC,
04424                                      T_PROCESS,
04425                                      tid,
04426                                      A_mac_categories,
04427                                      &i_attr_val2,
04428                                      FALSE))
04429                     {
04430                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04431                       return(-RSBAC_EREADFAILED);
04432                     }
04433                   /* Get mac_curr_categories from first process... */
04434                   if (rsbac_get_attr(MAC,
04435                                      T_PROCESS,
04436                                      tid,
04437                                      A_mac_curr_categories,
04438                                      &i_attr_val3,
04439                                      FALSE))
04440                     {
04441                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04442                       return(-RSBAC_EREADFAILED);
04443                     }
04444                   /* Get min_write_categories from first process */
04445                   if (rsbac_get_attr(MAC,
04446                                      T_PROCESS,
04447                                      tid,
04448                                      A_min_write_categories,
04449                                      &i_attr_val4,
04450                                      FALSE))
04451                     {
04452                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04453                       return(-RSBAC_EREADFAILED);
04454                     }
04455                   /* Get max_read_categories from first process */
04456                   if (rsbac_get_attr(MAC,
04457                                      T_PROCESS,
04458                                      tid,
04459                                      A_max_read_categories,
04460                                      &i_attr_val5,
04461                                      FALSE))
04462                     {
04463                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04464                       return(-RSBAC_EREADFAILED);
04465                     }
04466                   /* Get initial_sec_level from first process */
04467                   if (rsbac_get_attr(MAC,
04468                                      T_PROCESS,
04469                                      tid,
04470                                      A_initial_security_level,
04471                                      &i_attr_val6,
04472                                      FALSE))
04473                     {
04474                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04475                       return(-RSBAC_EREADFAILED);
04476                     }
04477                   /* Get initial_categories from first process */
04478                   if (rsbac_get_attr(MAC,
04479                                      T_PROCESS,
04480                                      tid,
04481                                      A_mac_initial_categories,
04482                                      &i_attr_val7,
04483                                      FALSE))
04484                     {
04485                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04486                       return(-RSBAC_EREADFAILED);
04487                     }
04488                   /* Set mac_categories for new process */
04489                   if (rsbac_set_attr(MAC,
04490                                      T_PROCESS,
04491                                      new_tid,
04492                                      A_mac_categories,
04493                                      i_attr_val2))
04494                     {
04495                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04496                       return(-RSBAC_EWRITEFAILED);
04497                     }
04498                   /* Set mac_curr_categories for new process */
04499                   if (rsbac_set_attr(MAC,
04500                                      T_PROCESS,
04501                                      new_tid,
04502                                      A_mac_curr_categories,
04503                                      i_attr_val3))
04504                     {
04505                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04506                       return(-RSBAC_EWRITEFAILED);
04507                     }
04508                   /* Set min_write_categories for new process */
04509                   if (rsbac_set_attr(MAC,
04510                                      T_PROCESS,
04511                                      new_tid,
04512                                      A_min_write_categories,
04513                                      i_attr_val4))
04514                     {
04515                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04516                       return(-RSBAC_EWRITEFAILED);
04517                     }
04518                   /* Set max_read_categories for new process */
04519                   if (rsbac_set_attr(MAC,
04520                                      T_PROCESS,
04521                                      new_tid,
04522                                      A_max_read_categories,
04523                                      i_attr_val5))
04524                     {
04525                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04526                       return(-RSBAC_EWRITEFAILED);
04527                     }
04528                   /* Set initial_security_level for new process */
04529                   if (rsbac_set_attr(MAC,
04530                                      T_PROCESS,
04531                                      new_tid,
04532                                      A_initial_security_level,
04533                                      i_attr_val6))
04534                     {
04535                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04536                       return(-RSBAC_EWRITEFAILED);
04537                     }
04538                   /* Set initial_categories for new process */
04539                   if (rsbac_set_attr(MAC,
04540                                      T_PROCESS,
04541                                      new_tid,
04542                                      A_mac_initial_categories,
04543                                      i_attr_val7))
04544                     {
04545                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04546                       return(-RSBAC_EWRITEFAILED);
04547                     }
04548                   /* Get owner-min_sec-level/cat from first process */
04549                   if (rsbac_get_attr(MAC,
04550                                      T_PROCESS,
04551                                      tid,
04552                                      A_min_security_level,
04553                                      &i_attr_val2,
04554                                      FALSE))
04555                     {
04556                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04557                       return(-RSBAC_EREADFAILED);
04558                     }
04559                   if (rsbac_get_attr(MAC,
04560                                      T_PROCESS,
04561                                      tid,
04562                                      A_mac_min_categories,
04563                                      &i_attr_val3,
04564                                      FALSE))
04565                     {
04566                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04567                       return(-RSBAC_EREADFAILED);
04568                     }
04569                   /* Set min_security_level for new process */
04570                   if (rsbac_set_attr(MAC,
04571                                      T_PROCESS,
04572                                      new_tid,
04573                                      A_min_security_level,
04574                                      i_attr_val2))
04575                     {
04576                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04577                       return(-RSBAC_EWRITEFAILED);
04578                     }
04579                   /* Set min_categories for new process */
04580                   if (rsbac_set_attr(MAC,
04581                                      T_PROCESS,
04582                                      new_tid,
04583                                      A_mac_min_categories,
04584                                      i_attr_val3))
04585                     {
04586                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04587                       return(-RSBAC_EWRITEFAILED);
04588                     }
04589                   if (rsbac_mac_copy_pp_truset(tid.process, new_tid.process))
04590                     {
04591                       rsbac_printk(KERN_WARNING
04592                              "rsbac_adf_set_attr_mac(): rsbac_mac_copy_pp_truset() returned error!\n");
04593                       return(-RSBAC_EWRITEFAILED);
04594                     }
04595                 return(0);
04596               }
04597             else
04598               return(0);
04599 
04600         case R_CREATE:
04601             switch(target)
04602               {
04603                 /* Creating dir or (pseudo) file IN target dir! */
04604                 case T_DIR:
04605                   /* Mode of created item is ignored! */
04606                   /* and perform auto-write without(!) setting of attributes - no need */
04607                   /* -> decision consistency check only */
04608                   /* only check, if not MAC_LIGHT */
04609 #ifndef CONFIG_RSBAC_MAC_LIGHT
04610                   result = auto_write(caller_pid,
04611                                       target,
04612                                       tid,
04613                                       FALSE);
04614                   if ((result != GRANTED) && (result != DO_NOT_CARE))
04615                     return(-RSBAC_EDECISIONMISMATCH);
04616 #endif
04617                   /* test write access to target: get its sec_level */
04618                   if (rsbac_get_attr(MAC,
04619                                      T_DIR,
04620                                      tid,
04621                                      A_security_level,
04622                                      &i_attr_val1,
04623                                      TRUE))
04624                     {
04625                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04626                       return(-RSBAC_EREADFAILED);
04627                     }
04628                   if (rsbac_get_attr(MAC,
04629                                      T_DIR,
04630                                      tid,
04631                                      A_mac_categories,
04632                                      &i_attr_val2,
04633                                      TRUE))
04634                     {
04635                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04636                       return(-RSBAC_EREADFAILED);
04637                     }
04638                   /* Get current_sec_level from process (initialized to owner_sec_level)... */
04639                   i_tid.process = caller_pid;
04640                   if (rsbac_get_attr(MAC,
04641                                      T_PROCESS,
04642                                      i_tid,
04643                                      A_current_sec_level,
04644                                      &i_attr_val3,
04645                                      FALSE))
04646                     {
04647                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04648                       return(-RSBAC_EREADFAILED);
04649                     }
04650 #ifdef CONFIG_RSBAC_MAC_SMART_INHERIT
04651                   /* Only set, if different than inherited value */
04652                   if(i_attr_val3.security_level != i_attr_val1.security_level)
04653 #endif
04654                     /* Set security-level for new item */
04655                     if (rsbac_set_attr(MAC,
04656                                        new_target,
04657                                        new_tid,
04658                                        A_security_level,
04659                                        i_attr_val3))
04660                       {
04661                         rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04662                         return(-RSBAC_EWRITEFAILED);
04663                       }
04664                   /* Get current_categories from process (initialized to owner_categories)... */
04665                   if (rsbac_get_attr(MAC,
04666                                      T_PROCESS,
04667                                      i_tid,
04668                                      A_mac_curr_categories,
04669                                      &i_attr_val3,
04670                                      FALSE))
04671                     {
04672                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04673                       return(-RSBAC_EREADFAILED);
04674                     }
04675 #ifdef CONFIG_RSBAC_MAC_SMART_INHERIT
04676                   /* Only set, if different than inherited value */
04677                   if(i_attr_val3.mac_categories != i_attr_val2.mac_categories)
04678 #endif
04679                     /* Set mac_categories for new item */
04680                     if (rsbac_set_attr(MAC,
04681                                        new_target,
04682                                        new_tid,
04683                                        A_mac_categories,
04684                                        i_attr_val3))
04685                       {
04686                         rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04687                         return(-RSBAC_EWRITEFAILED);
04688                       }
04689                   return(0);
04690                   break;
04691 
04692                 case T_IPC: 
04693                   i_tid.process = caller_pid;
04694                   /* Get current-sec-level from process... */
04695                   if (rsbac_get_attr(MAC,
04696                                      T_PROCESS,
04697                                      i_tid,
04698                                      A_current_sec_level,
04699                                      &i_attr_val1,
04700                                      FALSE))
04701                     {
04702                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04703                       return(-RSBAC_EREADFAILED);
04704                     }
04705                   /* Set security-level for this ipc item */
04706                   if (rsbac_set_attr(MAC,
04707                                      T_IPC,
04708                                      tid,
04709                                      A_security_level,
04710                                      i_attr_val1))
04711                     {
04712                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04713                       return(-RSBAC_EWRITEFAILED);
04714                     }
04715                   /* Get mac_curr_categories from process... */
04716                   if (rsbac_get_attr(MAC,
04717                                      T_PROCESS,
04718                                      i_tid,
04719                                      A_mac_curr_categories,
04720                                      &i_attr_val1,
04721                                      FALSE))
04722                     {
04723                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04724                       return(-RSBAC_EREADFAILED);
04725                     }
04726                   /* Set curr_categories for new item */
04727                   if (rsbac_set_attr(MAC,
04728                                      T_IPC,
04729                                      tid,
04730                                      A_mac_categories,
04731                                      i_attr_val1))
04732                     {
04733                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04734                       return(-RSBAC_EWRITEFAILED);
04735                     }
04736                   return(0);
04737                   break;
04738 
04739 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
04740                 case T_NETOBJ:
04741                   i_tid.process = caller_pid;
04742                   /* Get current-sec-level from process... */
04743                   if (rsbac_get_attr(MAC,
04744                                      T_PROCESS,
04745                                      i_tid,
04746                                      A_current_sec_level,
04747                                      &i_attr_val1,
04748                                      FALSE))
04749                     {
04750                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04751                       return(-RSBAC_EREADFAILED);
04752                     }
04753                   /* Set local security-level for this netobj item */
04754                   if (rsbac_set_attr(MAC,
04755                                      target,
04756                                      tid,
04757                                      A_local_sec_level,
04758                                      i_attr_val1))
04759                     {
04760                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04761                       return(-RSBAC_EWRITEFAILED);
04762                     }
04763                   /* Get mac_curr_categories from process... */
04764                   if (rsbac_get_attr(MAC,
04765                                      T_PROCESS,
04766                                      i_tid,
04767                                      A_mac_curr_categories,
04768                                      &i_attr_val1,
04769                                      FALSE))
04770                     {
04771                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04772                       return(-RSBAC_EREADFAILED);
04773                     }
04774                   /* Set local curr_categories for new item */
04775                   if (rsbac_set_attr(MAC,
04776                                      target,
04777                                      tid,
04778                                      A_local_mac_categories,
04779                                      i_attr_val1))
04780                     {
04781                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04782                       return(-RSBAC_EWRITEFAILED);
04783                     }
04784                   return(0);
04785                   break;
04786 #endif
04787 
04788                 /* all other cases are unknown */
04789                 default:
04790                   return(0);
04791               }
04792 
04793         /* removal of targets is done in main adf dispatcher! */
04794         case R_DELETE:
04795             switch(target)
04796               {
04797                 case T_FILE:
04798                 case T_DIR:
04799                 case T_FIFO:
04800                 case T_SYMLINK:
04801                 case T_IPC:
04802                   /* and perform auto-write without(!) setting of attributes */
04803                   /* - no information flow apart from missing file */
04804                   /* -> decision consistency check only */
04805                   result = auto_write(caller_pid,
04806                                       target,
04807                                       tid,
04808                                       FALSE);
04809                   if ((result != GRANTED) && (result != DO_NOT_CARE))
04810                     return(-RSBAC_EDECISIONMISMATCH);
04811                   else
04812                     return(0);
04813                 /* all other cases are unknown */
04814                 default:
04815                   return(0);
04816               }
04817 
04818         case R_EXECUTE:
04819             switch(target)
04820               {
04821                 case T_FILE:
04822                   /* copy trusted user list from file to process */
04823                   if (rsbac_mac_copy_fp_truset(tid.file, caller_pid))
04824                     {
04825                       rsbac_printk(KERN_WARNING
04826                              "rsbac_adf_set_attr_mac(): rsbac_mac_copy_fp_truset() returned error!\n");
04827                       return(-RSBAC_EWRITEFAILED);
04828                     }
04829                   /* perform auto-read with setting of attributes */
04830                   result = auto_read(caller_pid,
04831                                      target,
04832                                      tid,
04833                                      TRUE);
04834                   if ((result != GRANTED) && (result != DO_NOT_CARE))
04835                     return(-RSBAC_EDECISIONMISMATCH);
04836 
04837                   /* reset current_sec_level, mac_auto, min_write_open */
04838                   /* and max_read_open for process */
04839                   i_tid.process = caller_pid;
04840 
04841 #ifdef CONFIG_RSBAC_MAC_RESET_CURR
04842                   /* First, set current_sec_level and min_write_open to process owner's initial and seclevel */
04843                   if (rsbac_get_attr(MAC,
04844                                      T_PROCESS,
04845                                      i_tid,
04846                                      A_initial_security_level,
04847                                      &i_attr_val1,
04848                                      TRUE))
04849                     {
04850                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04851                       return(-RSBAC_EREADFAILED);
04852                     }
04853                   if (rsbac_get_attr(MAC,
04854                                      T_PROCESS,
04855                                      i_tid,
04856                                      A_mac_initial_categories,
04857                                      &i_attr_val2,
04858                                      TRUE))
04859                     {
04860                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04861                       return(-RSBAC_EREADFAILED);
04862                     }
04863                   if (rsbac_set_attr(MAC,
04864                                      T_PROCESS,
04865                                      i_tid,
04866                                      A_current_sec_level,
04867                                      i_attr_val1))
04868                     {
04869                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04870                       return(-RSBAC_EWRITEFAILED);
04871                     }
04872                   if (rsbac_set_attr(MAC,
04873                                      T_PROCESS,
04874                                      i_tid,
04875                                      A_mac_curr_categories,
04876                                      i_attr_val2))
04877                     {
04878                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04879                       return(-RSBAC_EWRITEFAILED);
04880                     }
04881 #endif
04882 #if 0
04883                   /* Now, set min_write_open to process owner's seclevel */
04884                   if (rsbac_get_attr(MAC,
04885                                      T_PROCESS,
04886                                      i_tid,
04887                                      A_security_level,
04888                                      &i_attr_val1,
04889                                      TRUE))
04890                     {
04891                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04892                       return(-RSBAC_EREADFAILED);
04893                     }
04894 #endif
04895                   i_attr_val1.min_write_open = SL_max;
04896                   if (rsbac_set_attr(MAC,
04897                                      T_PROCESS,
04898                                      i_tid,
04899                                      A_min_write_open,
04900                                      i_attr_val1))
04901                     {
04902                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04903                       return(-RSBAC_EWRITEFAILED);
04904                     }
04905 #if 0
04906                   /* Next, set min_write_categories to process owner's mac_categories */
04907                   if (rsbac_get_attr(MAC,
04908                                      T_PROCESS,
04909                                      i_tid,
04910                                      A_mac_categories,
04911                                      &i_attr_val2,
04912                                      TRUE))
04913                     {
04914                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04915                       return(-RSBAC_EREADFAILED);
04916                     }
04917 #endif
04918                   i_attr_val2.mac_categories = RSBAC_MAC_MAX_CAT_VECTOR;
04919                   if (rsbac_set_attr(MAC,
04920                                      T_PROCESS,
04921                                      i_tid,
04922                                      A_min_write_categories,
04923                                      i_attr_val2))
04924                     {
04925                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04926                       return(-RSBAC_EWRITEFAILED);
04927                     }
04928                   /* reset max_read boundary */
04929 #if 0
04930                   /* Get owner-min-sec-level and mac_min_categories for owner */
04931                   if (rsbac_get_attr(MAC,
04932                                      T_PROCESS,
04933                                      i_tid,
04934                                      A_min_security_level,
04935                                      &i_attr_val1,
04936                                      TRUE))
04937                     {
04938                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04939                       return(-RSBAC_EREADFAILED);
04940                     }
04941                   if (rsbac_get_attr(MAC,
04942                                      T_PROCESS,
04943                                      i_tid,
04944                                      A_mac_min_categories,
04945                                      &i_attr_val2,
04946                                      TRUE))
04947                     {
04948                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04949                       return(-RSBAC_EREADFAILED);
04950                     }
04951 #endif
04952                   i_attr_val1.max_read_open = SL_min;
04953                   i_attr_val2.mac_categories = RSBAC_MAC_MIN_CAT_VECTOR;
04954                   if (rsbac_set_attr(MAC,
04955                                      T_PROCESS,
04956                                      i_tid,
04957                                      A_max_read_open,
04958                                      i_attr_val1))
04959                     {
04960                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04961                       return(-RSBAC_EWRITEFAILED);
04962                     }
04963                   /* reset category max_read boundary */
04964                   if (rsbac_set_attr(MAC,
04965                                      T_PROCESS,
04966                                      i_tid,
04967                                      A_max_read_categories,
04968                                      i_attr_val2))
04969                     {
04970                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04971                       return(-RSBAC_EWRITEFAILED);
04972                     }
04973                   /* set flags */
04974                   if (rsbac_get_attr(MAC,
04975                                      T_PROCESS,
04976                                      i_tid,
04977                                      A_mac_process_flags,
04978                                      &i_attr_val1,
04979                                      TRUE))
04980                     {
04981                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04982                       return(-RSBAC_EREADFAILED);
04983                     }
04984                   if (rsbac_get_attr(MAC,
04985                                      target,
04986                                      tid,
04987                                      A_mac_auto,
04988                                      &i_attr_val2,
04989                                      TRUE))
04990                     {
04991                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04992                       return(-RSBAC_EREADFAILED);
04993                     }
04994                   if(i_attr_val2.mac_auto)
04995                     {
04996                       i_attr_val1.mac_process_flags |= MAC_program_auto;
04997                       i_tid.user = owner;
04998                       if (rsbac_get_attr(MAC,
04999                                          T_USER,
05000                                          i_tid,
05001                                          A_mac_user_flags,
05002                                          &i_attr_val2,
05003                                          TRUE))
05004                         {
05005                           rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05006                           return(-RSBAC_EREADFAILED);
05007                         }
05008                       if(i_attr_val2.mac_user_flags & MAC_allow_auto)
05009                         i_attr_val1.mac_process_flags |= MAC_auto;
05010                       else
05011                         i_attr_val1.mac_process_flags &= ~MAC_auto;
05012                       i_tid.process = caller_pid;
05013                     }
05014                   else
05015                     {
05016                       i_attr_val1.mac_process_flags &= ~MAC_program_auto;
05017                       i_attr_val1.mac_process_flags &= ~MAC_auto;
05018                     }
05019                   if (rsbac_get_attr(MAC,
05020                                      T_FILE,
05021                                      tid,
05022                                      A_mac_prop_trusted,
05023                                      &i_attr_val3,
05024                                      TRUE))
05025                     {
05026                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05027                       return(-RSBAC_EREADFAILED);
05028                     }
05029                   if(   !(i_attr_val3.mac_prop_trusted)
05030                      || !(i_attr_val1.mac_process_flags & MAC_trusted)
05031                     )
05032                     {
05033                         if(rsbac_mac_p_truset_member(caller_pid, owner))
05034                           i_attr_val1.mac_process_flags |= MAC_trusted;
05035                         else
05036                           {
05037                             i_tid.user = owner;
05038                             if (rsbac_get_attr(MAC,
05039                                                T_USER,
05040                                                i_tid,
05041                                                A_mac_user_flags,
05042                                                &i_attr_val2,
05043                                                TRUE))
05044                               {
05045                                 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05046                                 return(-RSBAC_EREADFAILED);
05047                               }
05048                             if(i_attr_val2.mac_user_flags & MAC_trusted)
05049                                i_attr_val1.mac_process_flags |= MAC_trusted;
05050                             else
05051                                i_attr_val1.mac_process_flags &= ~MAC_trusted;
05052                             i_tid.process = caller_pid;
05053                           }
05054                     }
05055                   if (rsbac_set_attr(MAC,
05056                                      T_PROCESS,
05057                                      i_tid,
05058                                      A_mac_process_flags,
05059                                      i_attr_val1))
05060                     {
05061                       rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
05062                       return(-RSBAC_EWRITEFAILED);
05063                     }
05064                   return(0);
05065 
05066                 /* all other cases */
05067                 default:
05068                   return(0);
05069               }
05070 
05071         case R_MOUNT:
05072             switch(target)
05073               {
05074                 case T_DIR:
05075                 case T_DEV:
05076                   /* and perform auto-read(-write) with setting of attributes */
05077                   if(   (target == T_DEV)
05078                      && (attr == A_mode)
05079                      && (attr_val.mode & MS_RDONLY))
05080                     result = auto_read(caller_pid,
05081                                        target,
05082                                        tid,
05083                                        TRUE);
05084                   else
05085                     result = auto_read_write(caller_pid,
05086                                              target,
05087                                              tid,
05088                                              TRUE);
05089                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05090                     return(-RSBAC_EDECISIONMISMATCH);
05091                   else
05092                     return(0);
05093 
05094                 /* all other cases are unknown */
05095                 default:
05096                   return(0);
05097               }
05098 
05099         case R_READ:
05100             switch(target)
05101               {
05102                 case T_DIR:
05103 #ifdef CONFIG_RSBAC_RW
05104                 case T_FILE:
05105                 case T_FIFO:
05106                 case T_IPC:
05107 #endif
05108                   /* and perform auto-read with setting of attributes */
05109                   result = auto_read(caller_pid,
05110                                      target,
05111                                      tid,
05112                                      TRUE);
05113                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05114                     return(-RSBAC_EDECISIONMISMATCH);
05115                   return(0);
05116 
05117 #ifdef CONFIG_RSBAC_RW
05118                 case T_DEV:
05119                   /* Only check for devices with mac_check set */
05120                   if (rsbac_get_attr(MAC,
05121                                      T_DEV,
05122                                      tid,
05123                                      A_mac_check,
05124                                      &i_attr_val1,
05125                                      FALSE))
05126                     {
05127                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05128                       return(-RSBAC_EREADFAILED);
05129                     }
05130                   if(!i_attr_val1.mac_check)
05131                     return(0);
05132                   /* and perform auto-read with setting of attributes */
05133                   result = auto_read(caller_pid,
05134                                      target,
05135                                      tid,
05136                                      TRUE);
05137                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05138                     return(-RSBAC_EDECISIONMISMATCH);
05139                   return(0);
05140 #endif
05141 
05142 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05143                 case T_NETOBJ:
05144                   /* and perform auto-read with setting of attributes */
05145                   result = auto_read_attr(caller_pid,
05146                                           target,
05147                                           tid,
05148                                           A_remote_sec_level,
05149                                           A_remote_mac_categories,
05150                                           TRUE);
05151                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05152                     return(-RSBAC_EDECISIONMISMATCH);
05153                   return(0);
05154 #endif
05155 
05156                 /* all other cases are unknown */
05157                 default:
05158                   return(0);
05159               }
05160 
05161         case R_READ_OPEN:
05162             switch(target)
05163               {
05164                 case T_FILE:
05165                 case T_DIR:
05166                 case T_FIFO:
05167                 case T_IPC:
05168                   /* and perform auto-read with setting attributes */
05169                   result = auto_read(caller_pid,
05170                                      target,
05171                                      tid,
05172                                      TRUE);
05173                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05174                     return(-RSBAC_EDECISIONMISMATCH);
05175                   return(0);
05176 
05177                 case T_DEV:
05178                   /* Only check for devices with mac_check set */
05179                   if (rsbac_get_attr(MAC,
05180                                      T_DEV,
05181                                      tid,
05182                                      A_mac_check,
05183                                      &i_attr_val1,
05184                                      FALSE))
05185                     {
05186                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05187                       return(-RSBAC_EREADFAILED);
05188                     }
05189                   if(!i_attr_val1.mac_check)
05190                     return(0);
05191                   /* and perform auto-read with setting attributes */
05192                   result = auto_read(caller_pid,
05193                                      target,
05194                                      tid,
05195                                      TRUE);
05196                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05197                     return(-RSBAC_EDECISIONMISMATCH);
05198                   return(0);
05199 
05200                 /* all other cases are unknown */
05201                 default:
05202                   return(0);
05203               }
05204 
05205         case R_READ_WRITE_OPEN:
05206             switch(target)
05207               {
05208                 case T_FILE:
05209                 case T_FIFO:
05210                 case T_IPC:
05211                   /* and perform auto-read-write without setting attributes */
05212                   result = auto_read_write(caller_pid,
05213                                            target,
05214                                            tid,
05215                                            TRUE);
05216                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05217                     return(-RSBAC_EDECISIONMISMATCH);
05218                   return(0);
05219 
05220                 case T_DEV:
05221                   /* Only check for devices with mac_check set */
05222                   if (rsbac_get_attr(MAC,
05223                                      T_DEV,
05224                                      tid,
05225                                      A_mac_check,
05226                                      &i_attr_val1,
05227                                      FALSE))
05228                     {
05229                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05230                       return(-RSBAC_EREADFAILED);
05231                     }
05232                   if(!i_attr_val1.mac_check)
05233                     return(0);
05234                   /* and perform auto-read-write with setting of attributes */
05235                   result = auto_read_write(caller_pid,
05236                                            target,
05237                                            tid,
05238                                            TRUE);
05239                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05240                     return(-RSBAC_EDECISIONMISMATCH);
05241                   return(0);
05242                 /* all other cases are unknown */
05243                 default:
05244                   return(0);
05245               }
05246 
05247         case R_SEARCH:
05248             switch(target)
05249               {
05250                 case T_DIR:
05251                 case T_SYMLINK:
05252                   /* and perform auto-read with setting of attributes */
05253                   result = auto_read(caller_pid,
05254                                      target,
05255                                      tid,
05256                                      TRUE);
05257                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05258                     return(-RSBAC_EDECISIONMISMATCH);
05259                   return(0);
05260                 /* all other cases are unknown */
05261                 default:
05262                   return(0);
05263               }
05264 
05265         case R_TRACE:
05266             switch(target)
05267               {
05268                 case T_PROCESS:
05269                   /* and perform auto-read-write with setting attributes */
05270                   result = auto_read_write_attr(caller_pid,
05271                                                 target,
05272                                                 tid,
05273                                                 A_current_sec_level,
05274                                                 A_mac_curr_categories,
05275                                                 TRUE);
05276                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05277                     return(-RSBAC_EDECISIONMISMATCH);
05278                   return(0);
05279 
05280                 /* all other cases are unknown */
05281                 default:
05282                   return(0);
05283               }
05284 
05285         case R_WRITE:
05286         case R_WRITE_OPEN:
05287             switch(target)
05288               {
05289                 case T_FILE:
05290                 case T_FIFO:
05291                 case T_IPC:
05292                   /* and perform auto-write with setting attributes */
05293                   result = auto_write(caller_pid,
05294                                       target,
05295                                       tid,
05296                                       TRUE);
05297                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05298                     return(-RSBAC_EDECISIONMISMATCH);
05299                   return(0);
05300 
05301                 case T_DEV:
05302                   /* Only check for devices with mac_check set */
05303                   if (rsbac_get_attr(MAC,
05304                                      T_DEV,
05305                                      tid,
05306                                      A_mac_check,
05307                                      &i_attr_val1,
05308                                      FALSE))
05309                     {
05310                       rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05311                       return(-RSBAC_EREADFAILED);
05312                     }
05313                   if(!i_attr_val1.mac_check)
05314                     return(0);
05315                   /* and perform auto-write with setting attributes */
05316                   result = auto_write(caller_pid,
05317                                       target,
05318                                       tid,
05319                                       TRUE);
05320                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05321                     return(-RSBAC_EDECISIONMISMATCH);
05322                   return(0);
05323 
05324 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05325                 case T_NETOBJ:
05326                   /* and perform auto-write with setting attributes */
05327                   result = auto_write_attr(caller_pid,
05328                                            target,
05329                                            tid,
05330                                            A_remote_sec_level,
05331                                            A_remote_mac_categories,
05332                                            TRUE);
05333                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05334                     return(-RSBAC_EDECISIONMISMATCH);
05335                   return(0);
05336 #endif
05337 
05338                 /* all other cases are unknown */
05339                 default:
05340                   return(0);
05341               }
05342 
05343 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05344         case R_BIND:
05345         case R_LISTEN:
05346             switch(target)
05347               {
05348                 case T_NETOBJ:
05349                   /* and perform auto-write with setting attributes */
05350                   result = auto_write_attr(caller_pid,
05351                                            target,
05352                                            tid,
05353                                            A_local_sec_level,
05354                                            A_local_mac_categories,
05355                                            TRUE);
05356                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05357                     return(-RSBAC_EDECISIONMISMATCH);
05358                   return(0);
05359 
05360                 /* all other cases are unknown */
05361                 default:
05362                   return(0);
05363               }
05364 
05365         case R_ACCEPT:
05366         case R_CONNECT:
05367         case R_SEND:
05368         case R_RECEIVE:
05369             switch(target)
05370               {
05371                 case T_NETOBJ:
05372                   /* and perform auto-write with setting attributes */
05373                   result = auto_write_attr(caller_pid,
05374                                            target,
05375                                            tid,
05376                                            A_remote_sec_level,
05377                                            A_remote_mac_categories,
05378                                            TRUE);
05379                   if ((result != GRANTED) && (result != DO_NOT_CARE))
05380                     return(-RSBAC_EDECISIONMISMATCH);
05381                   return(0);
05382 
05383                 /* all other cases are unknown */
05384                 default:
05385                   return(0);
05386               }
05387 #endif
05388 
05389 /*********************/
05390         default: return(0);
05391       }
05392 
05393     return(0);
05394   } /* end of rsbac_adf_set_attr_mac() */


Generated on Thu Sep 22 16:42:26 2005 for RSBAC by  doxygen 1.4.2