]> Pileus Git - ~andy/linux/blobdiff - security/keys/process_keys.c
drm/udl: only bind to the video devices on the hub.
[~andy/linux] / security / keys / process_keys.c
index e137fcd7042c933ed965e56e79847007add678e1..4ad54eea1ea45554d5d931497671fdb32a33660b 100644 (file)
@@ -834,23 +834,17 @@ error:
  * Replace a process's session keyring on behalf of one of its children when
  * the target  process is about to resume userspace execution.
  */
-void key_replace_session_keyring(void)
+void key_change_session_keyring(struct task_work *twork)
 {
-       const struct cred *old;
-       struct cred *new;
-
-       if (!current->replacement_session_keyring)
-               return;
+       const struct cred *old = current_cred();
+       struct cred *new = twork->data;
 
-       write_lock_irq(&tasklist_lock);
-       new = current->replacement_session_keyring;
-       current->replacement_session_keyring = NULL;
-       write_unlock_irq(&tasklist_lock);
-
-       if (!new)
+       kfree(twork);
+       if (unlikely(current->flags & PF_EXITING)) {
+               put_cred(new);
                return;
+       }
 
-       old = current_cred();
        new->  uid      = old->  uid;
        new-> euid      = old-> euid;
        new-> suid      = old-> suid;
@@ -860,7 +854,7 @@ void key_replace_session_keyring(void)
        new-> sgid      = old-> sgid;
        new->fsgid      = old->fsgid;
        new->user       = get_uid(old->user);
-       new->user_ns    = new->user->user_ns;
+       new->user_ns    = get_user_ns(new->user_ns);
        new->group_info = get_group_info(old->group_info);
 
        new->securebits = old->securebits;