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, nkeys, 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 nkeys = keylist->nkeys;
384 smp_rmb();
385 for (kix = 0; kix < nkeys; kix++) {
386 key = keylist->keys[kix];
387 kflags = key->flags;
388
389
390 if (key->type != type)
391 continue;
392
393
394 if (!no_state_check) {
395 if (kflags & (1 << KEY_FLAG_REVOKED))
396 continue;
397
398 if (key->expiry && now.tv_sec >= key->expiry)
399 continue;
400 }
401
402
403 if (!match(key, description))
404 continue;
405
406
407 if (key_task_permission(make_key_ref(key, possessed),
408 cred, KEY_SEARCH) < 0)
409 continue;
410
411 if (no_state_check)
412 goto found;
413
414
415 if (kflags & (1 << KEY_FLAG_NEGATIVE)) {
416 err = key->type_data.reject_error;
417 continue;
418 }
419
420 goto found;
421 }
422
423
424 kix = 0;
425ascend:
426 nkeys = keylist->nkeys;
427 smp_rmb();
428 for (; kix < nkeys; kix++) {
429 key = keylist->keys[kix];
430 if (key->type != &key_type_keyring)
431 continue;
432
433
434
435
436 if (sp >= KEYRING_SEARCH_MAX_DEPTH)
437 continue;
438
439 if (key_task_permission(make_key_ref(key, possessed),
440 cred, KEY_SEARCH) < 0)
441 continue;
442
443
444 stack[sp].keylist = keylist;
445 stack[sp].kix = kix;
446 sp++;
447
448
449 keyring = key;
450 goto descend;
451 }
452
453
454
455not_this_keyring:
456 if (sp > 0) {
457
458 sp--;
459 keylist = stack[sp].keylist;
460 kix = stack[sp].kix + 1;
461 goto ascend;
462 }
463
464 key_ref = ERR_PTR(err);
465 goto error_2;
466
467
468found:
469 atomic_inc(&key->usage);
470 key_check(key);
471 key_ref = make_key_ref(key, possessed);
472error_2:
473 rcu_read_unlock();
474error:
475 return key_ref;
476}
477
478
479
480
481
482
483
484
485
486
487key_ref_t keyring_search(key_ref_t keyring,
488 struct key_type *type,
489 const char *description)
490{
491 if (!type->match)
492 return ERR_PTR(-ENOKEY);
493
494 return keyring_search_aux(keyring, current->cred,
495 type, description, type->match, false);
496}
497EXPORT_SYMBOL(keyring_search);
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514key_ref_t __keyring_search_one(key_ref_t keyring_ref,
515 const struct key_type *ktype,
516 const char *description,
517 key_perm_t perm)
518{
519 struct keyring_list *klist;
520 unsigned long possessed;
521 struct key *keyring, *key;
522 int nkeys, loop;
523
524 keyring = key_ref_to_ptr(keyring_ref);
525 possessed = is_key_possessed(keyring_ref);
526
527 rcu_read_lock();
528
529 klist = rcu_dereference(keyring->payload.subscriptions);
530 if (klist) {
531 nkeys = klist->nkeys;
532 smp_rmb();
533 for (loop = 0; loop < nkeys ; loop++) {
534 key = klist->keys[loop];
535
536 if (key->type == ktype &&
537 (!key->type->match ||
538 key->type->match(key, description)) &&
539 key_permission(make_key_ref(key, possessed),
540 perm) == 0 &&
541 !test_bit(KEY_FLAG_REVOKED, &key->flags)
542 )
543 goto found;
544 }
545 }
546
547 rcu_read_unlock();
548 return ERR_PTR(-ENOKEY);
549
550found:
551 atomic_inc(&key->usage);
552 rcu_read_unlock();
553 return make_key_ref(key, possessed);
554}
555
556
557
558
559
560
561
562
563
564
565
566
567struct key *find_keyring_by_name(const char *name, bool skip_perm_check)
568{
569 struct key *keyring;
570 int bucket;
571
572 if (!name)
573 return ERR_PTR(-EINVAL);
574
575 bucket = keyring_hash(name);
576
577 read_lock(&keyring_name_lock);
578
579 if (keyring_name_hash[bucket].next) {
580
581
582 list_for_each_entry(keyring,
583 &keyring_name_hash[bucket],
584 type_data.link
585 ) {
586 if (keyring->user->user_ns != current_user_ns())
587 continue;
588
589 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
590 continue;
591
592 if (strcmp(keyring->description, name) != 0)
593 continue;
594
595 if (!skip_perm_check &&
596 key_permission(make_key_ref(keyring, 0),
597 KEY_SEARCH) < 0)
598 continue;
599
600
601
602
603 if (!atomic_inc_not_zero(&keyring->usage))
604 continue;
605 goto out;
606 }
607 }
608
609 keyring = ERR_PTR(-ENOKEY);
610out:
611 read_unlock(&keyring_name_lock);
612 return keyring;
613}
614
615
616
617
618
619
620
621
622static int keyring_detect_cycle(struct key *A, struct key *B)
623{
624 struct {
625 struct keyring_list *keylist;
626 int kix;
627 } stack[KEYRING_SEARCH_MAX_DEPTH];
628
629 struct keyring_list *keylist;
630 struct key *subtree, *key;
631 int sp, nkeys, kix, ret;
632
633 rcu_read_lock();
634
635 ret = -EDEADLK;
636 if (A == B)
637 goto cycle_detected;
638
639 subtree = B;
640 sp = 0;
641
642
643descend:
644 if (test_bit(KEY_FLAG_REVOKED, &subtree->flags))
645 goto not_this_keyring;
646
647 keylist = rcu_dereference(subtree->payload.subscriptions);
648 if (!keylist)
649 goto not_this_keyring;
650 kix = 0;
651
652ascend:
653
654 nkeys = keylist->nkeys;
655 smp_rmb();
656 for (; kix < nkeys; kix++) {
657 key = keylist->keys[kix];
658
659 if (key == A)
660 goto cycle_detected;
661
662
663 if (key->type == &key_type_keyring) {
664 if (sp >= KEYRING_SEARCH_MAX_DEPTH)
665 goto too_deep;
666
667
668 stack[sp].keylist = keylist;
669 stack[sp].kix = kix;
670 sp++;
671
672
673 subtree = key;
674 goto descend;
675 }
676 }
677
678
679
680not_this_keyring:
681 if (sp > 0) {
682
683 sp--;
684 keylist = stack[sp].keylist;
685 kix = stack[sp].kix + 1;
686 goto ascend;
687 }
688
689 ret = 0;
690
691error:
692 rcu_read_unlock();
693 return ret;
694
695too_deep:
696 ret = -ELOOP;
697 goto error;
698
699cycle_detected:
700 ret = -EDEADLK;
701 goto error;
702}
703
704
705
706
707
708static void keyring_unlink_rcu_disposal(struct rcu_head *rcu)
709{
710 struct keyring_list *klist =
711 container_of(rcu, struct keyring_list, rcu);
712
713 if (klist->delkey != USHRT_MAX)
714 key_put(klist->keys[klist->delkey]);
715 kfree(klist);
716}
717
718
719
720
721int __key_link_begin(struct key *keyring, const struct key_type *type,
722 const char *description, unsigned long *_prealloc)
723 __acquires(&keyring->sem)
724{
725 struct keyring_list *klist, *nklist;
726 unsigned long prealloc;
727 unsigned max;
728 size_t size;
729 int loop, ret;
730
731 kenter("%d,%s,%s,", key_serial(keyring), type->name, description);
732
733 if (keyring->type != &key_type_keyring)
734 return -ENOTDIR;
735
736 down_write(&keyring->sem);
737
738 ret = -EKEYREVOKED;
739 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
740 goto error_krsem;
741
742
743
744 if (type == &key_type_keyring)
745 down_write(&keyring_serialise_link_sem);
746
747 klist = rcu_dereference_locked_keyring(keyring);
748
749
750 if (klist && klist->nkeys > 0) {
751 for (loop = klist->nkeys - 1; loop >= 0; loop--) {
752 if (klist->keys[loop]->type == type &&
753 strcmp(klist->keys[loop]->description,
754 description) == 0
755 ) {
756
757
758 size = sizeof(struct key *) * klist->maxkeys;
759 size += sizeof(*klist);
760 BUG_ON(size > PAGE_SIZE);
761
762 ret = -ENOMEM;
763 nklist = kmemdup(klist, size, GFP_KERNEL);
764 if (!nklist)
765 goto error_sem;
766
767
768 klist->delkey = nklist->delkey = loop;
769 prealloc = (unsigned long)nklist;
770 goto done;
771 }
772 }
773 }
774
775
776 ret = key_payload_reserve(keyring,
777 keyring->datalen + KEYQUOTA_LINK_BYTES);
778 if (ret < 0)
779 goto error_sem;
780
781 if (klist && klist->nkeys < klist->maxkeys) {
782
783 nklist = NULL;
784 prealloc = KEY_LINK_FIXQUOTA;
785 } else {
786
787 max = 4;
788 if (klist)
789 max += klist->maxkeys;
790
791 ret = -ENFILE;
792 if (max > USHRT_MAX - 1)
793 goto error_quota;
794 size = sizeof(*klist) + sizeof(struct key *) * max;
795 if (size > PAGE_SIZE)
796 goto error_quota;
797
798 ret = -ENOMEM;
799 nklist = kmalloc(size, GFP_KERNEL);
800 if (!nklist)
801 goto error_quota;
802
803 nklist->maxkeys = max;
804 if (klist) {
805 memcpy(nklist->keys, klist->keys,
806 sizeof(struct key *) * klist->nkeys);
807 nklist->delkey = klist->nkeys;
808 nklist->nkeys = klist->nkeys + 1;
809 klist->delkey = USHRT_MAX;
810 } else {
811 nklist->nkeys = 1;
812 nklist->delkey = 0;
813 }
814
815
816 nklist->keys[nklist->delkey] = NULL;
817 }
818
819 prealloc = (unsigned long)nklist | KEY_LINK_FIXQUOTA;
820done:
821 *_prealloc = prealloc;
822 kleave(" = 0");
823 return 0;
824
825error_quota:
826
827 key_payload_reserve(keyring,
828 keyring->datalen - KEYQUOTA_LINK_BYTES);
829error_sem:
830 if (type == &key_type_keyring)
831 up_write(&keyring_serialise_link_sem);
832error_krsem:
833 up_write(&keyring->sem);
834 kleave(" = %d", ret);
835 return ret;
836}
837
838
839
840
841
842
843
844int __key_link_check_live_key(struct key *keyring, struct key *key)
845{
846 if (key->type == &key_type_keyring)
847
848
849 return keyring_detect_cycle(keyring, key);
850 return 0;
851}
852
853
854
855
856
857
858
859
860
861void __key_link(struct key *keyring, struct key *key,
862 unsigned long *_prealloc)
863{
864 struct keyring_list *klist, *nklist;
865
866 nklist = (struct keyring_list *)(*_prealloc & ~KEY_LINK_FIXQUOTA);
867 *_prealloc = 0;
868
869 kenter("%d,%d,%p", keyring->serial, key->serial, nklist);
870
871 klist = rcu_dereference_locked_keyring(keyring);
872
873 atomic_inc(&key->usage);
874
875
876
877 if (nklist) {
878 kdebug("replace %hu/%hu/%hu",
879 nklist->delkey, nklist->nkeys, nklist->maxkeys);
880
881 nklist->keys[nklist->delkey] = key;
882
883 rcu_assign_pointer(keyring->payload.subscriptions, nklist);
884
885
886
887 if (klist) {
888 kdebug("dispose %hu/%hu/%hu",
889 klist->delkey, klist->nkeys, klist->maxkeys);
890 call_rcu(&klist->rcu, keyring_unlink_rcu_disposal);
891 }
892 } else {
893
894 klist->keys[klist->nkeys] = key;
895 smp_wmb();
896 klist->nkeys++;
897 }
898}
899
900
901
902
903
904
905void __key_link_end(struct key *keyring, struct key_type *type,
906 unsigned long prealloc)
907 __releases(&keyring->sem)
908{
909 BUG_ON(type == NULL);
910 BUG_ON(type->name == NULL);
911 kenter("%d,%s,%lx", keyring->serial, type->name, prealloc);
912
913 if (type == &key_type_keyring)
914 up_write(&keyring_serialise_link_sem);
915
916 if (prealloc) {
917 if (prealloc & KEY_LINK_FIXQUOTA)
918 key_payload_reserve(keyring,
919 keyring->datalen -
920 KEYQUOTA_LINK_BYTES);
921 kfree((struct keyring_list *)(prealloc & ~KEY_LINK_FIXQUOTA));
922 }
923 up_write(&keyring->sem);
924}
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946int key_link(struct key *keyring, struct key *key)
947{
948 unsigned long prealloc;
949 int ret;
950
951 key_check(keyring);
952 key_check(key);
953
954 ret = __key_link_begin(keyring, key->type, key->description, &prealloc);
955 if (ret == 0) {
956 ret = __key_link_check_live_key(keyring, key);
957 if (ret == 0)
958 __key_link(keyring, key, &prealloc);
959 __key_link_end(keyring, key->type, prealloc);
960 }
961
962 return ret;
963}
964EXPORT_SYMBOL(key_link);
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983int key_unlink(struct key *keyring, struct key *key)
984{
985 struct keyring_list *klist, *nklist;
986 int loop, ret;
987
988 key_check(keyring);
989 key_check(key);
990
991 ret = -ENOTDIR;
992 if (keyring->type != &key_type_keyring)
993 goto error;
994
995 down_write(&keyring->sem);
996
997 klist = rcu_dereference_locked_keyring(keyring);
998 if (klist) {
999
1000 for (loop = 0; loop < klist->nkeys; loop++)
1001 if (klist->keys[loop] == key)
1002 goto key_is_present;
1003 }
1004
1005 up_write(&keyring->sem);
1006 ret = -ENOENT;
1007 goto error;
1008
1009key_is_present:
1010
1011 nklist = kmalloc(sizeof(*klist) +
1012 sizeof(struct key *) * klist->maxkeys,
1013 GFP_KERNEL);
1014 if (!nklist)
1015 goto nomem;
1016 nklist->maxkeys = klist->maxkeys;
1017 nklist->nkeys = klist->nkeys - 1;
1018
1019 if (loop > 0)
1020 memcpy(&nklist->keys[0],
1021 &klist->keys[0],
1022 loop * sizeof(struct key *));
1023
1024 if (loop < nklist->nkeys)
1025 memcpy(&nklist->keys[loop],
1026 &klist->keys[loop + 1],
1027 (nklist->nkeys - loop) * sizeof(struct key *));
1028
1029
1030 key_payload_reserve(keyring,
1031 keyring->datalen - KEYQUOTA_LINK_BYTES);
1032
1033 rcu_assign_pointer(keyring->payload.subscriptions, nklist);
1034
1035 up_write(&keyring->sem);
1036
1037
1038 klist->delkey = loop;
1039 call_rcu(&klist->rcu, keyring_unlink_rcu_disposal);
1040
1041 ret = 0;
1042
1043error:
1044 return ret;
1045nomem:
1046 ret = -ENOMEM;
1047 up_write(&keyring->sem);
1048 goto error;
1049}
1050EXPORT_SYMBOL(key_unlink);
1051
1052
1053
1054
1055
1056static void keyring_clear_rcu_disposal(struct rcu_head *rcu)
1057{
1058 struct keyring_list *klist;
1059 int loop;
1060
1061 klist = container_of(rcu, struct keyring_list, rcu);
1062
1063 for (loop = klist->nkeys - 1; loop >= 0; loop--)
1064 key_put(klist->keys[loop]);
1065
1066 kfree(klist);
1067}
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077int keyring_clear(struct key *keyring)
1078{
1079 struct keyring_list *klist;
1080 int ret;
1081
1082 ret = -ENOTDIR;
1083 if (keyring->type == &key_type_keyring) {
1084
1085 down_write(&keyring->sem);
1086
1087 klist = rcu_dereference_locked_keyring(keyring);
1088 if (klist) {
1089
1090 key_payload_reserve(keyring,
1091 sizeof(struct keyring_list));
1092
1093 rcu_assign_pointer(keyring->payload.subscriptions,
1094 NULL);
1095 }
1096
1097 up_write(&keyring->sem);
1098
1099
1100 if (klist)
1101 call_rcu(&klist->rcu, keyring_clear_rcu_disposal);
1102
1103 ret = 0;
1104 }
1105
1106 return ret;
1107}
1108EXPORT_SYMBOL(keyring_clear);
1109
1110
1111
1112
1113
1114
1115static void keyring_revoke(struct key *keyring)
1116{
1117 struct keyring_list *klist;
1118
1119 klist = rcu_dereference_locked_keyring(keyring);
1120
1121
1122 key_payload_reserve(keyring, 0);
1123
1124 if (klist) {
1125 rcu_assign_pointer(keyring->payload.subscriptions, NULL);
1126 call_rcu(&klist->rcu, keyring_clear_rcu_disposal);
1127 }
1128}
1129
1130
1131
1132
1133static bool key_is_dead(struct key *key, time_t limit)
1134{
1135 return test_bit(KEY_FLAG_DEAD, &key->flags) ||
1136 (key->expiry > 0 && key->expiry <= limit);
1137}
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147void keyring_gc(struct key *keyring, time_t limit)
1148{
1149 struct keyring_list *klist, *new;
1150 struct key *key;
1151 int loop, keep, max;
1152
1153 kenter("{%x,%s}", key_serial(keyring), keyring->description);
1154
1155 down_write(&keyring->sem);
1156
1157 klist = rcu_dereference_locked_keyring(keyring);
1158 if (!klist)
1159 goto no_klist;
1160
1161
1162 keep = 0;
1163 for (loop = klist->nkeys - 1; loop >= 0; loop--)
1164 if (!key_is_dead(klist->keys[loop], limit))
1165 keep++;
1166
1167 if (keep == klist->nkeys)
1168 goto just_return;
1169
1170
1171 max = roundup(keep, 4);
1172 new = kmalloc(sizeof(struct keyring_list) + max * sizeof(struct key *),
1173 GFP_KERNEL);
1174 if (!new)
1175 goto nomem;
1176 new->maxkeys = max;
1177 new->nkeys = 0;
1178 new->delkey = 0;
1179
1180
1181
1182
1183 keep = 0;
1184 for (loop = klist->nkeys - 1; loop >= 0; loop--) {
1185 key = klist->keys[loop];
1186 if (!key_is_dead(key, limit)) {
1187 if (keep >= max)
1188 goto discard_new;
1189 new->keys[keep++] = key_get(key);
1190 }
1191 }
1192 new->nkeys = keep;
1193
1194
1195 key_payload_reserve(keyring,
1196 sizeof(struct keyring_list) +
1197 KEYQUOTA_LINK_BYTES * keep);
1198
1199 if (keep == 0) {
1200 rcu_assign_pointer(keyring->payload.subscriptions, NULL);
1201 kfree(new);
1202 } else {
1203 rcu_assign_pointer(keyring->payload.subscriptions, new);
1204 }
1205
1206 up_write(&keyring->sem);
1207
1208 call_rcu(&klist->rcu, keyring_clear_rcu_disposal);
1209 kleave(" [yes]");
1210 return;
1211
1212discard_new:
1213 new->nkeys = keep;
1214 keyring_clear_rcu_disposal(&new->rcu);
1215 up_write(&keyring->sem);
1216 kleave(" [discard]");
1217 return;
1218
1219just_return:
1220 up_write(&keyring->sem);
1221 kleave(" [no dead]");
1222 return;
1223
1224no_klist:
1225 up_write(&keyring->sem);
1226 kleave(" [no_klist]");
1227 return;
1228
1229nomem:
1230 up_write(&keyring->sem);
1231 kleave(" [oom]");
1232}
1233