-----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.
Signed-off-by: Andrew G. Morgan <[EMAIL PROTECTED]>
---
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