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