Quoting Andrew Morgan ([EMAIL PROTECTED]):
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Andrew,
> 
> The attached patch (171282b3553fcec43b9ab615eb7daf6c2b494a87) applies
> against 2.6.24-rc2-mm1. It addresses the problem reported by Kevin and
> Andy - ultimately, the legacy support wasn't transparent. In particular,
> userspace 32-bit capability manipulations (when run by root) that used
> to work, without this patch, fail.
> 
> Cheers
> 
> Andrew
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.6 (GNU/Linux)
> 
> iD8DBQFHP8zBQheEq9QabfIRAs6/AJ9Tbn9vk/pgpu0FwOzU/EJg9oirjACaAndU
> unbe82Ep+s/y0Nl3aKP92uY=
> =8pOC
> -----END PGP SIGNATURE-----

> >From 171282b3553fcec43b9ab615eb7daf6c2b494a87 Mon Sep 17 00:00:00 2001
> From: Andrew G. Morgan <[EMAIL PROTECTED]>
> Date: Sat, 17 Nov 2007 21:03:19 -0800
> Subject: [PATCH] Legacy support fix; retain transparent support for 32-bit 
> capability apps.
> 
> Legacy support requires that we don't return an error for previously
> legitimate calls. Removing this check, we make a fail-safe best effort
> to support legacy applications.

Yeah, I struggled with this too.

This behavior makes particular sense if we think (as I do) that new
capabilities will mainly be introduced along with new features.  So
legacy applications shouldn't misbehave due to ignorance or absence
(after capget+capset) of them.

> Signed-off-by: Andrew G. Morgan <[EMAIL PROTECTED]>

Acked-by: Serge Hallyn <[EMAIL PROTECTED]>

thanks,
-serge

> ---
>  kernel/capability.c |   27 ++++++++++++++++++++-------
>  1 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/kernel/capability.c b/kernel/capability.c
> index 8cba9b2..9f2db55 100644
> --- a/kernel/capability.c
> +++ b/kernel/capability.c
> @@ -109,13 +109,26 @@ out:
>                       kdata[i].permitted = pP.cap[i];
>                       kdata[i].inheritable = pI.cap[i];
>               }
> -             while (i < _LINUX_CAPABILITY_U32S) {
> -                     if (pE.cap[i] || pP.cap[i] || pP.cap[i]) {
> -                             /* Cannot represent w/ legacy structure */
> -                             return -ERANGE;
> -                     }
> -                     i++;
> -             }
> +
> +             /*
> +              * Note, in the case, tocopy < _LINUX_CAPABILITY_U32S,
> +              * we silently drop the upper capabilities here. This
> +              * has the effect of making older libcap
> +              * implementations implicitly drop upper capability
> +              * bits when they perform a: capget/modify/capset
> +              * sequence.
> +              *
> +              * This behavior is considered fail-safe
> +              * behavior. Upgrading the application to a newer
> +              * version of libcap will enable access to the newer
> +              * capabilities.
> +              *
> +              * An alternative would be to return an error here
> +              * (-ERANGE), but that causes legacy applications to
> +              * unexpectidly fail; the capget/modify/capset aborts
> +              * before modification is attempted and the application
> +              * fails.
> +              */
> 
>               if (copy_to_user(dataptr, kdata, tocopy
>                                * sizeof(struct __user_cap_data_struct))) {
> -- 
> 1.5.1.3
> 

-
To unsubscribe from this list: send the line "unsubscribe 
linux-security-module" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to