Re: [PATCH] SELinux: return error codes on policy load failure

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

 



On Tue, 2010-04-20 at 10:29 -0400, Eric Paris wrote:
> policy load failure always return EINVAL even if the failure was for some
> other reason (usually ENOMEM).  This patch passes error codes back up the
> stack where they will make their way to userspace.  This might help in
> debugging future problems with policy load.
> 
> Signed-off-by: Eric Paris <eparis@xxxxxxxxxx>

Acked-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>

Note that policydb_read() internally has the same problem on some code
paths, leading to the logic on the bad: path that defaults to EINVAL if
not otherwise set.

> ---
> 
>  security/selinux/ss/services.c |   37 ++++++++++++++++++++++---------------
>  1 files changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
> index 0b44f5a..1de60ce 100644
> --- a/security/selinux/ss/services.c
> +++ b/security/selinux/ss/services.c
> @@ -1760,22 +1760,28 @@ int security_load_policy(void *data, size_t len)
>  
>  	if (!ss_initialized) {
>  		avtab_cache_init();
> -		if (policydb_read(&policydb, fp)) {
> +		rc = policydb_read(&policydb, fp);
> +		if (rc) {
>  			avtab_cache_destroy();
> -			return -EINVAL;
> +			return rc;
>  		}
> -		if (selinux_set_mapping(&policydb, secclass_map,
> -					&current_mapping,
> -					&current_mapping_size)) {
> +
> +		rc = selinux_set_mapping(&policydb, secclass_map,
> +					 &current_mapping,
> +					 &current_mapping_size);
> +		if (rc) {
>  			policydb_destroy(&policydb);
>  			avtab_cache_destroy();
> -			return -EINVAL;
> +			return rc;
>  		}
> -		if (policydb_load_isids(&policydb, &sidtab)) {
> +
> +		rc = policydb_load_isids(&policydb, &sidtab);
> +		if (rc) {
>  			policydb_destroy(&policydb);
>  			avtab_cache_destroy();
> -			return -EINVAL;
> +			return rc;
>  		}
> +
>  		security_load_policycaps();
>  		ss_initialized = 1;
>  		seqno = ++latest_granting;
> @@ -1791,8 +1797,9 @@ int security_load_policy(void *data, size_t len)
>  	sidtab_hash_eval(&sidtab, "sids");
>  #endif
>  
> -	if (policydb_read(&newpolicydb, fp))
> -		return -EINVAL;
> +	rc = policydb_read(&newpolicydb, fp);
> +	if (rc)
> +		return rc;
>  
>  	/* If switching between different policy types, log MLS status */
>  	if (policydb.mls_enabled && !newpolicydb.mls_enabled)
> @@ -1807,8 +1814,8 @@ int security_load_policy(void *data, size_t len)
>  		return rc;
>  	}
>  
> -	if (selinux_set_mapping(&newpolicydb, secclass_map,
> -				&map, &map_size))
> +	rc = selinux_set_mapping(&newpolicydb, secclass_map, &map, &map_size);
> +	if (rc)
>  		goto err;
>  
>  	rc = security_preserve_bools(&newpolicydb);
> @@ -1819,10 +1826,10 @@ int security_load_policy(void *data, size_t len)
>  
>  	/* Clone the SID table. */
>  	sidtab_shutdown(&sidtab);
> -	if (sidtab_map(&sidtab, clone_sid, &newsidtab)) {
> -		rc = -ENOMEM;
> +
> +	rc = sidtab_map(&sidtab, clone_sid, &newsidtab);
> +	if (rc)
>  		goto err;
> -	}
>  
>  	/*
>  	 * Convert the internal representations of contexts
-- 
Stephen Smalley
National Security Agency


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