diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-02 14:11:09 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-02 14:11:09 -0400 |
| commit | 437589a74b6a590d175f86cf9f7b2efcee7765e7 (patch) | |
| tree | 37bf8635b1356d80ef002b00e84f3faf3d555a63 /include/linux | |
| parent | 68d47a137c3bef754923bccf73fb639c9b0bbd5e (diff) | |
| parent | 72235465864d84cedb2d9f26f8e1de824ee20339 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull user namespace changes from Eric Biederman:
"This is a mostly modest set of changes to enable basic user namespace
support. This allows the code to code to compile with user namespaces
enabled and removes the assumption there is only the initial user
namespace. Everything is converted except for the most complex of the
filesystems: autofs4, 9p, afs, ceph, cifs, coda, fuse, gfs2, ncpfs,
nfs, ocfs2 and xfs as those patches need a bit more review.
The strategy is to push kuid_t and kgid_t values are far down into
subsystems and filesystems as reasonable. Leaving the make_kuid and
from_kuid operations to happen at the edge of userspace, as the values
come off the disk, and as the values come in from the network.
Letting compile type incompatible compile errors (present when user
namespaces are enabled) guide me to find the issues.
The most tricky areas have been the places where we had an implicit
union of uid and gid values and were storing them in an unsigned int.
Those places were converted into explicit unions. I made certain to
handle those places with simple trivial patches.
Out of that work I discovered we have generic interfaces for storing
quota by projid. I had never heard of the project identifiers before.
Adding full user namespace support for project identifiers accounts
for most of the code size growth in my git tree.
Ultimately there will be work to relax privlige checks from
"capable(FOO)" to "ns_capable(user_ns, FOO)" where it is safe allowing
root in a user names to do those things that today we only forbid to
non-root users because it will confuse suid root applications.
While I was pushing kuid_t and kgid_t changes deep into the audit code
I made a few other cleanups. I capitalized on the fact we process
netlink messages in the context of the message sender. I removed
usage of NETLINK_CRED, and started directly using current->tty.
Some of these patches have also made it into maintainer trees, with no
problems from identical code from different trees showing up in
linux-next.
After reading through all of this code I feel like I might be able to
win a game of kernel trivial pursuit."
Fix up some fairly trivial conflicts in netfilter uid/git logging code.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: (107 commits)
userns: Convert the ufs filesystem to use kuid/kgid where appropriate
userns: Convert the udf filesystem to use kuid/kgid where appropriate
userns: Convert ubifs to use kuid/kgid
userns: Convert squashfs to use kuid/kgid where appropriate
userns: Convert reiserfs to use kuid and kgid where appropriate
userns: Convert jfs to use kuid/kgid where appropriate
userns: Convert jffs2 to use kuid and kgid where appropriate
userns: Convert hpfs to use kuid and kgid where appropriate
userns: Convert btrfs to use kuid/kgid where appropriate
userns: Convert bfs to use kuid/kgid where appropriate
userns: Convert affs to use kuid/kgid wherwe appropriate
userns: On alpha modify linux_to_osf_stat to use convert from kuids and kgids
userns: On ia64 deal with current_uid and current_gid being kuid and kgid
userns: On ppc convert current_uid from a kuid before printing.
userns: Convert s390 getting uid and gid system calls to use kuid and kgid
userns: Convert s390 hypfs to use kuid and kgid where appropriate
userns: Convert binder ipc to use kuids
userns: Teach security_path_chown to take kuids and kgids
userns: Add user namespace support to IMA
userns: Convert EVM to deal with kuids and kgids in it's hmac computation
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/audit.h | 12 | ||||
| -rw-r--r-- | include/linux/inet_diag.h | 1 | ||||
| -rw-r--r-- | include/linux/init_task.h | 2 | ||||
| -rw-r--r-- | include/linux/ipc.h | 9 | ||||
| -rw-r--r-- | include/linux/key.h | 9 | ||||
| -rw-r--r-- | include/linux/loop.h | 2 | ||||
| -rw-r--r-- | include/linux/netlink.h | 1 | ||||
| -rw-r--r-- | include/linux/posix_acl.h | 8 | ||||
| -rw-r--r-- | include/linux/posix_acl_xattr.h | 18 | ||||
| -rw-r--r-- | include/linux/projid.h | 104 | ||||
| -rw-r--r-- | include/linux/quota.h | 136 | ||||
| -rw-r--r-- | include/linux/quotaops.h | 6 | ||||
| -rw-r--r-- | include/linux/sched.h | 2 | ||||
| -rw-r--r-- | include/linux/security.h | 6 | ||||
| -rw-r--r-- | include/linux/seq_file.h | 14 | ||||
| -rw-r--r-- | include/linux/tsacct_kern.h | 8 | ||||
| -rw-r--r-- | include/linux/tty.h | 4 | ||||
| -rw-r--r-- | include/linux/user_namespace.h | 3 |
18 files changed, 310 insertions, 35 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h index 36abf2aa7e68..12367cbadfe1 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -442,6 +442,8 @@ struct audit_krule { | |||
| 442 | struct audit_field { | 442 | struct audit_field { |
| 443 | u32 type; | 443 | u32 type; |
| 444 | u32 val; | 444 | u32 val; |
| 445 | kuid_t uid; | ||
| 446 | kgid_t gid; | ||
| 445 | u32 op; | 447 | u32 op; |
| 446 | char *lsm_str; | 448 | char *lsm_str; |
| 447 | void *lsm_rule; | 449 | void *lsm_rule; |
| @@ -525,7 +527,7 @@ static inline void audit_ptrace(struct task_struct *t) | |||
| 525 | extern unsigned int audit_serial(void); | 527 | extern unsigned int audit_serial(void); |
| 526 | extern int auditsc_get_stamp(struct audit_context *ctx, | 528 | extern int auditsc_get_stamp(struct audit_context *ctx, |
| 527 | struct timespec *t, unsigned int *serial); | 529 | struct timespec *t, unsigned int *serial); |
| 528 | extern int audit_set_loginuid(uid_t loginuid); | 530 | extern int audit_set_loginuid(kuid_t loginuid); |
| 529 | #define audit_get_loginuid(t) ((t)->loginuid) | 531 | #define audit_get_loginuid(t) ((t)->loginuid) |
| 530 | #define audit_get_sessionid(t) ((t)->sessionid) | 532 | #define audit_get_sessionid(t) ((t)->sessionid) |
| 531 | extern void audit_log_task_context(struct audit_buffer *ab); | 533 | extern void audit_log_task_context(struct audit_buffer *ab); |
| @@ -637,7 +639,7 @@ extern int audit_signals; | |||
| 637 | #define audit_core_dumps(i) do { ; } while (0) | 639 | #define audit_core_dumps(i) do { ; } while (0) |
| 638 | #define audit_seccomp(i,s,c) do { ; } while (0) | 640 | #define audit_seccomp(i,s,c) do { ; } while (0) |
| 639 | #define auditsc_get_stamp(c,t,s) (0) | 641 | #define auditsc_get_stamp(c,t,s) (0) |
| 640 | #define audit_get_loginuid(t) (-1) | 642 | #define audit_get_loginuid(t) (INVALID_UID) |
| 641 | #define audit_get_sessionid(t) (-1) | 643 | #define audit_get_sessionid(t) (-1) |
| 642 | #define audit_log_task_context(b) do { ; } while (0) | 644 | #define audit_log_task_context(b) do { ; } while (0) |
| 643 | #define audit_ipc_obj(i) ((void)0) | 645 | #define audit_ipc_obj(i) ((void)0) |
| @@ -700,10 +702,10 @@ extern void audit_log_secctx(struct audit_buffer *ab, u32 secid); | |||
| 700 | extern int audit_update_lsm_rules(void); | 702 | extern int audit_update_lsm_rules(void); |
| 701 | 703 | ||
| 702 | /* Private API (for audit.c only) */ | 704 | /* Private API (for audit.c only) */ |
| 703 | extern int audit_filter_user(struct netlink_skb_parms *cb); | 705 | extern int audit_filter_user(void); |
| 704 | extern int audit_filter_type(int type); | 706 | extern int audit_filter_type(int type); |
| 705 | extern int audit_receive_filter(int type, int pid, int uid, int seq, | 707 | extern int audit_receive_filter(int type, int pid, int seq, |
| 706 | void *data, size_t datasz, uid_t loginuid, | 708 | void *data, size_t datasz, kuid_t loginuid, |
| 707 | u32 sessionid, u32 sid); | 709 | u32 sessionid, u32 sid); |
| 708 | extern int audit_enabled; | 710 | extern int audit_enabled; |
| 709 | #else | 711 | #else |
diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h index f1362b5447fc..e788c186ed3a 100644 --- a/include/linux/inet_diag.h +++ b/include/linux/inet_diag.h | |||
| @@ -159,6 +159,7 @@ struct inet_diag_handler { | |||
| 159 | struct inet_connection_sock; | 159 | struct inet_connection_sock; |
| 160 | int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, | 160 | int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, |
| 161 | struct sk_buff *skb, struct inet_diag_req_v2 *req, | 161 | struct sk_buff *skb, struct inet_diag_req_v2 *req, |
| 162 | struct user_namespace *user_ns, | ||
| 162 | u32 pid, u32 seq, u16 nlmsg_flags, | 163 | u32 pid, u32 seq, u16 nlmsg_flags, |
| 163 | const struct nlmsghdr *unlh); | 164 | const struct nlmsghdr *unlh); |
| 164 | void inet_diag_dump_icsk(struct inet_hashinfo *h, struct sk_buff *skb, | 165 | void inet_diag_dump_icsk(struct inet_hashinfo *h, struct sk_buff *skb, |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 89f1cb1056f0..6d087c5f57f7 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -92,7 +92,7 @@ extern struct group_info init_groups; | |||
| 92 | 92 | ||
| 93 | #ifdef CONFIG_AUDITSYSCALL | 93 | #ifdef CONFIG_AUDITSYSCALL |
| 94 | #define INIT_IDS \ | 94 | #define INIT_IDS \ |
| 95 | .loginuid = -1, \ | 95 | .loginuid = INVALID_UID, \ |
| 96 | .sessionid = -1, | 96 | .sessionid = -1, |
| 97 | #else | 97 | #else |
| 98 | #define INIT_IDS | 98 | #define INIT_IDS |
diff --git a/include/linux/ipc.h b/include/linux/ipc.h index 30e816148df4..ca833fdc3138 100644 --- a/include/linux/ipc.h +++ b/include/linux/ipc.h | |||
| @@ -79,6 +79,7 @@ struct ipc_kludge { | |||
| 79 | 79 | ||
| 80 | #ifdef __KERNEL__ | 80 | #ifdef __KERNEL__ |
| 81 | #include <linux/spinlock.h> | 81 | #include <linux/spinlock.h> |
| 82 | #include <linux/uidgid.h> | ||
| 82 | 83 | ||
| 83 | #define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */ | 84 | #define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */ |
| 84 | 85 | ||
| @@ -89,10 +90,10 @@ struct kern_ipc_perm | |||
| 89 | int deleted; | 90 | int deleted; |
| 90 | int id; | 91 | int id; |
| 91 | key_t key; | 92 | key_t key; |
| 92 | uid_t uid; | 93 | kuid_t uid; |
| 93 | gid_t gid; | 94 | kgid_t gid; |
| 94 | uid_t cuid; | 95 | kuid_t cuid; |
| 95 | gid_t cgid; | 96 | kgid_t cgid; |
| 96 | umode_t mode; | 97 | umode_t mode; |
| 97 | unsigned long seq; | 98 | unsigned long seq; |
| 98 | void *security; | 99 | void *security; |
diff --git a/include/linux/key.h b/include/linux/key.h index cef3b315ba7c..2393b1c040b6 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/atomic.h> | 24 | #include <linux/atomic.h> |
| 25 | 25 | ||
| 26 | #ifdef __KERNEL__ | 26 | #ifdef __KERNEL__ |
| 27 | #include <linux/uidgid.h> | ||
| 27 | 28 | ||
| 28 | /* key handle serial number */ | 29 | /* key handle serial number */ |
| 29 | typedef int32_t key_serial_t; | 30 | typedef int32_t key_serial_t; |
| @@ -137,8 +138,8 @@ struct key { | |||
| 137 | time_t revoked_at; /* time at which key was revoked */ | 138 | time_t revoked_at; /* time at which key was revoked */ |
| 138 | }; | 139 | }; |
| 139 | time_t last_used_at; /* last time used for LRU keyring discard */ | 140 | time_t last_used_at; /* last time used for LRU keyring discard */ |
| 140 | uid_t uid; | 141 | kuid_t uid; |
| 141 | gid_t gid; | 142 | kgid_t gid; |
| 142 | key_perm_t perm; /* access permissions */ | 143 | key_perm_t perm; /* access permissions */ |
| 143 | unsigned short quotalen; /* length added to quota */ | 144 | unsigned short quotalen; /* length added to quota */ |
| 144 | unsigned short datalen; /* payload data length | 145 | unsigned short datalen; /* payload data length |
| @@ -193,7 +194,7 @@ struct key { | |||
| 193 | 194 | ||
| 194 | extern struct key *key_alloc(struct key_type *type, | 195 | extern struct key *key_alloc(struct key_type *type, |
| 195 | const char *desc, | 196 | const char *desc, |
| 196 | uid_t uid, gid_t gid, | 197 | kuid_t uid, kgid_t gid, |
| 197 | const struct cred *cred, | 198 | const struct cred *cred, |
| 198 | key_perm_t perm, | 199 | key_perm_t perm, |
| 199 | unsigned long flags); | 200 | unsigned long flags); |
| @@ -262,7 +263,7 @@ extern int key_link(struct key *keyring, | |||
| 262 | extern int key_unlink(struct key *keyring, | 263 | extern int key_unlink(struct key *keyring, |
| 263 | struct key *key); | 264 | struct key *key); |
| 264 | 265 | ||
| 265 | extern struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid, | 266 | extern struct key *keyring_alloc(const char *description, kuid_t uid, kgid_t gid, |
| 266 | const struct cred *cred, | 267 | const struct cred *cred, |
| 267 | unsigned long flags, | 268 | unsigned long flags, |
| 268 | struct key *dest); | 269 | struct key *dest); |
diff --git a/include/linux/loop.h b/include/linux/loop.h index 11a41a8f08eb..9635116dd830 100644 --- a/include/linux/loop.h +++ b/include/linux/loop.h | |||
| @@ -44,7 +44,7 @@ struct loop_device { | |||
| 44 | int lo_encrypt_key_size; | 44 | int lo_encrypt_key_size; |
| 45 | struct loop_func_table *lo_encryption; | 45 | struct loop_func_table *lo_encryption; |
| 46 | __u32 lo_init[2]; | 46 | __u32 lo_init[2]; |
| 47 | uid_t lo_key_owner; /* Who set the key */ | 47 | kuid_t lo_key_owner; /* Who set the key */ |
| 48 | int (*ioctl)(struct loop_device *, int cmd, | 48 | int |
