1
2
3
4
5
6
7
8
9
10
11
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/sched.h>
15#include <linux/slab.h>
16#include <linux/security.h>
17#include <linux/seq_file.h>
18#include <linux/err.h>
19#include <keys/keyring-type.h>
20#include <linux/uaccess.h>
21#include "internal.h"
22
23#define rcu_dereference_locked_keyring(keyring) \
24 (rcu_dereference_protected( \
25 (keyring)->payload.subscriptions, \
26 rwsem_is_locked((struct rw_semaphore *)&(keyring)->sem)))
27
28#define rcu_deref_link_locked(klist, index, keyring) \
29 (rcu_dereference_protected( \
30 (klist)->keys[index], \
31 rwsem_is_locked((struct rw_semaphore *)&(keyring)->sem)))
32
33#define MAX_KEYRING_LINKS \
34 min_t(size_t, USHRT_MAX - 1, \
35 ((PAGE_SIZE - sizeof(struct keyring_list)) / sizeof(struct key *)))
36
37#define KEY_LINK_FIXQUOTA 1UL
38
39
40
41
42
43#define KEYRING_SEARCH_MAX_DEPTH 6
44
45
46
47
48#define KEYRING_NAME_HASH_SIZE (1 << 5)
49
50static struct list_head keyring_name_hash[KEYRING_NAME_HASH_SIZE];
51static DEFINE_RWLOCK(keyring_name_lock);
52
53static inline unsigned keyring_hash(const char *desc)
54{
55 unsigned bucket = 0;
56
57 for (; *desc; desc++)
58 bucket += (unsigned char)*desc;
59
60 return bucket & (KEYRING_NAME_HASH_SIZE - 1);
61}
62
63
64
65
66
67
68static int keyring_instantiate(struct key *keyring,
69 const void *data, size_t datalen);
70static int keyring_match(const struct key *keyring, const void *criterion);
71static void keyring_revoke(struct key *keyring);
72static void keyring_destroy(struct key *keyring);
73static void keyring_describe(const struct key *keyring, struct seq_file *m);
74static long keyring_read(const struct key *keyring,
75 char __user *buffer, size_t buflen);
76
77struct key_type key_type_keyring = {
78 .name = "keyring",
79 .def_datalen = sizeof(struct keyring_list),
80 .instantiate = keyring_instantiate,
81 .match = keyring_match,
82 .revoke = keyring_revoke,
83 .destroy = keyring_destroy,
84 .describe = keyring_describe,
85 .read = keyring_read,
86};
87EXPORT_SYMBOL(key_type_keyring);
88
89
90
91
92
93static DECLARE_RWSEM(keyring_serialise_link_sem);
94
95
96
97
98
99static void keyring_publish_name(struct key *keyring)
100{
101 int bucket;
102
103 if (keyring->description) {
104 bucket = keyring_hash(keyring->description);
105
106 write_lock(&keyring_name_lock);
107
108 if (!keyring_name_hash[bucket].next)
109 INIT_LIST_HEAD(&keyring_name_hash[bucket]);
110
111 list_add_tail(&keyring->type_data.link,
112 &keyring_name_hash[bucket]);
113
114 write_unlock(&keyring_name_lock);
115 }
116}
117
118
119
120
121
122
123static int keyring_instantiate(struct key *keyring,
124 const void *data, size_t datalen)
125{
126 int ret;
127
128 ret = -EINVAL;
129 if (datalen == 0) {
130
131 keyring_publish_name(keyring);
132 ret = 0;
133 }
134
135 return ret;
136}
137
138
139
140
141static int keyring_match(const struct key *keyring, const void *description)
142{
143 return keyring->description &&
144 strcmp(keyring->description, description) == 0;
145}
146
147
148
149
150
151
152
153
154
155
156static void keyring_destroy(struct key *keyring)
157{
158 struct keyring_list *klist;
159 int loop;
160
161 if (keyring->description) {
162 write_lock(&keyring_name_lock);
163
164 if (keyring->type_data.link.next != NULL &&
165 !list_empty(&keyring->type_data.link))
166 list_del(&keyring->type_data.link);
167
168 write_unlock(&keyring_name_lock);
169 }
170
171 klist = rcu_access_pointer(keyring->payload.subscriptions);
172 if (klist) {
173 for (loop = klist->nkeys - 1; loop >= 0; loop--)
174 key_put(rcu_access_pointer(klist->keys[loop]));
175 kfree(klist);
176 }
177}
178
179
180
181
182static void keyring_describe(const struct key *keyring, struct seq_file *m)
183{
184 struct keyring_list *klist;
185
186 if (keyring->description)
187 seq_puts(m, keyring->description);
188 else
189 seq_puts(m, "[anon]");
190
191 if (key_is_instantiated(keyring)) {
192 rcu_read_lock();
193 klist = rcu_dereference(keyring->payload.subscriptions);
194 if (klist)
195 seq_printf(m, ": %u/%u", klist->nkeys, klist->maxkeys);
196 else
197 seq_puts(m, ": empty");
198 rcu_read_unlock();
199 }
200}
201
202
203
204
205
206
207static long keyring_read(const struct key *keyring,
208 char __user *buffer, size_t buflen)
209{
210 struct keyring_list *klist;
211 struct key *key;
212 size_t qty, tmp;
213 int loop, ret;
214
215 ret = 0;
216 klist = rcu_dereference_locked_keyring(keyring);
217 if (klist) {
218
219 qty = klist->nkeys * sizeof(key_serial_t);
220
221 if (buffer && buflen > 0) {
222 if (buflen > qty)
223 buflen = qty;
224
225
226
227 ret = -EFAULT;
228
229 for (loop = 0; loop < klist->nkeys; loop++) {
230 key = rcu_deref_link_locked(klist, loop,
231 keyring);
232
233 tmp = sizeof(key_serial_t);
234 if (tmp > buflen)
235 tmp = buflen;
236
237 if (copy_to_user(buffer,
238 &key->serial,
239 tmp) != 0)
240 goto error;
241
242 buflen -= tmp;
243 if (buflen == 0)
244 break;
245 buffer += tmp;
246 }
247 }
248
249 ret = qty;
250 }
251
252error:
253 return ret;
254}
255
256
257
258
259struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid,
260 const struct cred *cred, unsigned long flags,
261 struct key *dest)
262{
263 struct key *keyring;
264 int ret;
265
266 keyring = key_alloc(&key_type_keyring, description,
267 uid, gid, cred,
268 (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_ALL,
269 flags);
270
271 if (!IS_ERR(keyring)) {
272 ret = key_instantiate_and_link(keyring, NULL, 0, dest, NULL);
273 if (ret < 0) {
274 key_put(keyring);
275 keyring = ERR_PTR(ret);
276 }
277 }
278
279 return keyring;
280}
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318key_ref_t keyring_search_aux(key_ref_t keyring_ref,
319 const struct cred *cred,
320 struct key_type *type,
321 const void *description,
322 key_match_func_t match,
323 bool no_state_check)
324{
325 struct {
326
327 struct key *keyring;
328 struct keyring_list *keylist;
329 int kix;
330 } stack[KEYRING_SEARCH_MAX_DEPTH];
331
332 struct keyring_list *keylist;
333 struct timespec now;
334 unsigned long possessed, kflags;
335 struct key *keyring, *key;
336 key_ref_t key_ref;
337 long err;
338 int sp, nkeys, kix;
339
340 keyring = key_ref_to_ptr(keyring_ref);
341 possessed = is_key_possessed(keyring_ref);
342 key_check(keyring);
343
344
345 err = key_task_permission(keyring_ref, cred, KEY_SEARCH);
346 if (err < 0) {
347 key_ref = ERR_PTR(err);
348 goto error;
349 }
350
351 key_ref = ERR_PTR(-ENOTDIR);
352 if (keyring->type != &key_type_keyring)
353 goto error;
354
355 rcu_read_lock();
356
357 now = current_kernel_time();
358 err = -EAGAIN;
359 sp = 0;
360
361
362
363 key_ref = ERR_PTR(-EAGAIN);
364 kflags = keyring->flags;
365 if (keyring->type == type && match(keyring, description)) {
366 key = keyring;
367 if (no_state_check)
368 goto found;
369
370
371
372 if (kflags & (1 << KEY_FLAG_REVOKED))
373 goto error_2;
374 if (key->expiry && now.tv_sec >= key->expiry)
375 goto error_2;
376 key_ref = ERR_PTR(key->type_data.reject_error);
377 if (kflags & (1 << KEY_FLAG_NEGATIVE))
378 goto error_2;
379 goto found;
380 }
381
382
383
384 key_ref = ERR_PTR(-EAGAIN);
385 if (kflags & ((1 << KEY_FLAG_INVALIDATED) |
386 (1 << KEY_FLAG_REVOKED) |
387 (1 << KEY_FLAG_NEGATIVE)) ||
388 (keyring->expiry && now.tv_sec >= keyring->expiry))
389 goto error_2;
390
391
392descend:
393 kflags = keyring->flags;
394 if (kflags & ((1 << KEY_FLAG_INVALIDATED) |
395 (1 << KEY_FLAG_REVOKED)))
396 goto not_this_keyring;
397
398 keylist = rcu_dereference(keyring->payload.subscriptions);
399 if (!keylist)
400 goto not_this_keyring;
401
402
403 nkeys = keylist->nkeys;
404 smp_rmb();
405 for (kix = 0; kix < nkeys; kix++) {
406 key = rcu_dereference(keylist->keys[kix]);
407 kflags = key->flags;
408
409
410 if (key->type != type)
411 continue;
412
413
414 if (!no_state_check) {
415 if (kflags & ((1 << KEY_FLAG_INVALIDATED) |
416 (1 << KEY_FLAG_REVOKED)))
417 continue;
418
419 if (key->expiry && now.tv_sec >= key->expiry)
420 continue;
421 }
422
423
424 if (!match(key, description))
425 continue;
426
427
428 if (key_task_permission(make_key_ref(key, possessed),
429 cred, KEY_SEARCH) < 0)
430 continue;
431
432 if (no_state_check)
433 goto found;
434
435
436 if (kflags & (1 << KEY_FLAG_NEGATIVE)) {
437 err = key->type_data.reject_error;
438 continue;
439 }
440
441 goto found;
442 }
443
444
445 kix = 0;
446ascend:
447 nkeys = keylist->nkeys;
448 smp_rmb();
449 for (; kix < nkeys; kix++) {
450 key = rcu_dereference(keylist->keys[kix]);
451 if (key->type != &key_type_keyring)
452 continue;
453
454
455
456
457 if (sp >= KEYRING_SEARCH_MAX_DEPTH)
458 continue;
459
460 if (key_task_permission(make_key_ref(key, possessed),
461 cred, KEY_SEARCH) < 0)
462 continue;
463
464
465 stack[sp].keyring = keyring;
466 stack[sp].keylist = keylist;
467 stack[sp].kix = kix;
468 sp++;
469
470
471 keyring = key;
472 goto descend;
473 }
474
475
476
477not_this_keyring:
478 if (sp > 0) {
479
480 sp--;
481 keyring = stack[sp].keyring;
482 keylist = stack[sp].keylist;
483 kix = stack[sp].kix + 1;
484 goto ascend;
485 }
486
487 key_ref = ERR_PTR(err);
488 goto error_2;
489
490
491found:
492 atomic_inc(&key->usage);
493 key->last_used_at = now.tv_sec;
494 keyring->last_used_at = now.tv_sec;
495 while (sp > 0)
496 stack[--sp].keyring->last_used_at = now.tv_sec;
497 key_check(key);
498 key_ref = make_key_ref(key, possessed);
499error_2:
500 rcu_read_unlock();
501error:
502 return key_ref;
503}
504
505
506
507
508
509
510
511
512
513
514key_ref_t keyring_search(key_ref_t keyring,
515 struct key_type *type,
516 const char *description)
517{
518 if (!type->match)
519 return ERR_PTR(-ENOKEY);
520
521 return keyring_search_aux(keyring, current->cred,
522 type, description, type->match, false);
523}
524EXPORT_SYMBOL(keyring_search);
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541key_ref_t __keyring_search_one(key_ref_t keyring_ref,
542 const struct key_type *ktype,
543 const char *description,
544 key_perm_t perm)
545{
546 struct keyring_list *klist;
547 unsigned long possessed;
548 struct key *keyring, *key;
549 int nkeys, loop;
550
551 keyring = key_ref_to_ptr(keyring_ref);
552 possessed = is_key_possessed(keyring_ref);
553
554 rcu_read_lock();
555
556 klist = rcu_dereference(keyring->payload.subscriptions);
557 if (klist) {
558 nkeys = klist->nkeys;
559 smp_rmb();
560 for (loop = 0; loop < nkeys ; loop++) {
561 key = rcu_dereference(klist->keys[loop]);
562 if (key->type == ktype &&
563 (!key->type->match ||
564 key->type->match(key, description)) &&
565 key_permission(make_key_ref(key, possessed),
566 perm) == 0 &&
567 !(key->flags & ((1 << KEY_FLAG_INVALIDATED) |
568 (1 << KEY_FLAG_REVOKED)))
569 )
570 goto found;
571 }
572 }
573
574 rcu_read_unlock();
575 return ERR_PTR(-ENOKEY);
576
577found:
578 atomic_inc(&key->usage);
579 keyring->last_used_at = key->last_used_at =
580 current_kernel_time().tv_sec;
581 rcu_read_unlock();
582 return make_key_ref(key, possessed);
583}
584
585
586
587
588
589
590
591
592
593
594
595
596struct key *find_keyring_by_name(const char *name, bool skip_perm_check)
597{
598 struct key *keyring;
599 int bucket;
600
601 if (!name)
602 return ERR_PTR(-EINVAL);
603
604 bucket = keyring_hash(name);
605
606 read_lock(&keyring_name_lock);
607
608 if (keyring_name_hash[bucket].next) {
609
610
611 list_for_each_entry(keyring,
612 &keyring_name_hash[bucket],
613 type_data.link
614 ) {
615 if (keyring->user->user_ns != current_user_ns())
616 continue;
617
618 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
619 continue;
620
621 if (strcmp(keyring->description, name) != 0)
622 continue;
623
624 if (!skip_perm_check &&
625 key_permission(make_key_ref(keyring, 0),
626 KEY_SEARCH) < 0)
627 continue;
628
629
630
631
632 if (!atomic_inc_not_zero(&keyring->usage))
633 continue;
634 keyring->last_used_at = current_kernel_time().tv_sec;
635 goto out;
636 }
637 }
638
639 keyring = ERR_PTR(-ENOKEY);
640out:
641 read_unlock(&keyring_name_lock);
642 return keyring;
643}
644
645
646
647
648
649
650
651
652static int keyring_detect_cycle(struct key *A, struct key *B)
653{
654 struct {
655 struct keyring_list *keylist;
656 int kix;
657 } stack[KEYRING_SEARCH_MAX_DEPTH];
658
659 struct keyring_list *keylist;
660 struct key *subtree, *key;
661 int sp, nkeys, kix, ret;
662
663 rcu_read_lock();
664
665 ret = -EDEADLK;
666 if (A == B)
667 goto cycle_detected;
668
669 subtree = B;
670 sp = 0;
671
672
673descend:
674 if (test_bit(KEY_FLAG_REVOKED, &subtree->flags))
675 goto not_this_keyring;
676
677 keylist = rcu_dereference(subtree->payload.subscriptions);
678 if (!keylist)
679 goto not_this_keyring;
680 kix = 0;
681
682ascend:
683
684 nkeys = keylist->nkeys;
685 smp_rmb();
686 for (; kix < nkeys; kix++) {
687 key = rcu_dereference(keylist->keys[kix]);
688
689 if (key == A)
690 goto cycle_detected;
691
692
693 if (key->type == &key_type_keyring) {
694 if (sp >= KEYRING_SEARCH_MAX_DEPTH)
695 goto too_deep;
696
697
698 stack[sp].keylist = keylist;
699 stack[sp].kix = kix;
700 sp++;
701
702
703 subtree = key;
704 goto descend;
705 }
706 }
707
708
709
710not_this_keyring:
711 if (sp > 0) {
712
713 sp--;
714 keylist = stack[sp].keylist;
715 kix = stack[sp].kix + 1;
716 goto ascend;
717 }
718
719 ret = 0;
720
721error:
722 rcu_read_unlock();
723 return ret;
724
725too_deep:
726 ret = -ELOOP;
727 goto error;
728
729cycle_detected:
730 ret = -EDEADLK;
731 goto error;
732}
733
734
735
736
737
738static void keyring_unlink_rcu_disposal(struct rcu_head *rcu)
739{
740 struct keyring_list *klist =
741 container_of(rcu, struct keyring_list, rcu);
742
743 if (klist->delkey != USHRT_MAX)
744 key_put(rcu_access_pointer(klist->keys[klist->delkey]));
745 kfree(klist);
746}
747
748
749
750
751int __key_link_begin(struct key *keyring, const struct key_type *type,
752 const char *description, unsigned long *_prealloc)
753 __acquires(&keyring->sem)
754 __acquires(&keyring_serialise_link_sem)
755{
756 struct keyring_list *klist, *nklist;
757 unsigned long prealloc;
758 unsigned max;
759 time_t lowest_lru;
760 size_t size;
761 int loop, lru, ret;
762
763 kenter("%d,%s,%s,", key_serial(keyring), type->name, description);
764
765 if (keyring->type != &key_type_keyring)
766 return -ENOTDIR;
767
768 down_write(&keyring->sem);
769
770 ret = -EKEYREVOKED;
771 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
772 goto error_krsem;
773
774
775
776 if (type == &key_type_keyring)
777 down_write(&keyring_serialise_link_sem);
778
779 klist = rcu_dereference_locked_keyring(keyring);
780
781
782 lru = -1;
783 if (klist && klist->nkeys > 0) {
784 lowest_lru = TIME_T_MAX;
785 for (loop = klist->nkeys - 1; loop >= 0; loop--) {
786 struct key *key = rcu_deref_link_locked(klist, loop,
787 keyring);
788 if (key->type == type &&
789 strcmp(key->description, description) == 0) {
790
791
792
793
794 klist->delkey = loop;
795 prealloc = 0;
796 goto done;
797 }
798 if (key->last_used_at < lowest_lru) {
799 lowest_lru = key->last_used_at;
800 lru = loop;
801 }
802 }
803 }
804
805
806 if (klist &&
807 klist->nkeys == klist->maxkeys &&
808 klist->maxkeys >= MAX_KEYRING_LINKS) {
809 kdebug("LRU discard %d\n", lru);
810 klist->delkey = lru;
811 prealloc = 0;
812 goto done;
813 }
814
815
816 ret = key_payload_reserve(keyring,
817 keyring->datalen + KEYQUOTA_LINK_BYTES);
818 if (ret < 0)
819 goto error_sem;
820
821 if (klist && klist->nkeys < klist->maxkeys) {
822
823 klist->delkey = klist->nkeys;
824 prealloc = KEY_LINK_FIXQUOTA;
825 } else {
826
827 max = 4;
828 if (klist) {
829 max += klist->maxkeys;
830 if (max > MAX_KEYRING_LINKS)
831 max = MAX_KEYRING_LINKS;
832 BUG_ON(max <= klist->maxkeys);
833 }
834
835 size = sizeof(*klist) + sizeof(struct key *) * max;
836
837 ret = -ENOMEM;
838 nklist = kmalloc(size, GFP_KERNEL);
839 if (!nklist)
840 goto error_quota;
841
842 nklist->maxkeys = max;
843 if (klist) {
844 memcpy(nklist->keys, klist->keys,
845 sizeof(struct key *) * klist->nkeys);
846 nklist->delkey = klist->nkeys;
847 nklist->nkeys = klist->nkeys + 1;
848 klist->delkey = USHRT_MAX;
849 } else {
850 nklist->nkeys = 1;
851 nklist->delkey = 0;
852 }
853
854
855 RCU_INIT_POINTER(nklist->keys[nklist->delkey], NULL);
856 prealloc = (unsigned long)nklist | KEY_LINK_FIXQUOTA;
857 }
858
859done:
860 *_prealloc = prealloc;
861 kleave(" = 0");
862 return 0;
863
864error_quota:
865
866 key_payload_reserve(keyring,
867 keyring->datalen - KEYQUOTA_LINK_BYTES);
868error_sem:
869 if (type == &key_type_keyring)
870 up_write(&keyring_serialise_link_sem);
871error_krsem:
872 up_write(&keyring->sem);
873 kleave(" = %d", ret);
874 return ret;
875}
876
877
878
879
880
881
882
883int __key_link_check_live_key(struct key *keyring, struct key *key)
884{
885 if (key->type == &key_type_keyring)
886
887
888 return keyring_detect_cycle(keyring, key);
889 return 0;
890}
891
892
893
894
895
896
897
898
899
900void __key_link(struct key *keyring, struct key *key,
901 unsigned long *_prealloc)
902{
903 struct keyring_list *klist, *nklist;
904 struct key *discard;
905
906 nklist = (struct keyring_list *)(*_prealloc & ~KEY_LINK_FIXQUOTA);
907 *_prealloc = 0;
908
909 kenter("%d,%d,%p", keyring->serial, key->serial, nklist);
910
911 klist = rcu_dereference_locked_keyring(keyring);
912
913 atomic_inc(&key->usage);
914 keyring->last_used_at = key->last_used_at =
915 current_kernel_time().tv_sec;
916
917
918
919 if (nklist) {
920 kdebug("reissue %hu/%hu/%hu",
921 nklist->delkey, nklist->nkeys, nklist->maxkeys);
922
923 RCU_INIT_POINTER(nklist->keys[nklist->delkey], key);
924
925 rcu_assign_pointer(keyring->payload.subscriptions, nklist);
926
927
928
929 if (klist) {
930 kdebug("dispose %hu/%hu/%hu",
931 klist->delkey, klist->nkeys, klist->maxkeys);
932 call_rcu(&klist->rcu, keyring_unlink_rcu_disposal);
933 }
934 } else if (klist->delkey < klist->nkeys) {
935 kdebug("replace %hu/%hu/%hu",
936 klist->delkey, klist->nkeys, klist->maxkeys);
937
938 discard = rcu_dereference_protected(
939 klist->keys[klist->delkey],
940 rwsem_is_locked(&keyring->sem));
941 rcu_assign_pointer(klist->keys[klist->delkey], key);
942
943
944 key_put(discard);
945 } else {
946
947 kdebug("append %hu/%hu/%hu",
948 klist->delkey, klist->nkeys, klist->maxkeys);
949
950 RCU_INIT_POINTER(klist->keys[klist->delkey], key);
951 smp_wmb();
952 klist->nkeys++;
953 }
954}
955
956
957
958
959
960
961void __key_link_end(struct key *keyring, struct key_type *type,
962 unsigned long prealloc)
963 __releases(&keyring->sem)
964 __releases(&keyring_serialise_link_sem)
965{
966 BUG_ON(type == NULL);
967 BUG_ON(type->name == NULL);
968 kenter("%d,%s,%lx", keyring->serial, type->name, prealloc);
969
970 if (type == &key_type_keyring)
971 up_write(&keyring_serialise_link_sem);
972
973 if (prealloc) {
974 if (prealloc & KEY_LINK_FIXQUOTA)
975 key_payload_reserve(keyring,
976 keyring->datalen -
977 KEYQUOTA_LINK_BYTES);
978 kfree((struct keyring_list *)(prealloc & ~KEY_LINK_FIXQUOTA));
979 }
980 up_write(&keyring->sem);
981}
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003int key_link(struct key *keyring, struct key *key)
1004{
1005 unsigned long prealloc;
1006 int ret;
1007
1008 key_check(keyring);
1009 key_check(key);
1010
1011 ret = __key_link_begin(keyring, key->type, key->description, &prealloc);
1012 if (ret == 0) {
1013 ret = __key_link_check_live_key(keyring, key);
1014 if (ret == 0)
1015 __key_link(keyring, key, &prealloc);
1016 __key_link_end(keyring, key->type, prealloc);
1017 }
1018
1019 return ret;
1020}
1021EXPORT_SYMBOL(key_link);
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040int key_unlink(struct key *keyring, struct key *key)
1041{
1042 struct keyring_list *klist, *nklist;
1043 int loop, ret;
1044
1045 key_check(keyring);
1046 key_check(key);
1047
1048 ret = -ENOTDIR;
1049 if (keyring->type != &key_type_keyring)
1050 goto error;
1051
1052 down_write(&keyring->sem);
1053
1054 klist = rcu_dereference_locked_keyring(keyring);
1055 if (klist) {
1056
1057 for (loop = 0; loop < klist->nkeys; loop++)
1058 if (rcu_access_pointer(klist->keys[loop]) == key)
1059 goto key_is_present;
1060 }
1061
1062 up_write(&keyring->sem);
1063 ret = -ENOENT;
1064 goto error;
1065
1066key_is_present:
1067
1068 nklist = kmalloc(sizeof(*klist) +
1069 sizeof(struct key *) * klist->maxkeys,
1070 GFP_KERNEL);
1071 if (!nklist)
1072 goto nomem;
1073 nklist->maxkeys = klist->maxkeys;
1074 nklist->nkeys = klist->nkeys - 1;
1075
1076 if (loop > 0)
1077 memcpy(&nklist->keys[0],
1078 &klist->keys[0],
1079 loop * sizeof(struct key *));
1080
1081 if (loop < nklist->nkeys)
1082 memcpy(&nklist->keys[loop],
1083 &klist->keys[loop + 1],
1084 (nklist->nkeys - loop) * sizeof(struct key *));
1085
1086
1087 key_payload_reserve(keyring,
1088 keyring->datalen - KEYQUOTA_LINK_BYTES);
1089
1090 rcu_assign_pointer(keyring->payload.subscriptions, nklist);
1091
1092 up_write(&keyring->sem);
1093
1094
1095 klist->delkey = loop;
1096 call_rcu(&klist->rcu, keyring_unlink_rcu_disposal);
1097
1098 ret = 0;
1099
1100error:
1101 return ret;
1102nomem:
1103 ret = -ENOMEM;
1104 up_write(&keyring->sem);
1105 goto error;
1106}
1107EXPORT_SYMBOL(key_unlink);
1108
1109
1110
1111
1112
1113static void keyring_clear_rcu_disposal(struct rcu_head *rcu)
1114{
1115 struct keyring_list *klist;
1116 int loop;
1117
1118 klist = container_of(rcu, struct keyring_list, rcu);
1119
1120 for (loop = klist->nkeys - 1; loop >= 0; loop--)
1121 key_put(rcu_access_pointer(klist->keys[loop]));
1122
1123 kfree(klist);
1124}
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134int keyring_clear(struct key *keyring)
1135{
1136 struct keyring_list *klist;
1137 int ret;
1138
1139 ret = -ENOTDIR;
1140 if (keyring->type == &key_type_keyring) {
1141
1142 down_write(&keyring->sem);
1143
1144 klist = rcu_dereference_locked_keyring(keyring);
1145 if (klist) {
1146
1147 key_payload_reserve(keyring,
1148 sizeof(struct keyring_list));
1149
1150 rcu_assign_pointer(keyring->payload.subscriptions,
1151 NULL);
1152 }
1153
1154 up_write(&keyring->sem);
1155
1156
1157 if (klist)
1158 call_rcu(&klist->rcu, keyring_clear_rcu_disposal);
1159
1160 ret = 0;
1161 }
1162
1163 return ret;
1164}
1165EXPORT_SYMBOL(keyring_clear);
1166
1167
1168
1169
1170
1171
1172static void keyring_revoke(struct key *keyring)
1173{
1174 struct keyring_list *klist;
1175
1176 klist = rcu_dereference_locked_keyring(keyring);
1177
1178
1179 key_payload_reserve(keyring, 0);
1180
1181 if (klist) {
1182 rcu_assign_pointer(keyring->payload.subscriptions, NULL);
1183 call_rcu(&klist->rcu, keyring_clear_rcu_disposal);
1184 }
1185}
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195void keyring_gc(struct key *keyring, time_t limit)
1196{
1197 struct keyring_list *klist, *new;
1198 struct key *key;
1199 int loop, keep, max;
1200
1201 kenter("{%x,%s}", key_serial(keyring), keyring->description);
1202
1203 down_write(&keyring->sem);
1204
1205 klist = rcu_dereference_locked_keyring(keyring);
1206 if (!klist)
1207 goto no_klist;
1208
1209
1210 keep = 0;
1211 for (loop = klist->nkeys - 1; loop >= 0; loop--)
1212 if (!key_is_dead(rcu_deref_link_locked(klist, loop, keyring),
1213 limit))
1214 keep++;
1215
1216 if (keep == klist->nkeys)
1217 goto just_return;
1218
1219
1220 max = roundup(keep, 4);
1221 new = kmalloc(sizeof(struct keyring_list) + max * sizeof(struct key *),
1222 GFP_KERNEL);
1223 if (!new)
1224 goto nomem;
1225 new->maxkeys = max;
1226 new->nkeys = 0;
1227 new->delkey = 0;
1228
1229
1230
1231
1232 keep = 0;
1233 for (loop = klist->nkeys - 1; loop >= 0; loop--) {
1234 key = rcu_deref_link_locked(klist, loop, keyring);
1235 if (!key_is_dead(key, limit)) {
1236 if (keep >= max)
1237 goto discard_new;
1238 RCU_INIT_POINTER(new->keys[keep++], key_get(key));
1239 }
1240 }
1241 new->nkeys = keep;
1242
1243
1244 key_payload_reserve(keyring,
1245 sizeof(struct keyring_list) +
1246 KEYQUOTA_LINK_BYTES * keep);
1247
1248 if (keep == 0) {
1249 rcu_assign_pointer(keyring->payload.subscriptions, NULL);
1250 kfree(new);
1251 } else {
1252 rcu_assign_pointer(keyring->payload.subscriptions, new);
1253 }
1254
1255 up_write(&keyring->sem);
1256
1257 call_rcu(&klist->rcu, keyring_clear_rcu_disposal);
1258 kleave(" [yes]");
1259 return;
1260
1261discard_new:
1262 new->nkeys = keep;
1263 keyring_clear_rcu_disposal(&new->rcu);
1264 up_write(&keyring->sem);
1265 kleave(" [discard]");
1266 return;
1267
1268just_return:
1269 up_write(&keyring->sem);
1270 kleave(" [no dead]");
1271 return;
1272
1273no_klist:
1274 up_write(&keyring->sem);
1275 kleave(" [no_klist]");
1276 return;
1277
1278nomem:
1279 up_write(&keyring->sem);
1280 kleave(" [oom]");
1281}
1282