|
@@ -187,6 +187,17 @@ void switch_uid(struct user_struct *new_user)
|
|
atomic_dec(&old_user->processes);
|
|
atomic_dec(&old_user->processes);
|
|
switch_uid_keyring(new_user);
|
|
switch_uid_keyring(new_user);
|
|
current->user = new_user;
|
|
current->user = new_user;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We need to synchronize with __sigqueue_alloc()
|
|
|
|
+ * doing a get_uid(p->user).. If that saw the old
|
|
|
|
+ * user value, we need to wait until it has exited
|
|
|
|
+ * its critical region before we can free the old
|
|
|
|
+ * structure.
|
|
|
|
+ */
|
|
|
|
+ smp_mb();
|
|
|
|
+ spin_unlock_wait(¤t->sighand->siglock);
|
|
|
|
+
|
|
free_uid(old_user);
|
|
free_uid(old_user);
|
|
suid_keys(current);
|
|
suid_keys(current);
|
|
}
|
|
}
|