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 <stdio.h> 00018 #include <string.h> 00019 #endif 00020 00021 char * pax_print_flags(char * string, rsbac_pax_flags_t flags) 00022 { 00023 sprintf(string, "%c%c%c%c%c%c", 00024 flags & PF_PAX_PAGEEXEC ? 'P' : 'p', 00025 flags & PF_PAX_EMUTRAMP ? 'E' : 'e', 00026 flags & PF_PAX_MPROTECT ? 'M' : 'm', 00027 flags & PF_PAX_RANDMMAP ? 'R' : 'r', 00028 flags & PF_PAX_RANDEXEC ? 'X' : 'x', 00029 flags & PF_PAX_SEGMEXEC ? 'S' : 's'); 00030 return string; 00031 } 00032 00033 #ifndef __KERNEL__ 00034 rsbac_pax_flags_t pax_strtoflags(char * string, rsbac_pax_flags_t init_flags) 00035 { 00036 char * p = string; 00037 rsbac_pax_flags_t add_flags = 0; 00038 rsbac_pax_flags_t remove_flags = 0; 00039 00040 if(!p) 00041 return init_flags; 00042 while(*p) 00043 { 00044 switch(*p) 00045 { 00046 case 'P': 00047 add_flags |= PF_PAX_PAGEEXEC; 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 break; 00079 case 's': 00080 remove_flags |= PF_PAX_SEGMEXEC; 00081 break; 00082 case 'z': 00083 remove_flags = RSBAC_PAX_ALL_FLAGS; 00084 break; 00085 case 'a': 00086 add_flags = RSBAC_PAX_ALL_FLAGS; 00087 break; 00088 default: 00089 break; 00090 } 00091 p++; 00092 } 00093 return (init_flags | add_flags) & ~remove_flags; 00094 } 00095 #endif