diff options
-rw-r--r-- | fs/proc/array.c | 11 | ||||
-rw-r--r-- | include/linux/capability.h | 5 | ||||
-rw-r--r-- | kernel/audit.c | 2 | ||||
-rw-r--r-- | kernel/capability.c | 4 | ||||
-rw-r--r-- | security/commoncap.c | 3 |
5 files changed, 13 insertions, 12 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 64db2bceac59..3e1290b0492e 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -297,15 +297,11 @@ static void render_cap_t(struct seq_file *m, const char *header, | |||
297 | seq_puts(m, header); | 297 | seq_puts(m, header); |
298 | CAP_FOR_EACH_U32(__capi) { | 298 | CAP_FOR_EACH_U32(__capi) { |
299 | seq_printf(m, "%08x", | 299 | seq_printf(m, "%08x", |
300 | a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]); | 300 | a->cap[CAP_LAST_U32 - __capi]); |
301 | } | 301 | } |
302 | seq_putc(m, '\n'); | 302 | seq_putc(m, '\n'); |
303 | } | 303 | } |
304 | 304 | ||
305 | /* Remove non-existent capabilities */ | ||
306 | #define NORM_CAPS(v) (v.cap[CAP_TO_INDEX(CAP_LAST_CAP)] &= \ | ||
307 | CAP_TO_MASK(CAP_LAST_CAP + 1) - 1) | ||
308 | |||
309 | static inline void task_cap(struct seq_file *m, struct task_struct *p) | 305 | static inline void task_cap(struct seq_file *m, struct task_struct *p) |
310 | { | 306 | { |
311 | const struct cred *cred; | 307 | const struct cred *cred; |
@@ -319,11 +315,6 @@ static inline void task_cap(struct seq_file *m, struct task_struct *p) | |||
319 | cap_bset = cred->cap_bset; | 315 | cap_bset = cred->cap_bset; |
320 | rcu_read_unlock(); | 316 | rcu_read_unlock(); |
321 | 317 | ||
322 | NORM_CAPS(cap_inheritable); | ||
323 | NORM_CAPS(cap_permitted); | ||
324 | NORM_CAPS(cap_effective); | ||
325 | NORM_CAPS(cap_bset); | ||
326 | |||
327 | render_cap_t(m, "CapInh:\t", &cap_inheritable); | 318 | render_cap_t(m, "CapInh:\t", &cap_inheritable); |
328 | render_cap_t(m, "CapPrm:\t", &cap_permitted); | 319 | render_cap_t(m, "CapPrm:\t", &cap_permitted); |
329 | render_cap_t(m, "CapEff:\t", &cap_effective); | 320 | render_cap_t(m, "CapEff:\t", &cap_effective); |
diff --git a/include/linux/capability.h b/include/linux/capability.h index 84b13ad67c1c..aa93e5ef594c 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
@@ -78,8 +78,11 @@ extern const kernel_cap_t __cap_init_eff_set; | |||
78 | # error Fix up hand-coded capability macro initializers | 78 | # error Fix up hand-coded capability macro initializers |
79 | #else /* HAND-CODED capability initializers */ | 79 | #else /* HAND-CODED capability initializers */ |
80 | 80 | ||
81 | #define CAP_LAST_U32 ((_KERNEL_CAPABILITY_U32S) - 1) | ||
82 | #define CAP_LAST_U32_VALID_MASK (CAP_TO_MASK(CAP_LAST_CAP + 1) -1) | ||
83 | |||
81 | # define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }}) | 84 | # define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }}) |
82 | # define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }}) | 85 | # define CAP_FULL_SET ((kernel_cap_t){{ ~0, CAP_LAST_U32_VALID_MASK }}) |
83 | # define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ | 86 | # define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ |
84 | | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \ | 87 | | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \ |
85 | CAP_FS_MASK_B1 } }) | 88 | CAP_FS_MASK_B1 } }) |
diff --git a/kernel/audit.c b/kernel/audit.c index 3ef2e0e797e8..ba2ff5a5c600 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -1677,7 +1677,7 @@ void audit_log_cap(struct audit_buffer *ab, char *prefix, kernel_cap_t *cap) | |||
1677 | audit_log_format(ab, " %s=", prefix); | 1677 | audit_log_format(ab, " %s=", prefix); |
1678 | CAP_FOR_EACH_U32(i) { | 1678 | CAP_FOR_EACH_U32(i) { |
1679 | audit_log_format(ab, "%08x", | 1679 | audit_log_format(ab, "%08x", |
1680 | cap->cap[(_KERNEL_CAPABILITY_U32S-1) - i]); | 1680 | cap->cap[CAP_LAST_U32 - i]); |
1681 | } | 1681 | } |
1682 | } | 1682 | } |
1683 | 1683 | ||
diff --git a/kernel/capability.c b/kernel/capability.c index a5cf13c018ce..989f5bfc57dc 100644 --- a/kernel/capability.c +++ b/kernel/capability.c | |||
@@ -258,6 +258,10 @@ SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data) | |||
258 | i++; | 258 | i++; |
259 | } | 259 | } |
260 | 260 | ||
261 | effective.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; | ||
262 | permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; | ||
263 | inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; | ||
264 | |||
261 | new = prepare_creds(); | 265 | new = prepare_creds(); |
262 | if (!new) | 266 | if (!new) |
263 | return -ENOMEM; | 267 | return -ENOMEM; |
diff --git a/security/commoncap.c b/security/commoncap.c index 9fe46e22c7f2..bab0611afc1e 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
@@ -421,6 +421,9 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data | |||
421 | cpu_caps->inheritable.cap[i] = le32_to_cpu(caps.data[i].inheritable); | 421 | cpu_caps->inheritable.cap[i] = le32_to_cpu(caps.data[i].inheritable); |
422 | } | 422 | } |
423 | 423 | ||
424 | cpu_caps->permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; | ||
425 | cpu_caps->inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; | ||
426 | |||
424 | return 0; | 427 | return 0; |
425 | } | 428 | } |
426 | 429 | ||