0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/export.h>
0009 #include <linux/init.h>
0010 #include <linux/sched.h>
0011 #include <linux/slab.h>
0012 #include <linux/security.h>
0013 #include <linux/seq_file.h>
0014 #include <linux/err.h>
0015 #include <linux/user_namespace.h>
0016 #include <linux/nsproxy.h>
0017 #include <keys/keyring-type.h>
0018 #include <keys/user-type.h>
0019 #include <linux/assoc_array_priv.h>
0020 #include <linux/uaccess.h>
0021 #include <net/net_namespace.h>
0022 #include "internal.h"
0023
0024
0025
0026
0027
0028 #define KEYRING_SEARCH_MAX_DEPTH 6
0029
0030
0031
0032
0033
0034 #define KEYRING_PTR_SUBTYPE 0x2UL
0035
0036 static inline bool keyring_ptr_is_keyring(const struct assoc_array_ptr *x)
0037 {
0038 return (unsigned long)x & KEYRING_PTR_SUBTYPE;
0039 }
0040 static inline struct key *keyring_ptr_to_key(const struct assoc_array_ptr *x)
0041 {
0042 void *object = assoc_array_ptr_to_leaf(x);
0043 return (struct key *)((unsigned long)object & ~KEYRING_PTR_SUBTYPE);
0044 }
0045 static inline void *keyring_key_to_ptr(struct key *key)
0046 {
0047 if (key->type == &key_type_keyring)
0048 return (void *)((unsigned long)key | KEYRING_PTR_SUBTYPE);
0049 return key;
0050 }
0051
0052 static DEFINE_RWLOCK(keyring_name_lock);
0053
0054
0055
0056
0057 void key_free_user_ns(struct user_namespace *ns)
0058 {
0059 write_lock(&keyring_name_lock);
0060 list_del_init(&ns->keyring_name_list);
0061 write_unlock(&keyring_name_lock);
0062
0063 key_put(ns->user_keyring_register);
0064 #ifdef CONFIG_PERSISTENT_KEYRINGS
0065 key_put(ns->persistent_keyring_register);
0066 #endif
0067 }
0068
0069
0070
0071
0072
0073
0074 static int keyring_preparse(struct key_preparsed_payload *prep);
0075 static void keyring_free_preparse(struct key_preparsed_payload *prep);
0076 static int keyring_instantiate(struct key *keyring,
0077 struct key_preparsed_payload *prep);
0078 static void keyring_revoke(struct key *keyring);
0079 static void keyring_destroy(struct key *keyring);
0080 static void keyring_describe(const struct key *keyring, struct seq_file *m);
0081 static long keyring_read(const struct key *keyring,
0082 char __user *buffer, size_t buflen);
0083
0084 struct key_type key_type_keyring = {
0085 .name = "keyring",
0086 .def_datalen = 0,
0087 .preparse = keyring_preparse,
0088 .free_preparse = keyring_free_preparse,
0089 .instantiate = keyring_instantiate,
0090 .revoke = keyring_revoke,
0091 .destroy = keyring_destroy,
0092 .describe = keyring_describe,
0093 .read = keyring_read,
0094 };
0095 EXPORT_SYMBOL(key_type_keyring);
0096
0097
0098
0099
0100
0101 static DEFINE_MUTEX(keyring_serialise_link_lock);
0102
0103
0104
0105
0106
0107 static void keyring_publish_name(struct key *keyring)
0108 {
0109 struct user_namespace *ns = current_user_ns();
0110
0111 if (keyring->description &&
0112 keyring->description[0] &&
0113 keyring->description[0] != '.') {
0114 write_lock(&keyring_name_lock);
0115 list_add_tail(&keyring->name_link, &ns->keyring_name_list);
0116 write_unlock(&keyring_name_lock);
0117 }
0118 }
0119
0120
0121
0122
0123 static int keyring_preparse(struct key_preparsed_payload *prep)
0124 {
0125 return prep->datalen != 0 ? -EINVAL : 0;
0126 }
0127
0128
0129
0130
0131 static void keyring_free_preparse(struct key_preparsed_payload *prep)
0132 {
0133 }
0134
0135
0136
0137
0138
0139
0140 static int keyring_instantiate(struct key *keyring,
0141 struct key_preparsed_payload *prep)
0142 {
0143 assoc_array_init(&keyring->keys);
0144
0145 keyring_publish_name(keyring);
0146 return 0;
0147 }
0148
0149
0150
0151
0152
0153 static u64 mult_64x32_and_fold(u64 x, u32 y)
0154 {
0155 u64 hi = (u64)(u32)(x >> 32) * y;
0156 u64 lo = (u64)(u32)(x) * y;
0157 return lo + ((u64)(u32)hi << 32) + (u32)(hi >> 32);
0158 }
0159
0160
0161
0162
0163 static void hash_key_type_and_desc(struct keyring_index_key *index_key)
0164 {
0165 const unsigned level_shift = ASSOC_ARRAY_LEVEL_STEP;
0166 const unsigned long fan_mask = ASSOC_ARRAY_FAN_MASK;
0167 const char *description = index_key->description;
0168 unsigned long hash, type;
0169 u32 piece;
0170 u64 acc;
0171 int n, desc_len = index_key->desc_len;
0172
0173 type = (unsigned long)index_key->type;
0174 acc = mult_64x32_and_fold(type, desc_len + 13);
0175 acc = mult_64x32_and_fold(acc, 9207);
0176 piece = (unsigned long)index_key->domain_tag;
0177 acc = mult_64x32_and_fold(acc, piece);
0178 acc = mult_64x32_and_fold(acc, 9207);
0179
0180 for (;;) {
0181 n = desc_len;
0182 if (n <= 0)
0183 break;
0184 if (n > 4)
0185 n = 4;
0186 piece = 0;
0187 memcpy(&piece, description, n);
0188 description += n;
0189 desc_len -= n;
0190 acc = mult_64x32_and_fold(acc, piece);
0191 acc = mult_64x32_and_fold(acc, 9207);
0192 }
0193
0194
0195 hash = acc;
0196 if (ASSOC_ARRAY_KEY_CHUNK_SIZE == 32)
0197 hash ^= acc >> 32;
0198
0199
0200
0201
0202
0203 if (index_key->type != &key_type_keyring && (hash & fan_mask) == 0)
0204 hash |= (hash >> (ASSOC_ARRAY_KEY_CHUNK_SIZE - level_shift)) | 1;
0205 else if (index_key->type == &key_type_keyring && (hash & fan_mask) != 0)
0206 hash = (hash + (hash << level_shift)) & ~fan_mask;
0207 index_key->hash = hash;
0208 }
0209
0210
0211
0212
0213
0214 void key_set_index_key(struct keyring_index_key *index_key)
0215 {
0216 static struct key_tag default_domain_tag = { .usage = REFCOUNT_INIT(1), };
0217 size_t n = min_t(size_t, index_key->desc_len, sizeof(index_key->desc));
0218
0219 memcpy(index_key->desc, index_key->description, n);
0220
0221 if (!index_key->domain_tag) {
0222 if (index_key->type->flags & KEY_TYPE_NET_DOMAIN)
0223 index_key->domain_tag = current->nsproxy->net_ns->key_domain;
0224 else
0225 index_key->domain_tag = &default_domain_tag;
0226 }
0227
0228 hash_key_type_and_desc(index_key);
0229 }
0230
0231
0232
0233
0234
0235
0236
0237
0238 bool key_put_tag(struct key_tag *tag)
0239 {
0240 if (refcount_dec_and_test(&tag->usage)) {
0241 kfree_rcu(tag, rcu);
0242 return true;
0243 }
0244
0245 return false;
0246 }
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256 void key_remove_domain(struct key_tag *domain_tag)
0257 {
0258 domain_tag->removed = true;
0259 if (!key_put_tag(domain_tag))
0260 key_schedule_gc_links();
0261 }
0262
0263
0264
0265
0266
0267
0268 static unsigned long keyring_get_key_chunk(const void *data, int level)
0269 {
0270 const struct keyring_index_key *index_key = data;
0271 unsigned long chunk = 0;
0272 const u8 *d;
0273 int desc_len = index_key->desc_len, n = sizeof(chunk);
0274
0275 level /= ASSOC_ARRAY_KEY_CHUNK_SIZE;
0276 switch (level) {
0277 case 0:
0278 return index_key->hash;
0279 case 1:
0280 return index_key->x;
0281 case 2:
0282 return (unsigned long)index_key->type;
0283 case 3:
0284 return (unsigned long)index_key->domain_tag;
0285 default:
0286 level -= 4;
0287 if (desc_len <= sizeof(index_key->desc))
0288 return 0;
0289
0290 d = index_key->description + sizeof(index_key->desc);
0291 d += level * sizeof(long);
0292 desc_len -= sizeof(index_key->desc);
0293 if (desc_len > n)
0294 desc_len = n;
0295 do {
0296 chunk <<= 8;
0297 chunk |= *d++;
0298 } while (--desc_len > 0);
0299 return chunk;
0300 }
0301 }
0302
0303 static unsigned long keyring_get_object_key_chunk(const void *object, int level)
0304 {
0305 const struct key *key = keyring_ptr_to_key(object);
0306 return keyring_get_key_chunk(&key->index_key, level);
0307 }
0308
0309 static bool keyring_compare_object(const void *object, const void *data)
0310 {
0311 const struct keyring_index_key *index_key = data;
0312 const struct key *key = keyring_ptr_to_key(object);
0313
0314 return key->index_key.type == index_key->type &&
0315 key->index_key.domain_tag == index_key->domain_tag &&
0316 key->index_key.desc_len == index_key->desc_len &&
0317 memcmp(key->index_key.description, index_key->description,
0318 index_key->desc_len) == 0;
0319 }
0320
0321
0322
0323
0324
0325 static int keyring_diff_objects(const void *object, const void *data)
0326 {
0327 const struct key *key_a = keyring_ptr_to_key(object);
0328 const struct keyring_index_key *a = &key_a->index_key;
0329 const struct keyring_index_key *b = data;
0330 unsigned long seg_a, seg_b;
0331 int level, i;
0332
0333 level = 0;
0334 seg_a = a->hash;
0335 seg_b = b->hash;
0336 if ((seg_a ^ seg_b) != 0)
0337 goto differ;
0338 level += ASSOC_ARRAY_KEY_CHUNK_SIZE / 8;
0339
0340
0341
0342
0343
0344 seg_a = a->x;
0345 seg_b = b->x;
0346 if ((seg_a ^ seg_b) != 0)
0347 goto differ;
0348 level += sizeof(unsigned long);
0349
0350
0351 seg_a = (unsigned long)a->type;
0352 seg_b = (unsigned long)b->type;
0353 if ((seg_a ^ seg_b) != 0)
0354 goto differ;
0355 level += sizeof(unsigned long);
0356
0357 seg_a = (unsigned long)a->domain_tag;
0358 seg_b = (unsigned long)b->domain_tag;
0359 if ((seg_a ^ seg_b) != 0)
0360 goto differ;
0361 level += sizeof(unsigned long);
0362
0363 i = sizeof(a->desc);
0364 if (a->desc_len <= i)
0365 goto same;
0366
0367 for (; i < a->desc_len; i++) {
0368 seg_a = *(unsigned char *)(a->description + i);
0369 seg_b = *(unsigned char *)(b->description + i);
0370 if ((seg_a ^ seg_b) != 0)
0371 goto differ_plus_i;
0372 }
0373
0374 same:
0375 return -1;
0376
0377 differ_plus_i:
0378 level += i;
0379 differ:
0380 i = level * 8 + __ffs(seg_a ^ seg_b);
0381 return i;
0382 }
0383
0384
0385
0386
0387 static void keyring_free_object(void *object)
0388 {
0389 key_put(keyring_ptr_to_key(object));
0390 }
0391
0392
0393
0394
0395 static const struct assoc_array_ops keyring_assoc_array_ops = {
0396 .get_key_chunk = keyring_get_key_chunk,
0397 .get_object_key_chunk = keyring_get_object_key_chunk,
0398 .compare_object = keyring_compare_object,
0399 .diff_objects = keyring_diff_objects,
0400 .free_object = keyring_free_object,
0401 };
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412 static void keyring_destroy(struct key *keyring)
0413 {
0414 if (keyring->description) {
0415 write_lock(&keyring_name_lock);
0416
0417 if (keyring->name_link.next != NULL &&
0418 !list_empty(&keyring->name_link))
0419 list_del(&keyring->name_link);
0420
0421 write_unlock(&keyring_name_lock);
0422 }
0423
0424 if (keyring->restrict_link) {
0425 struct key_restriction *keyres = keyring->restrict_link;
0426
0427 key_put(keyres->key);
0428 kfree(keyres);
0429 }
0430
0431 assoc_array_destroy(&keyring->keys, &keyring_assoc_array_ops);
0432 }
0433
0434
0435
0436
0437 static void keyring_describe(const struct key *keyring, struct seq_file *m)
0438 {
0439 if (keyring->description)
0440 seq_puts(m, keyring->description);
0441 else
0442 seq_puts(m, "[anon]");
0443
0444 if (key_is_positive(keyring)) {
0445 if (keyring->keys.nr_leaves_on_tree != 0)
0446 seq_printf(m, ": %lu", keyring->keys.nr_leaves_on_tree);
0447 else
0448 seq_puts(m, ": empty");
0449 }
0450 }
0451
0452 struct keyring_read_iterator_context {
0453 size_t buflen;
0454 size_t count;
0455 key_serial_t *buffer;
0456 };
0457
0458 static int keyring_read_iterator(const void *object, void *data)
0459 {
0460 struct keyring_read_iterator_context *ctx = data;
0461 const struct key *key = keyring_ptr_to_key(object);
0462
0463 kenter("{%s,%d},,{%zu/%zu}",
0464 key->type->name, key->serial, ctx->count, ctx->buflen);
0465
0466 if (ctx->count >= ctx->buflen)
0467 return 1;
0468
0469 *ctx->buffer++ = key->serial;
0470 ctx->count += sizeof(key->serial);
0471 return 0;
0472 }
0473
0474
0475
0476
0477
0478
0479
0480
0481 static long keyring_read(const struct key *keyring,
0482 char *buffer, size_t buflen)
0483 {
0484 struct keyring_read_iterator_context ctx;
0485 long ret;
0486
0487 kenter("{%d},,%zu", key_serial(keyring), buflen);
0488
0489 if (buflen & (sizeof(key_serial_t) - 1))
0490 return -EINVAL;
0491
0492
0493 if (buffer && buflen) {
0494 ctx.buffer = (key_serial_t *)buffer;
0495 ctx.buflen = buflen;
0496 ctx.count = 0;
0497 ret = assoc_array_iterate(&keyring->keys,
0498 keyring_read_iterator, &ctx);
0499 if (ret < 0) {
0500 kleave(" = %ld [iterate]", ret);
0501 return ret;
0502 }
0503 }
0504
0505
0506 ret = keyring->keys.nr_leaves_on_tree * sizeof(key_serial_t);
0507 if (ret <= buflen)
0508 kleave("= %ld [ok]", ret);
0509 else
0510 kleave("= %ld [buffer too small]", ret);
0511 return ret;
0512 }
0513
0514
0515
0516
0517 struct key *keyring_alloc(const char *description, kuid_t uid, kgid_t gid,
0518 const struct cred *cred, key_perm_t perm,
0519 unsigned long flags,
0520 struct key_restriction *restrict_link,
0521 struct key *dest)
0522 {
0523 struct key *keyring;
0524 int ret;
0525
0526 keyring = key_alloc(&key_type_keyring, description,
0527 uid, gid, cred, perm, flags, restrict_link);
0528 if (!IS_ERR(keyring)) {
0529 ret = key_instantiate_and_link(keyring, NULL, 0, dest, NULL);
0530 if (ret < 0) {
0531 key_put(keyring);
0532 keyring = ERR_PTR(ret);
0533 }
0534 }
0535
0536 return keyring;
0537 }
0538 EXPORT_SYMBOL(keyring_alloc);
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554 int restrict_link_reject(struct key *keyring,
0555 const struct key_type *type,
0556 const union key_payload *payload,
0557 struct key *restriction_key)
0558 {
0559 return -EPERM;
0560 }
0561
0562
0563
0564
0565 bool key_default_cmp(const struct key *key,
0566 const struct key_match_data *match_data)
0567 {
0568 return strcmp(key->description, match_data->raw_data) == 0;
0569 }
0570
0571
0572
0573
0574 static int keyring_search_iterator(const void *object, void *iterator_data)
0575 {
0576 struct keyring_search_context *ctx = iterator_data;
0577 const struct key *key = keyring_ptr_to_key(object);
0578 unsigned long kflags = READ_ONCE(key->flags);
0579 short state = READ_ONCE(key->state);
0580
0581 kenter("{%d}", key->serial);
0582
0583
0584 if (key->type != ctx->index_key.type) {
0585 kleave(" = 0 [!type]");
0586 return 0;
0587 }
0588
0589
0590 if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK) {
0591 time64_t expiry = READ_ONCE(key->expiry);
0592
0593 if (kflags & ((1 << KEY_FLAG_INVALIDATED) |
0594 (1 << KEY_FLAG_REVOKED))) {
0595 ctx->result = ERR_PTR(-EKEYREVOKED);
0596 kleave(" = %d [invrev]", ctx->skipped_ret);
0597 goto skipped;
0598 }
0599
0600 if (expiry && ctx->now >= expiry) {
0601 if (!(ctx->flags & KEYRING_SEARCH_SKIP_EXPIRED))
0602 ctx->result = ERR_PTR(-EKEYEXPIRED);
0603 kleave(" = %d [expire]", ctx->skipped_ret);
0604 goto skipped;
0605 }
0606 }
0607
0608
0609 if (!ctx->match_data.cmp(key, &ctx->match_data)) {
0610 kleave(" = 0 [!match]");
0611 return 0;
0612 }
0613
0614
0615 if (!(ctx->flags & KEYRING_SEARCH_NO_CHECK_PERM) &&
0616 key_task_permission(make_key_ref(key, ctx->possessed),
0617 ctx->cred, KEY_NEED_SEARCH) < 0) {
0618 ctx->result = ERR_PTR(-EACCES);
0619 kleave(" = %d [!perm]", ctx->skipped_ret);
0620 goto skipped;
0621 }
0622
0623 if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK) {
0624
0625 if (state < 0) {
0626 ctx->result = ERR_PTR(state);
0627 kleave(" = %d [neg]", ctx->skipped_ret);
0628 goto skipped;
0629 }
0630 }
0631
0632
0633 ctx->result = make_key_ref(key, ctx->possessed);
0634 kleave(" = 1 [found]");
0635 return 1;
0636
0637 skipped:
0638 return ctx->skipped_ret;
0639 }
0640
0641
0642
0643
0644
0645
0646 static int search_keyring(struct key *keyring, struct keyring_search_context *ctx)
0647 {
0648 if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_DIRECT) {
0649 const void *object;
0650
0651 object = assoc_array_find(&keyring->keys,
0652 &keyring_assoc_array_ops,
0653 &ctx->index_key);
0654 return object ? ctx->iterator(object, ctx) : 0;
0655 }
0656 return assoc_array_iterate(&keyring->keys, ctx->iterator, ctx);
0657 }
0658
0659
0660
0661
0662
0663 static bool search_nested_keyrings(struct key *keyring,
0664 struct keyring_search_context *ctx)
0665 {
0666 struct {
0667 struct key *keyring;
0668 struct assoc_array_node *node;
0669 int slot;
0670 } stack[KEYRING_SEARCH_MAX_DEPTH];
0671
0672 struct assoc_array_shortcut *shortcut;
0673 struct assoc_array_node *node;
0674 struct assoc_array_ptr *ptr;
0675 struct key *key;
0676 int sp = 0, slot;
0677
0678 kenter("{%d},{%s,%s}",
0679 keyring->serial,
0680 ctx->index_key.type->name,
0681 ctx->index_key.description);
0682
0683 #define STATE_CHECKS (KEYRING_SEARCH_NO_STATE_CHECK | KEYRING_SEARCH_DO_STATE_CHECK)
0684 BUG_ON((ctx->flags & STATE_CHECKS) == 0 ||
0685 (ctx->flags & STATE_CHECKS) == STATE_CHECKS);
0686
0687 if (ctx->index_key.description)
0688 key_set_index_key(&ctx->index_key);
0689
0690
0691
0692
0693 if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE ||
0694 keyring_compare_object(keyring, &ctx->index_key)) {
0695 ctx->skipped_ret = 2;
0696 switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) {
0697 case 1:
0698 goto found;
0699 case 2:
0700 return false;
0701 default:
0702 break;
0703 }
0704 }
0705
0706 ctx->skipped_ret = 0;
0707
0708
0709 descend_to_keyring:
0710 kdebug("descend to %d", keyring->serial);
0711 if (keyring->flags & ((1 << KEY_FLAG_INVALIDATED) |
0712 (1 << KEY_FLAG_REVOKED)))
0713 goto not_this_keyring;
0714
0715
0716
0717
0718 if (search_keyring(keyring, ctx))
0719 goto found;
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729 if (!(ctx->flags & KEYRING_SEARCH_RECURSE))
0730 goto not_this_keyring;
0731
0732 ptr = READ_ONCE(keyring->keys.root);
0733 if (!ptr)
0734 goto not_this_keyring;
0735
0736 if (assoc_array_ptr_is_shortcut(ptr)) {
0737
0738
0739
0740
0741 shortcut = assoc_array_ptr_to_shortcut(ptr);
0742 if ((shortcut->index_key[0] & ASSOC_ARRAY_FAN_MASK) != 0)
0743 goto not_this_keyring;
0744
0745 ptr = READ_ONCE(shortcut->next_node);
0746 node = assoc_array_ptr_to_node(ptr);
0747 goto begin_node;
0748 }
0749
0750 node = assoc_array_ptr_to_node(ptr);
0751 ptr = node->slots[0];
0752 if (!assoc_array_ptr_is_meta(ptr))
0753 goto begin_node;
0754
0755 descend_to_node:
0756
0757
0758
0759 kdebug("descend");
0760 if (assoc_array_ptr_is_shortcut(ptr)) {
0761 shortcut = assoc_array_ptr_to_shortcut(ptr);
0762 ptr = READ_ONCE(shortcut->next_node);
0763 BUG_ON(!assoc_array_ptr_is_node(ptr));
0764 }
0765 node = assoc_array_ptr_to_node(ptr);
0766
0767 begin_node:
0768 kdebug("begin_node");
0769 slot = 0;
0770 ascend_to_node:
0771
0772 for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
0773 ptr = READ_ONCE(node->slots[slot]);
0774
0775 if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
0776 goto descend_to_node;
0777
0778 if (!keyring_ptr_is_keyring(ptr))
0779 continue;
0780
0781 key = keyring_ptr_to_key(ptr);
0782
0783 if (sp >= KEYRING_SEARCH_MAX_DEPTH) {
0784 if (ctx->flags & KEYRING_SEARCH_DETECT_TOO_DEEP) {
0785 ctx->result = ERR_PTR(-ELOOP);
0786 return false;
0787 }
0788 goto not_this_keyring;
0789 }
0790
0791
0792 if (!(ctx->flags & KEYRING_SEARCH_NO_CHECK_PERM) &&
0793 key_task_permission(make_key_ref(key, ctx->possessed),
0794 ctx->cred, KEY_NEED_SEARCH) < 0)
0795 continue;
0796
0797
0798 stack[sp].keyring = keyring;
0799 stack[sp].node = node;
0800 stack[sp].slot = slot;
0801 sp++;
0802
0803
0804 keyring = key;
0805 goto descend_to_keyring;
0806 }
0807
0808
0809
0810
0811 ptr = READ_ONCE(node->back_pointer);
0812 slot = node->parent_slot;
0813
0814 if (ptr && assoc_array_ptr_is_shortcut(ptr)) {
0815 shortcut = assoc_array_ptr_to_shortcut(ptr);
0816 ptr = READ_ONCE(shortcut->back_pointer);
0817 slot = shortcut->parent_slot;
0818 }
0819 if (!ptr)
0820 goto not_this_keyring;
0821 node = assoc_array_ptr_to_node(ptr);
0822 slot++;
0823
0824
0825
0826
0827
0828 if (node->back_pointer) {
0829 kdebug("ascend %d", slot);
0830 goto ascend_to_node;
0831 }
0832
0833
0834
0835
0836 not_this_keyring:
0837 kdebug("not_this_keyring %d", sp);
0838 if (sp <= 0) {
0839 kleave(" = false");
0840 return false;
0841 }
0842
0843
0844 sp--;
0845 keyring = stack[sp].keyring;
0846 node = stack[sp].node;
0847 slot = stack[sp].slot + 1;
0848 kdebug("ascend to %d [%d]", keyring->serial, slot);
0849 goto ascend_to_node;
0850
0851
0852 found:
0853 key = key_ref_to_ptr(ctx->result);
0854 key_check(key);
0855 if (!(ctx->flags & KEYRING_SEARCH_NO_UPDATE_TIME)) {
0856 key->last_used_at = ctx->now;
0857 keyring->last_used_at = ctx->now;
0858 while (sp > 0)
0859 stack[--sp].keyring->last_used_at = ctx->now;
0860 }
0861 kleave(" = true");
0862 return true;
0863 }
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899 key_ref_t keyring_search_rcu(key_ref_t keyring_ref,
0900 struct keyring_search_context *ctx)
0901 {
0902 struct key *keyring;
0903 long err;
0904
0905 ctx->iterator = keyring_search_iterator;
0906 ctx->possessed = is_key_possessed(keyring_ref);
0907 ctx->result = ERR_PTR(-EAGAIN);
0908
0909 keyring = key_ref_to_ptr(keyring_ref);
0910 key_check(keyring);
0911
0912 if (keyring->type != &key_type_keyring)
0913 return ERR_PTR(-ENOTDIR);
0914
0915 if (!(ctx->flags & KEYRING_SEARCH_NO_CHECK_PERM)) {
0916 err = key_task_permission(keyring_ref, ctx->cred, KEY_NEED_SEARCH);
0917 if (err < 0)
0918 return ERR_PTR(err);
0919 }
0920
0921 ctx->now = ktime_get_real_seconds();
0922 if (search_nested_keyrings(keyring, ctx))
0923 __key_get(key_ref_to_ptr(ctx->result));
0924 return ctx->result;
0925 }
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937 key_ref_t keyring_search(key_ref_t keyring,
0938 struct key_type *type,
0939 const char *description,
0940 bool recurse)
0941 {
0942 struct keyring_search_context ctx = {
0943 .index_key.type = type,
0944 .index_key.description = description,
0945 .index_key.desc_len = strlen(description),
0946 .cred = current_cred(),
0947 .match_data.cmp = key_default_cmp,
0948 .match_data.raw_data = description,
0949 .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
0950 .flags = KEYRING_SEARCH_DO_STATE_CHECK,
0951 };
0952 key_ref_t key;
0953 int ret;
0954
0955 if (recurse)
0956 ctx.flags |= KEYRING_SEARCH_RECURSE;
0957 if (type->match_preparse) {
0958 ret = type->match_preparse(&ctx.match_data);
0959 if (ret < 0)
0960 return ERR_PTR(ret);
0961 }
0962
0963 rcu_read_lock();
0964 key = keyring_search_rcu(keyring, &ctx);
0965 rcu_read_unlock();
0966
0967 if (type->match_free)
0968 type->match_free(&ctx.match_data);
0969 return key;
0970 }
0971 EXPORT_SYMBOL(keyring_search);
0972
0973 static struct key_restriction *keyring_restriction_alloc(
0974 key_restrict_link_func_t check)
0975 {
0976 struct key_restriction *keyres =
0977 kzalloc(sizeof(struct key_restriction), GFP_KERNEL);
0978
0979 if (!keyres)
0980 return ERR_PTR(-ENOMEM);
0981
0982 keyres->check = check;
0983
0984 return keyres;
0985 }
0986
0987
0988
0989
0990
0991 static DECLARE_RWSEM(keyring_serialise_restrict_sem);
0992
0993
0994
0995
0996
0997 static bool keyring_detect_restriction_cycle(const struct key *dest_keyring,
0998 struct key_restriction *keyres)
0999 {
1000 while (keyres && keyres->key &&
1001 keyres->key->type == &key_type_keyring) {
1002 if (keyres->key == dest_keyring)
1003 return true;
1004
1005 keyres = keyres->key->restrict_link;
1006 }
1007
1008 return false;
1009 }
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021 int keyring_restrict(key_ref_t keyring_ref, const char *type,
1022 const char *restriction)
1023 {
1024 struct key *keyring;
1025 struct key_type *restrict_type = NULL;
1026 struct key_restriction *restrict_link;
1027 int ret = 0;
1028
1029 keyring = key_ref_to_ptr(keyring_ref);
1030 key_check(keyring);
1031
1032 if (keyring->type != &key_type_keyring)
1033 return -ENOTDIR;
1034
1035 if (!type) {
1036 restrict_link = keyring_restriction_alloc(restrict_link_reject);
1037 } else {
1038 restrict_type = key_type_lookup(type);
1039
1040 if (IS_ERR(restrict_type))
1041 return PTR_ERR(restrict_type);
1042
1043 if (!restrict_type->lookup_restriction) {
1044 ret = -ENOENT;
1045 goto error;
1046 }
1047
1048 restrict_link = restrict_type->lookup_restriction(restriction);
1049 }
1050
1051 if (IS_ERR(restrict_link)) {
1052 ret = PTR_ERR(restrict_link);
1053 goto error;
1054 }
1055
1056 down_write(&keyring->sem);
1057 down_write(&keyring_serialise_restrict_sem);
1058
1059 if (keyring->restrict_link) {
1060 ret = -EEXIST;
1061 } else if (keyring_detect_restriction_cycle(keyring, restrict_link)) {
1062 ret = -EDEADLK;
1063 } else {
1064 keyring->restrict_link = restrict_link;
1065 notify_key(keyring, NOTIFY_KEY_SETATTR, 0);
1066 }
1067
1068 up_write(&keyring_serialise_restrict_sem);
1069 up_write(&keyring->sem);
1070
1071 if (ret < 0) {
1072 key_put(restrict_link->key);
1073 kfree(restrict_link);
1074 }
1075
1076 error:
1077 if (restrict_type)
1078 key_type_put(restrict_type);
1079
1080 return ret;
1081 }
1082 EXPORT_SYMBOL(keyring_restrict);
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098 key_ref_t find_key_to_update(key_ref_t keyring_ref,
1099 const struct keyring_index_key *index_key)
1100 {
1101 struct key *keyring, *key;
1102 const void *object;
1103
1104 keyring = key_ref_to_ptr(keyring_ref);
1105
1106 kenter("{%d},{%s,%s}",
1107 keyring->serial, index_key->type->name, index_key->description);
1108
1109 object = assoc_array_find(&keyring->keys, &keyring_assoc_array_ops,
1110 index_key);
1111
1112 if (object)
1113 goto found;
1114
1115 kleave(" = NULL");
1116 return NULL;
1117
1118 found:
1119 key = keyring_ptr_to_key(object);
1120 if (key->flags & ((1 << KEY_FLAG_INVALIDATED) |
1121 (1 << KEY_FLAG_REVOKED))) {
1122 kleave(" = NULL [x]");
1123 return NULL;
1124 }
1125 __key_get(key);
1126 kleave(" = {%d}", key->serial);
1127 return make_key_ref(key, is_key_possessed(keyring_ref));
1128 }
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141 struct key *find_keyring_by_name(const char *name, bool uid_keyring)
1142 {
1143 struct user_namespace *ns = current_user_ns();
1144 struct key *keyring;
1145
1146 if (!name)
1147 return ERR_PTR(-EINVAL);
1148
1149 read_lock(&keyring_name_lock);
1150
1151
1152
1153
1154 list_for_each_entry(keyring, &ns->keyring_name_list, name_link) {
1155 if (!kuid_has_mapping(ns, keyring->user->uid))
1156 continue;
1157
1158 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
1159 continue;
1160
1161 if (strcmp(keyring->description, name) != 0)
1162 continue;
1163
1164 if (uid_keyring) {
1165 if (!test_bit(KEY_FLAG_UID_KEYRING,
1166 &keyring->flags))
1167 continue;
1168 } else {
1169 if (key_permission(make_key_ref(keyring, 0),
1170 KEY_NEED_SEARCH) < 0)
1171 continue;
1172 }
1173
1174
1175
1176
1177 if (!refcount_inc_not_zero(&keyring->usage))
1178 continue;
1179 keyring->last_used_at = ktime_get_real_seconds();
1180 goto out;
1181 }
1182
1183 keyring = ERR_PTR(-ENOKEY);
1184 out:
1185 read_unlock(&keyring_name_lock);
1186 return keyring;
1187 }
1188
1189 static int keyring_detect_cycle_iterator(const void *object,
1190 void *iterator_data)
1191 {
1192 struct keyring_search_context *ctx = iterator_data;
1193 const struct key *key = keyring_ptr_to_key(object);
1194
1195 kenter("{%d}", key->serial);
1196
1197
1198
1199 if (key != ctx->match_data.raw_data)
1200 return 0;
1201
1202 ctx->result = ERR_PTR(-EDEADLK);
1203 return 1;
1204 }
1205
1206
1207
1208
1209
1210
1211
1212
1213 static int keyring_detect_cycle(struct key *A, struct key *B)
1214 {
1215 struct keyring_search_context ctx = {
1216 .index_key = A->index_key,
1217 .match_data.raw_data = A,
1218 .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
1219 .iterator = keyring_detect_cycle_iterator,
1220 .flags = (KEYRING_SEARCH_NO_STATE_CHECK |
1221 KEYRING_SEARCH_NO_UPDATE_TIME |
1222 KEYRING_SEARCH_NO_CHECK_PERM |
1223 KEYRING_SEARCH_DETECT_TOO_DEEP |
1224 KEYRING_SEARCH_RECURSE),
1225 };
1226
1227 rcu_read_lock();
1228 search_nested_keyrings(B, &ctx);
1229 rcu_read_unlock();
1230 return PTR_ERR(ctx.result) == -EAGAIN ? 0 : PTR_ERR(ctx.result);
1231 }
1232
1233
1234
1235
1236 int __key_link_lock(struct key *keyring,
1237 const struct keyring_index_key *index_key)
1238 __acquires(&keyring->sem)
1239 __acquires(&keyring_serialise_link_lock)
1240 {
1241 if (keyring->type != &key_type_keyring)
1242 return -ENOTDIR;
1243
1244 down_write(&keyring->sem);
1245
1246
1247
1248
1249 if (index_key->type == &key_type_keyring)
1250 mutex_lock(&keyring_serialise_link_lock);
1251
1252 return 0;
1253 }
1254
1255
1256
1257
1258 int __key_move_lock(struct key *l_keyring, struct key *u_keyring,
1259 const struct keyring_index_key *index_key)
1260 __acquires(&l_keyring->sem)
1261 __acquires(&u_keyring->sem)
1262 __acquires(&keyring_serialise_link_lock)
1263 {
1264 if (l_keyring->type != &key_type_keyring ||
1265 u_keyring->type != &key_type_keyring)
1266 return -ENOTDIR;
1267
1268
1269
1270
1271
1272 if (l_keyring < u_keyring) {
1273 down_write(&l_keyring->sem);
1274 down_write_nested(&u_keyring->sem, 1);
1275 } else {
1276 down_write(&u_keyring->sem);
1277 down_write_nested(&l_keyring->sem, 1);
1278 }
1279
1280
1281
1282
1283 if (index_key->type == &key_type_keyring)
1284 mutex_lock(&keyring_serialise_link_lock);
1285
1286 return 0;
1287 }
1288
1289
1290
1291
1292 int __key_link_begin(struct key *keyring,
1293 const struct keyring_index_key *index_key,
1294 struct assoc_array_edit **_edit)
1295 {
1296 struct assoc_array_edit *edit;
1297 int ret;
1298
1299 kenter("%d,%s,%s,",
1300 keyring->serial, index_key->type->name, index_key->description);
1301
1302 BUG_ON(index_key->desc_len == 0);
1303 BUG_ON(*_edit != NULL);
1304
1305 *_edit = NULL;
1306
1307 ret = -EKEYREVOKED;
1308 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
1309 goto error;
1310
1311
1312
1313
1314 edit = assoc_array_insert(&keyring->keys,
1315 &keyring_assoc_array_ops,
1316 index_key,
1317 NULL);
1318 if (IS_ERR(edit)) {
1319 ret = PTR_ERR(edit);
1320 goto error;
1321 }
1322
1323
1324
1325
1326 if (!edit->dead_leaf) {
1327 ret = key_payload_reserve(keyring,
1328 keyring->datalen + KEYQUOTA_LINK_BYTES);
1329 if (ret < 0)
1330 goto error_cancel;
1331 }
1332
1333 *_edit = edit;
1334 kleave(" = 0");
1335 return 0;
1336
1337 error_cancel:
1338 assoc_array_cancel_edit(edit);
1339 error:
1340 kleave(" = %d", ret);
1341 return ret;
1342 }
1343
1344
1345
1346
1347
1348
1349
1350 int __key_link_check_live_key(struct key *keyring, struct key *key)
1351 {
1352 if (key->type == &key_type_keyring)
1353
1354
1355 return keyring_detect_cycle(keyring, key);
1356 return 0;
1357 }
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367 void __key_link(struct key *keyring, struct key *key,
1368 struct assoc_array_edit **_edit)
1369 {
1370 __key_get(key);
1371 assoc_array_insert_set_object(*_edit, keyring_key_to_ptr(key));
1372 assoc_array_apply_edit(*_edit);
1373 *_edit = NULL;
1374 notify_key(keyring, NOTIFY_KEY_LINKED, key_serial(key));
1375 }
1376
1377
1378
1379
1380
1381
1382 void __key_link_end(struct key *keyring,
1383 const struct keyring_index_key *index_key,
1384 struct assoc_array_edit *edit)
1385 __releases(&keyring->sem)
1386 __releases(&keyring_serialise_link_lock)
1387 {
1388 BUG_ON(index_key->type == NULL);
1389 kenter("%d,%s,", keyring->serial, index_key->type->name);
1390
1391 if (edit) {
1392 if (!edit->dead_leaf) {
1393 key_payload_reserve(keyring,
1394 keyring->datalen - KEYQUOTA_LINK_BYTES);
1395 }
1396 assoc_array_cancel_edit(edit);
1397 }
1398 up_write(&keyring->sem);
1399
1400 if (index_key->type == &key_type_keyring)
1401 mutex_unlock(&keyring_serialise_link_lock);
1402 }
1403
1404
1405
1406
1407 static int __key_link_check_restriction(struct key *keyring, struct key *key)
1408 {
1409 if (!keyring->restrict_link || !keyring->restrict_link->check)
1410 return 0;
1411 return keyring->restrict_link->check(keyring, key->type, &key->payload,
1412 keyring->restrict_link->key);
1413 }
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435 int key_link(struct key *keyring, struct key *key)
1436 {
1437 struct assoc_array_edit *edit = NULL;
1438 int ret;
1439
1440 kenter("{%d,%d}", keyring->serial, refcount_read(&keyring->usage));
1441
1442 key_check(keyring);
1443 key_check(key);
1444
1445 ret = __key_link_lock(keyring, &key->index_key);
1446 if (ret < 0)
1447 goto error;
1448
1449 ret = __key_link_begin(keyring, &key->index_key, &edit);
1450 if (ret < 0)
1451 goto error_end;
1452
1453 kdebug("begun {%d,%d}", keyring->serial, refcount_read(&keyring->usage));
1454 ret = __key_link_check_restriction(keyring, key);
1455 if (ret == 0)
1456 ret = __key_link_check_live_key(keyring, key);
1457 if (ret == 0)
1458 __key_link(keyring, key, &edit);
1459
1460 error_end:
1461 __key_link_end(keyring, &key->index_key, edit);
1462 error:
1463 kleave(" = %d {%d,%d}", ret, keyring->serial, refcount_read(&keyring->usage));
1464 return ret;
1465 }
1466 EXPORT_SYMBOL(key_link);
1467
1468
1469
1470
1471 static int __key_unlink_lock(struct key *keyring)
1472 __acquires(&keyring->sem)
1473 {
1474 if (keyring->type != &key_type_keyring)
1475 return -ENOTDIR;
1476
1477 down_write(&keyring->sem);
1478 return 0;
1479 }
1480
1481
1482
1483
1484 static int __key_unlink_begin(struct key *keyring, struct key *key,
1485 struct assoc_array_edit **_edit)
1486 {
1487 struct assoc_array_edit *edit;
1488
1489 BUG_ON(*_edit != NULL);
1490
1491 edit = assoc_array_delete(&keyring->keys, &keyring_assoc_array_ops,
1492 &key->index_key);
1493 if (IS_ERR(edit))
1494 return PTR_ERR(edit);
1495
1496 if (!edit)
1497 return -ENOENT;
1498
1499 *_edit = edit;
1500 return 0;
1501 }
1502
1503
1504
1505
1506 static void __key_unlink(struct key *keyring, struct key *key,
1507 struct assoc_array_edit **_edit)
1508 {
1509 assoc_array_apply_edit(*_edit);
1510 notify_key(keyring, NOTIFY_KEY_UNLINKED, key_serial(key));
1511 *_edit = NULL;
1512 key_payload_reserve(keyring, keyring->datalen - KEYQUOTA_LINK_BYTES);
1513 }
1514
1515
1516
1517
1518 static void __key_unlink_end(struct key *keyring,
1519 struct key *key,
1520 struct assoc_array_edit *edit)
1521 __releases(&keyring->sem)
1522 {
1523 if (edit)
1524 assoc_array_cancel_edit(edit);
1525 up_write(&keyring->sem);
1526 }
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545 int key_unlink(struct key *keyring, struct key *key)
1546 {
1547 struct assoc_array_edit *edit = NULL;
1548 int ret;
1549
1550 key_check(keyring);
1551 key_check(key);
1552
1553 ret = __key_unlink_lock(keyring);
1554 if (ret < 0)
1555 return ret;
1556
1557 ret = __key_unlink_begin(keyring, key, &edit);
1558 if (ret == 0)
1559 __key_unlink(keyring, key, &edit);
1560 __key_unlink_end(keyring, key, edit);
1561 return ret;
1562 }
1563 EXPORT_SYMBOL(key_unlink);
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590 int key_move(struct key *key,
1591 struct key *from_keyring,
1592 struct key *to_keyring,
1593 unsigned int flags)
1594 {
1595 struct assoc_array_edit *from_edit = NULL, *to_edit = NULL;
1596 int ret;
1597
1598 kenter("%d,%d,%d", key->serial, from_keyring->serial, to_keyring->serial);
1599
1600 if (from_keyring == to_keyring)
1601 return 0;
1602
1603 key_check(key);
1604 key_check(from_keyring);
1605 key_check(to_keyring);
1606
1607 ret = __key_move_lock(from_keyring, to_keyring, &key->index_key);
1608 if (ret < 0)
1609 goto out;
1610 ret = __key_unlink_begin(from_keyring, key, &from_edit);
1611 if (ret < 0)
1612 goto error;
1613 ret = __key_link_begin(to_keyring, &key->index_key, &to_edit);
1614 if (ret < 0)
1615 goto error;
1616
1617 ret = -EEXIST;
1618 if (to_edit->dead_leaf && (flags & KEYCTL_MOVE_EXCL))
1619 goto error;
1620
1621 ret = __key_link_check_restriction(to_keyring, key);
1622 if (ret < 0)
1623 goto error;
1624 ret = __key_link_check_live_key(to_keyring, key);
1625 if (ret < 0)
1626 goto error;
1627
1628 __key_unlink(from_keyring, key, &from_edit);
1629 __key_link(to_keyring, key, &to_edit);
1630 error:
1631 __key_link_end(to_keyring, &key->index_key, to_edit);
1632 __key_unlink_end(from_keyring, key, from_edit);
1633 out:
1634 kleave(" = %d", ret);
1635 return ret;
1636 }
1637 EXPORT_SYMBOL(key_move);
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647 int keyring_clear(struct key *keyring)
1648 {
1649 struct assoc_array_edit *edit;
1650 int ret;
1651
1652 if (keyring->type != &key_type_keyring)
1653 return -ENOTDIR;
1654
1655 down_write(&keyring->sem);
1656
1657 edit = assoc_array_clear(&keyring->keys, &keyring_assoc_array_ops);
1658 if (IS_ERR(edit)) {
1659 ret = PTR_ERR(edit);
1660 } else {
1661 if (edit)
1662 assoc_array_apply_edit(edit);
1663 notify_key(keyring, NOTIFY_KEY_CLEARED, 0);
1664 key_payload_reserve(keyring, 0);
1665 ret = 0;
1666 }
1667
1668 up_write(&keyring->sem);
1669 return ret;
1670 }
1671 EXPORT_SYMBOL(keyring_clear);
1672
1673
1674
1675
1676
1677
1678 static void keyring_revoke(struct key *keyring)
1679 {
1680 struct assoc_array_edit *edit;
1681
1682 edit = assoc_array_clear(&keyring->keys, &keyring_assoc_array_ops);
1683 if (!IS_ERR(edit)) {
1684 if (edit)
1685 assoc_array_apply_edit(edit);
1686 key_payload_reserve(keyring, 0);
1687 }
1688 }
1689
1690 static bool keyring_gc_select_iterator(void *object, void *iterator_data)
1691 {
1692 struct key *key = keyring_ptr_to_key(object);
1693 time64_t *limit = iterator_data;
1694
1695 if (key_is_dead(key, *limit))
1696 return false;
1697 key_get(key);
1698 return true;
1699 }
1700
1701 static int keyring_gc_check_iterator(const void *object, void *iterator_data)
1702 {
1703 const struct key *key = keyring_ptr_to_key(object);
1704 time64_t *limit = iterator_data;
1705
1706 key_check(key);
1707 return key_is_dead(key, *limit);
1708 }
1709
1710
1711
1712
1713
1714
1715
1716 void keyring_gc(struct key *keyring, time64_t limit)
1717 {
1718 int result;
1719
1720 kenter("%x{%s}", keyring->serial, keyring->description ?: "");
1721
1722 if (keyring->flags & ((1 << KEY_FLAG_INVALIDATED) |
1723 (1 << KEY_FLAG_REVOKED)))
1724 goto dont_gc;
1725
1726
1727 rcu_read_lock();
1728 result = assoc_array_iterate(&keyring->keys,
1729 keyring_gc_check_iterator, &limit);
1730 rcu_read_unlock();
1731 if (result == true)
1732 goto do_gc;
1733
1734 dont_gc:
1735 kleave(" [no gc]");
1736 return;
1737
1738 do_gc:
1739 down_write(&keyring->sem);
1740 assoc_array_gc(&keyring->keys, &keyring_assoc_array_ops,
1741 keyring_gc_select_iterator, &limit);
1742 up_write(&keyring->sem);
1743 kleave(" [gc]");
1744 }
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761 void keyring_restriction_gc(struct key *keyring, struct key_type *dead_type)
1762 {
1763 struct key_restriction *keyres;
1764
1765 kenter("%x{%s}", keyring->serial, keyring->description ?: "");
1766
1767
1768
1769
1770
1771
1772
1773
1774 if (!dead_type || !keyring->restrict_link ||
1775 keyring->restrict_link->keytype != dead_type) {
1776 kleave(" [no restriction gc]");
1777 return;
1778 }
1779
1780
1781 down_write(&keyring->sem);
1782
1783 keyres = keyring->restrict_link;
1784
1785 keyres->check = restrict_link_reject;
1786
1787 key_put(keyres->key);
1788 keyres->key = NULL;
1789 keyres->keytype = NULL;
1790
1791 up_write(&keyring->sem);
1792
1793 kleave(" [restriction gc]");
1794 }