func: key_ref_t keyring_search(key_ref_t struct key_type const char *description) struct keyring_search_context ctx . index_key . type = type . index_key . description = description . cred = current_cred ( ) . match_data . cmp = key_default_cmp . match_data . raw_data = description . match_data . lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT . flags = KEYRING_SEARCH_DO_STATE_CHECK , key_ref_t key ; int ret ; if ( type -> match_preparse )  ret = type -> match_preparse ( & ctx . match_data ); if ( ret < 0 )  key = keyring_search_aux ( keyring , & ctx ); key_ref_t keyring_search_aux(key_ref_t struct keyring_search_context *ctx) struct key * keyring ; long err ; ctx -> iterator = keyring_search_iterator; ctx -> possessed = is_key_possessed ( keyring_ref ); ctx -> result = ERR_PTR ( - EAGAIN ); keyring = key_ref_to_ptr ( keyring_ref ); if ( keyring -> type != & key_type_keyring )  if ( ! ( ctx -> flags & KEYRING_SEARCH_NO_CHECK_PERM ) )  err = key_task_permission ( keyring_ref , ctx -> cred , KEY_NEED_SEARCH ); if ( err < 0 )  ctx -> now = current_kernel_time ( ); if ( search_nested_keyrings ( keyring , ctx ) )  static bool search_nested_keyrings(struct key struct keyring_search_context *ctx) if ( ctx -> index_key . description )  ctx -> index_key . desc_len = strlen ( ctx -> index_key . description ); if ( ctx -> match_data . lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE || keyring_compare_object ( keyring , & ctx -> index_key ) )  static bool keyring_compare_object(const void *object, const void *data) const struct keyring_index_key * index_key = data ; const struct key * key = keyring_ptr_to_key ( object ) ; static inline struct key *keyring_ptr_to_key(const struct assoc_array_ptr *x) void * object = assoc_array_ptr_to_leaf ( x ) ; return ( struct key * ) ( ( unsigned long ) object & ~KEYRING_PTR_SUBTYPE ) ; return key -> index_key . type == index_key -> type && key -> index_key . desc_len == index_key -> desc_len && memcmp ( key -> index_key . description , index_key -> description , index_key -> desc_len ) == 0 ; ctx -> skipped_ret = 2; switch ( ctx -> iterator ( keyring_key_to_ptr ( keyring ) , ctx ) )  static inline void *keyring_key_to_ptr(struct key *key) if ( key -> type == & key_type_keyring )  return ( void * ) ( ( unsigned long ) key | KEYRING_PTR_SUBTYPE ) ; return key ; key = key_ref_to_ptr ( ctx -> result ); key_check ( key ); if ( ! ( ctx -> flags & KEYRING_SEARCH_NO_UPDATE_TIME ) )  key -> last_used_at = ctx -> now . tv_sec; keyring -> last_used_at = ctx -> now . tv_sec; stack [ -- sp ] . keyring -> last_used_at = ctx -> now . tv_sec; 