Re: This patch adds some output to load_policy to say which policy file it tries to load.

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

 



On 12/13/10 1:39 PM, "Daniel J Walsh" <dwalsh@xxxxxxxxxx> wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Currently load_policy will just fail without a decent error message.
> 
> Note:
> 
> The patch has to check if load_policy failed on a disabled machine, in
> order to not report an error.
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.11 (GNU/Linux)
> Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
> 
> iEYEARECAAYFAk0GaEYACgkQrlYvE4MpobMxrwCg6JMdPm28IEuL2Eco++OCHThw
> sYAAn2BTXe1BYCjYdzDAjnA08t0dKquQ
> =N1Uu
> -----END PGP SIGNATURE-----
>
> diff --git a/policycoreutils/load_policy/load_policy.c
> b/policycoreutils/load_policy/load_policy.c
> index 47d9b0f..566565f 100644
> --- a/policycoreutils/load_policy/load_policy.c
> +++ b/policycoreutils/load_policy/load_policy.c
> @@ -1,3 +1,4 @@
> +#define _GNU_SOURCE
>  #include <unistd.h>
>  #include <stdlib.h>
>  #include <stdio.h>
> @@ -23,6 +24,14 @@ void usage(char *progname)
>      exit(1);
>  }
>  
> +char *policy_path(void) {
> +    char *path=NULL;
> +    if (asprintf(&path, "%s.%d", selinux_binary_policy_path(),
> security_policyvers()) < 0) {
> +        return NULL;
> +    }
> +    return path;
> +}
> +

This function will return a bogus result if any error occurs in
security_policyvers(). The only likely candidate for that is if SELinux is
disabled, which this theoretically should not be called in. However, that
isn't true (more on that later). So, I get messages like this:

[root@f14 ~]# load_policy -i
load_policy:  Can't load policy file /etc/selinux/targeted/policy/policy.-1:
No such file or directory

The -1 comes from the error return code from security_policyvers().

More importantly, this just assumes that the path computed here and in
libselinux are the same. Since libselinux searches back for policy versions,
this isn't necessarily true.

>  int main(int argc, char **argv)
>  {
>      int ret, opt, quiet = 0, nargs, init=0, enforce=0;
> @@ -64,6 +73,7 @@ int main(int argc, char **argv)
>              "%s:  Warning!  Boolean file argument (%s) is no longer
> supported, installed booleans file is always used.  Continuing...\n",
>              argv[0], argv[optind++]);
>      }
> +    errno = 0;
>      if (init) {
>          if (is_selinux_enabled() == 1) {
>              /* SELinux is already enabled, we should not do an initial load
> again */
> @@ -76,9 +86,11 @@ int main(int argc, char **argv)
>          if (ret != 0 ) {
>              if (enforce > 0) {
>                  /* SELinux in enforcing mode but load_policy failed */
> +                char *path=policy_path();
>                  fprintf(stderr,
> -                        _("%s:  Can't load policy and enforcing mode
> requested:  %s\n"),
> -                        argv[0], strerror(errno));
> +                        _("%s:  Can't load policy file %s and enforcing mode
> requested: %s\n"),
> +                    argv[0], path, strerror(errno));
> +                free(path);

This assumes errno is set by selinux_init_load_policy() (more on this
below).

>                  exit(3);
>              }
>          }
> @@ -86,9 +98,16 @@ int main(int argc, char **argv)
>      else {
>          ret = selinux_mkload_policy(1);
>      }
> -    if (ret < 0) {
> -        fprintf(stderr, _("%s:  Can't load policy:  %s\n"),
> -            argv[0], strerror(errno));
> +
> +    /* selinux_init_load_policy returns -1 if it did not load_policy
> +         * On SELinux disabled system it will always return -1
> +         * So check errno to see if anything went wrong
> +         */
> +    if (ret < 0 && errno != 0) {
> +        char *path=policy_path();
> +        fprintf(stderr, _("%s:  Can't load policy file %s:  %s\n"),
> +            argv[0], path, strerror(errno));
> +        free(path);

This assumes that errno is set properly by selinux_init_load_policy() or
selinux_mkload_policy(). It's not. For instance, if /selinux can't be
mounted (because SELinux is disabled), errno will be set to ENODEV. So, this
new errno check doesn't seem to help here. For instance, I booted my F14
system with selinux=0 on the kernel command-line. Then:

[root@f14 ~]# load_policy -i
load_policy:  Can't load policy file /etc/selinux/targeted/policy/policy.-1:
No such file or directory

I'd say we either need a proper communication channel (e.g. return code or
start setting errno properly) between libselinux and load_policy, or we need
libselinux to handle everything (including logging) itself.

Thanks,
Chad



>          exit(2);
>      }
>      exit(0);
> 


--
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