X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=kernel%2Fuser.c;h=2116642f42c62a2f6b02a7238a336d82621ad31f;hb=8a5bc075b8d8cf7a87b3f08fad2fba0f5d13295e;hp=d9deae43a9abbb0f8dfaeeb078e8fb83311bc481;hpb=6bd0e10e53cc4824cd8cdaab8c370e53ab2e23c2;p=linux-2.6 diff --git a/kernel/user.c b/kernel/user.c index d9deae43a9..2116642f42 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -105,15 +105,19 @@ void free_uid(struct user_struct *up) { unsigned long flags; + if (!up) + return; + local_irq_save(flags); - if (up && atomic_dec_and_lock(&up->__count, &uidhash_lock)) { + if (atomic_dec_and_lock(&up->__count, &uidhash_lock)) { uid_hash_remove(up); + spin_unlock_irqrestore(&uidhash_lock, flags); key_put(up->uid_keyring); key_put(up->session_keyring); kmem_cache_free(uid_cachep, up); - spin_unlock(&uidhash_lock); + } else { + local_irq_restore(flags); } - local_irq_restore(flags); } struct user_struct * alloc_uid(uid_t uid)