git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.5.x5
[linux-2.6.git]
/
kernel
/
user.c
diff --git
a/kernel/user.c
b/kernel/user.c
index
5e6a221
..
163206f
100644
(file)
--- a/
kernel/user.c
+++ b/
kernel/user.c
@@
-12,6
+12,7
@@
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/bitops.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/bitops.h>
+#include <linux/key.h>
/*
* UID task count cache, to get fast user lookup in "alloc_uid"
/*
* UID task count cache, to get fast user lookup in "alloc_uid"
@@
-25,7
+26,7
@@
static kmem_cache_t *uid_cachep;
static struct list_head uidhash_table[UIDHASH_SZ];
static kmem_cache_t *uid_cachep;
static struct list_head uidhash_table[UIDHASH_SZ];
-static
spinlock_t uidhash_lock = SPIN_LOCK_UNLOCKED
;
+static
DEFINE_SPINLOCK(uidhash_lock)
;
struct user_struct root_user = {
.__count = ATOMIC_INIT(1),
struct user_struct root_user = {
.__count = ATOMIC_INIT(1),
@@
-34,6
+35,10
@@
struct user_struct root_user = {
.sigpending = ATOMIC_INIT(0),
.mq_bytes = 0,
.locked_shm = 0,
.sigpending = ATOMIC_INIT(0),
.mq_bytes = 0,
.locked_shm = 0,
+#ifdef CONFIG_KEYS
+ .uid_keyring = &root_user_keyring,
+ .session_keyring = &root_session_keyring,
+#endif
};
/*
};
/*
@@
-87,6
+92,8
@@
void free_uid(struct user_struct *up)
{
if (up && atomic_dec_and_lock(&up->__count, &uidhash_lock)) {
uid_hash_remove(up);
{
if (up && atomic_dec_and_lock(&up->__count, &uidhash_lock)) {
uid_hash_remove(up);
+ key_put(up->uid_keyring);
+ key_put(up->session_keyring);
kmem_cache_free(uid_cachep, up);
spin_unlock(&uidhash_lock);
}
kmem_cache_free(uid_cachep, up);
spin_unlock(&uidhash_lock);
}
@@
-117,6
+124,11
@@
struct user_struct * alloc_uid(xid_t xid, uid_t uid)
new->mq_bytes = 0;
new->locked_shm = 0;
new->mq_bytes = 0;
new->locked_shm = 0;
+ if (alloc_uid_keyring(new) < 0) {
+ kmem_cache_free(uid_cachep, new);
+ return NULL;
+ }
+
/*
* Before adding this, check whether we raced
* on adding the same user already..
/*
* Before adding this, check whether we raced
* on adding the same user already..
@@
-124,6
+136,8
@@
struct user_struct * alloc_uid(xid_t xid, uid_t uid)
spin_lock(&uidhash_lock);
up = uid_hash_find(xid, uid, hashent);
if (up) {
spin_lock(&uidhash_lock);
up = uid_hash_find(xid, uid, hashent);
if (up) {
+ key_put(new->uid_keyring);
+ key_put(new->session_keyring);
kmem_cache_free(uid_cachep, new);
} else {
uid_hash_insert(new, hashent);
kmem_cache_free(uid_cachep, new);
} else {
uid_hash_insert(new, hashent);
@@
-147,8
+161,10
@@
void switch_uid(struct user_struct *new_user)
old_user = current->user;
atomic_inc(&new_user->processes);
atomic_dec(&old_user->processes);
old_user = current->user;
atomic_inc(&new_user->processes);
atomic_dec(&old_user->processes);
+ switch_uid_keyring(new_user);
current->user = new_user;
free_uid(old_user);
current->user = new_user;
free_uid(old_user);
+ suid_keys(current);
}
}