00001 /********************************** */ 00002 /* Rule Set Based Access Control */ 00003 /* Author and (c) 1999-2004: */ 00004 /* Amon Ott <ao@rsbac.org> */ 00005 /* Getname functions for PAX module */ 00006 /* Last modified: 06/Jan/2004 */ 00007 /********************************** */ 00008 00009 #include <rsbac/types.h> 00010 #include <rsbac/pax_getname.h> 00011 #include <rsbac/helpers.h> 00012 #include <rsbac/error.h> 00013 00014 #ifdef __KERNEL__ 00015 #include <linux/string.h> 00016 #else 00017 #include <string.h> 00018 #endif 00019 00020 char * pax_print_flags(char * string, rsbac_pax_flags_t flags) 00021 { 00022 sprintf(string, "%c%c%c%c%c%c", 00023 flags & PF_PAX_PAGEEXEC ? 'P' : 'p', 00024 flags & PF_PAX_EMUTRAMP ? 'E' : 'e', 00025 flags & PF_PAX_MPROTECT ? 'M' : 'm', 00026 flags & PF_PAX_RANDMMAP ? 'R' : 'r', 00027 flags & PF_PAX_RANDEXEC ? 'X' : 'x', 00028 flags & PF_PAX_SEGMEXEC ? 'S' : 's'); 00029 return string; 00030 } 00031 00032 #ifndef __KERNEL__ 00033 rsbac_pax_flags_t pax_strtoflags(char * string, rsbac_pax_flags_t init_flags) 00034 { 00035 char * p = string; 00036 rsbac_pax_flags_t add_flags = 0; 00037 rsbac_pax_flags_t remove_flags = 0; 00038 00039 if(!p) 00040 return init_flags; 00041 while(*p) 00042 { 00043 switch(*p) 00044 { 00045 case 'P': 00046 add_flags |= PF_PAX_PAGEEXEC; 00047 remove_flags |= PF_PAX_SEGMEXEC; 00048 break; 00049 case 'p': 00050 remove_flags |= PF_PAX_PAGEEXEC; 00051 break; 00052 case 'E': 00053 add_flags |= PF_PAX_EMUTRAMP; 00054 break; 00055 case 'e': 00056 remove_flags |= PF_PAX_EMUTRAMP; 00057 break; 00058 case 'M': 00059 add_flags |= PF_PAX_MPROTECT; 00060 break; 00061 case 'm': 00062 remove_flags |= PF_PAX_MPROTECT; 00063 break; 00064 case 'R': 00065 add_flags |= PF_PAX_RANDMMAP; 00066 break; 00067 case 'r': 00068 remove_flags |= PF_PAX_RANDMMAP; 00069 break; 00070 case 'X': 00071 add_flags |= PF_PAX_RANDEXEC; 00072 break; 00073 case 'x': 00074 remove_flags |= PF_PAX_RANDEXEC; 00075 break; 00076 case 'S': 00077 add_flags |= PF_PAX_SEGMEXEC; 00078 remove_flags |= PF_PAX_PAGEEXEC; 00079 break; 00080 case 's': 00081 remove_flags |= PF_PAX_SEGMEXEC; 00082 break; 00083 case 'z': 00084 remove_flags = RSBAC_PAX_ALL_FLAGS; 00085 break; 00086 case 'a': 00087 add_flags = RSBAC_PAX_ALL_FLAGS; 00088 break; 00089 default: 00090 break; 00091 } 00092 p++; 00093 } 00094 return (init_flags | add_flags) & ~remove_flags; 00095 } 00096 #endif