Re: error: too many arguments to function 'security_getenforce'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08/12/2009 11:30 PM, Justin Mattock wrote:
> Hello,
> I've spent the past few days trying to
> find a correct patch for sysvinit-2.86 to load
> the policy. but seems to keep hitting errors.
> 
> I've made it as far as this:
> gcc -c -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -DWITH_SELINUX  init.c
> init.c: In function 'load_policy':
> init.c:107:3: error: too many arguments to function 'security_getenforce'
> init.c:120:0: warning: "MNT_DETACH" redefined
> /usr/include/sys/mount.h:102:0: note: this is the location of the
> previous definition
> init.c:130:7: warning: too many arguments for format
> init.c:206:3: warning: passing argument 3 of 'sepol_genbools' discards
> qualifiers from pointer target type
> /usr/include/sepol/booleans.h:16:12: note: expected 'char *' but
> argument is of type 'const char *'
> init.c: In function 're_exec':
> init.c:2040:2: warning: missing sentinel in function call
> make: *** [init.o] Error 1
> make: Leaving directory `/home/justin/LFS/sysv/sysvinit-2.86/src'
> 
> seems this is the only error showing up if I use the -i option
> from make.
> 
> the patch looks like this:
> (only init.c/Makefile for now until I can get this
> correct)
> 
> starting at line 83
> 
> 		} while(0)
> 
> #ifdef WITH_SELINUX
> #include <sys/mman.h>
> #include <selinux/selinux.h>
> #include <sepol/sepol.h>
> #include <sys/mount.h>
> 
> /* Mount point for selinuxfs. */
> #define SELINUXMNT "/selinux/"
> int enforcing = -1;            /* SELinux enforcing mode */
> 
> 
> static int load_policy(int *enforce)
> {
>   int fd=-1,ret=-1;
>   int rc=0, orig_enforce;
>   struct stat sb;
>   void *map;
>   char policy_file[PATH_MAX];
>   int policy_version=0;
>   extern char *selinux_mnt;
>   FILE *cfg;
>   char buf[4096];
>   int seconfig = -2;
> 
>   security_getenforce(&seconfig);
> 
>   mount("none", "/proc", "proc", 0, 0);
>  cfg = fopen("/proc/cmdline","r");
>   if (cfg) {
>     char *tmp;
>     if (fgets(buf,4096,cfg) && (tmp = strstr(buf,"enforcing="))) {
>       if (tmp == buf || isspace(*(tmp-1))) {
>         enforcing=atoi(tmp+10);
>       }
>     }
>     fclose(cfg);
>   }
> #define MNT_DETACH 2
>   umount2("/proc",MNT_DETACH);
> 
>   if (enforcing >=0)
>     *enforce = enforcing;
>   else if (seconfig == 1)
>     *enforce = 1;
> 
>   if (mount("none", SELINUXMNT, "selinuxfs", 0, 0) < 0) {
>     if (errno == ENODEV) {
>       printf("SELinux not supported by kernel:
> %s\n",SELINUXMNT,strerror(errno));
>       *enforce = 0;
>     } else {
>       printf("Failed to mount %s: %s\n",SELINUXMNT,strerror(errno));
>     }
>     return ret;
>   }
> 
>   selinux_mnt = SELINUXMNT; /* set manually since we mounted it */
> 
>   policy_version=security_policyvers();
>   if (policy_version < 0) {
>     printf( "Can't get policy version: %s\n", strerror(errno));
>     goto UMOUNT;
>   }
> 
>   orig_enforce = rc = security_getenforce();
>   if (rc < 0) {
>     printf( "Can't get SELinux enforcement flag: %s\n", strerror(errno));
>     goto UMOUNT;
>   }
>   if (enforcing >= 0) {
>     *enforce = enforcing;
>   } else if (seconfig == -1) {
>     *enforce = 0;
>     rc = security_disable();
>     if (rc == 0) umount(SELINUXMNT);
>    if (rc < 0) {
>      rc = security_setenforce(0);
>      if (rc < 0) {
>        printf("Can't disable SELinux: %s\n", strerror(errno));
>        goto UMOUNT;
>       }
>     }
>     ret = 0;
>     goto UMOUNT;
>   } else if (seconfig >= 0) {
>     *enforce = seconfig;
>     if (orig_enforce != *enforce) {
>       rc = security_setenforce(seconfig);
>       if (rc < 0) {
>         printf("Can't set SELinux enforcement flag: %s\n", strerror(errno));
>         goto UMOUNT;
>       }
>    }
>   }
> 
>   snprintf(policy_file,sizeof(policy_file),"%s.%d",selinux_binary_policy_path(),policy_version);
>   fd = open(policy_file, O_RDONLY);
>   if (fd < 0) {
>     /* Check previous version to see if old policy is available
>      */
>     snprintf(policy_file,sizeof(policy_file),"%s.%d",selinux_binary_policy_path(),policy_version-1);
>     fd = open(policy_file, O_RDONLY);
>     if (fd < 0) {
>       printf( "Can't open '%s.%d':  %s\n",
>           selinux_binary_policy_path(),policy_version,strerror(errno));
>       goto UMOUNT;
>     }
>   }
> 
>   if (fstat(fd, &sb) < 0) {
>   printf("Can't stat '%s':  %s\n",
>         policy_file, strerror(errno));
>    goto UMOUNT;
>  }
> 
>   map = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
>   if (map == MAP_FAILED) {
>     printf( "Can't map '%s':  %s\n",
>        policy_file, strerror(errno));
>     goto UMOUNT;
>   }
> 
> 
>   /* Set booleans based on a booleans configuration file. */
>   ret = sepol_genbools(map, sb.st_size, selinux_booleans_path());
>   if (ret < 0) {
>     if (errno == ENOENT || errno == EINVAL) {
>       /* No booleans file or stale booleans in the file; non-fatal. */
>       printf("Warning!  Error while setting booleans:  %s\n"
>           , strerror(errno));
>     } else {
>       printf("Error while setting booleans:  %s\n",
>           strerror(errno));
>       goto UMOUNT;
>     }
>  }
>   printf("Loading security policy\n");
>   ret=security_load_policy(map, sb.st_size);
>   if (ret < 0) {
>     printf("security_load_policy failed\n");
>   }
> 
>  UMOUNT:
>   /*umount(SELINUXMNT); */
>   if ( fd >= 0) {
>     close(fd);
>  }
>   return(ret);
> }
> #endif
> 
> /* Version information */
> 
> 
> line 2818
> #ifdef WITH_SELINUX
>        if (getenv("SELINUX_INIT") == NULL) {
>          putenv("SELINUX_INIT=YES");
>          if (load_policy(&enforcing) == 0 ) {
>            execv(myname, argv);
>          } else {
>            if (enforcing > 0) {
>              /* SELinux in enforcing mode but load_policy failed */
>              /* At this point, we probably can't open /dev/console, so
> log() won't work */
>                    fprintf(stderr,"Enforcing mode requested but no
> policy loaded. Halting now.\n");
>              exit(1);
>            }
>          }
>        }
> #endif
> 
> 
> 
> and the Makefile has these in it:
> 
> line 12
> CFLAGS	= -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE -DWITH_SELINUX
> 
> line 52
> 
> ifeq ($(WITH_SELINUX),yes)
>   SELINUX_DEF=-DWITH_SELINUX
>   INIT_SELIBS=-lsepol -lselinux
>   SULOGIN_SELIBS=-lselinux
> else
>   SELINUX_DEF=
>   INIT_SELIBS=
>   SULOGIN_SELIBS=
> endif
> 
> 
> line 71
> init:		init.o init_utmp.o
> 		$(CC) $(LDFLAGS) $(STATIC) -o $@ init.o init_utmp.o $(INIT_SELIBS)
> 
> line 103
> init.o:		init.c init.h set.h reboot.h initreq.h
> 		$(CC) -c $(CFLAGS) $(SELINUX_DEF) init.c
> 
> 
> Seems I found a patch from 2003 that
> did load the policy but segfaulted after that.
> 
> should I even bother with this since there are
> newer approaches?
> 
> 
Does

selinux_mkload_policy(1);

Work for you?

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux