diff options
Diffstat (limited to 'security/keys/proc.c')
| -rw-r--r-- | security/keys/proc.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/security/keys/proc.c b/security/keys/proc.c index 217b6855e81..d3f6f2fd21d 100644 --- a/security/keys/proc.c +++ b/security/keys/proc.c @@ -182,7 +182,6 @@ static void proc_keys_stop(struct seq_file *p, void *v)  static int proc_keys_show(struct seq_file *m, void *v)  { -	const struct cred *cred = current_cred();  	struct rb_node *_p = v;  	struct key *key = rb_entry(_p, struct key, serial_node);  	struct timespec now; @@ -191,15 +190,23 @@ static int proc_keys_show(struct seq_file *m, void *v)  	char xbuf[12];  	int rc; +	struct keyring_search_context ctx = { +		.index_key.type		= key->type, +		.index_key.description	= key->description, +		.cred			= current_cred(), +		.match			= lookup_user_key_possessed, +		.match_data		= key, +		.flags			= (KEYRING_SEARCH_NO_STATE_CHECK | +					   KEYRING_SEARCH_LOOKUP_DIRECT), +	}; +  	key_ref = make_key_ref(key, 0);  	/* determine if the key is possessed by this process (a test we can  	 * skip if the key does not indicate the possessor can view it  	 */  	if (key->perm & KEY_POS_VIEW) { -		skey_ref = search_my_process_keyrings(key->type, key, -						      lookup_user_key_possessed, -						      true, cred); +		skey_ref = search_my_process_keyrings(&ctx);  		if (!IS_ERR(skey_ref)) {  			key_ref_put(skey_ref);  			key_ref = make_key_ref(key, 1); @@ -211,7 +218,7 @@ static int proc_keys_show(struct seq_file *m, void *v)  	 * - the caller holds a spinlock, and thus the RCU read lock, making our  	 *   access to __current_cred() safe  	 */ -	rc = key_task_permission(key_ref, cred, KEY_VIEW); +	rc = key_task_permission(key_ref, ctx.cred, KEY_NEED_VIEW);  	if (rc < 0)  		return 0;  | 
