diff options
Diffstat (limited to 'security/keys/process_keys.c')
-rw-r--r-- | security/keys/process_keys.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c index b6f86808475a..2a0eb946fc7e 100644 --- a/security/keys/process_keys.c +++ b/security/keys/process_keys.c | |||
@@ -26,7 +26,7 @@ static DEFINE_MUTEX(key_session_mutex); | |||
26 | /* the root user's tracking struct */ | 26 | /* the root user's tracking struct */ |
27 | struct key_user root_key_user = { | 27 | struct key_user root_key_user = { |
28 | .usage = ATOMIC_INIT(3), | 28 | .usage = ATOMIC_INIT(3), |
29 | .consq = LIST_HEAD_INIT(root_key_user.consq), | 29 | .cons_lock = __MUTEX_INITIALIZER(root_key_user.cons_lock), |
30 | .lock = __SPIN_LOCK_UNLOCKED(root_key_user.lock), | 30 | .lock = __SPIN_LOCK_UNLOCKED(root_key_user.lock), |
31 | .nkeys = ATOMIC_INIT(2), | 31 | .nkeys = ATOMIC_INIT(2), |
32 | .nikeys = ATOMIC_INIT(2), | 32 | .nikeys = ATOMIC_INIT(2), |
@@ -679,8 +679,18 @@ key_ref_t lookup_user_key(struct task_struct *context, key_serial_t id, | |||
679 | break; | 679 | break; |
680 | } | 680 | } |
681 | 681 | ||
682 | /* check the status */ | 682 | if (!partial) { |
683 | if (perm) { | 683 | ret = wait_for_key_construction(key, true); |
684 | switch (ret) { | ||
685 | case -ERESTARTSYS: | ||
686 | goto invalid_key; | ||
687 | default: | ||
688 | if (perm) | ||
689 | goto invalid_key; | ||
690 | case 0: | ||
691 | break; | ||
692 | } | ||
693 | } else if (perm) { | ||
684 | ret = key_validate(key); | 694 | ret = key_validate(key); |
685 | if (ret < 0) | 695 | if (ret < 0) |
686 | goto invalid_key; | 696 | goto invalid_key; |