1
2
3
4
5
6
7
8
9
10
11
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/poison.h>
15#include <linux/sched.h>
16#include <linux/slab.h>
17#include <linux/security.h>
18#include <linux/workqueue.h>
19#include <linux/random.h>
20#include <linux/err.h>
21#include "internal.h"
22
23struct kmem_cache *key_jar;
24struct rb_root key_serial_tree;
25DEFINE_SPINLOCK(key_serial_lock);
26
27struct rb_root key_user_tree;
28DEFINE_SPINLOCK(key_user_lock);
29
30unsigned int key_quota_root_maxkeys = 1000000;
31unsigned int key_quota_root_maxbytes = 25000000;
32unsigned int key_quota_maxkeys = 200;
33unsigned int key_quota_maxbytes = 20000;
34
35static LIST_HEAD(key_types_list);
36static DECLARE_RWSEM(key_types_sem);
37
38
39DEFINE_MUTEX(key_construction_mutex);
40
41#ifdef KEY_DEBUGGING
42void __key_check(const struct key *key)
43{
44 printk("__key_check: key %p {%08x} should be {%08x}\n",
45 key, key->magic, KEY_DEBUG_MAGIC);
46 BUG();
47}
48#endif
49
50
51
52
53
54struct key_user *key_user_lookup(kuid_t uid)
55{
56 struct key_user *candidate = NULL, *user;
57 struct rb_node *parent = NULL;
58 struct rb_node **p;
59
60try_again:
61 p = &key_user_tree.rb_node;
62 spin_lock(&key_user_lock);
63
64
65 while (*p) {
66 parent = *p;
67 user = rb_entry(parent, struct key_user, node);
68
69 if (uid_lt(uid, user->uid))
70 p = &(*p)->rb_left;
71 else if (uid_gt(uid, user->uid))
72 p = &(*p)->rb_right;
73 else
74 goto found;
75 }
76
77
78 if (!candidate) {
79
80
81 spin_unlock(&key_user_lock);
82
83 user = NULL;
84 candidate = kmalloc(sizeof(struct key_user), GFP_KERNEL);
85 if (unlikely(!candidate))
86 goto out;
87
88
89
90
91 goto try_again;
92 }
93
94
95
96 refcount_set(&candidate->usage, 1);
97 atomic_set(&candidate->nkeys, 0);
98 atomic_set(&candidate->nikeys, 0);
99 candidate->uid = uid;
100 candidate->qnkeys = 0;
101 candidate->qnbytes = 0;
102 spin_lock_init(&candidate->lock);
103 mutex_init(&candidate->cons_lock);
104
105 rb_link_node(&candidate->node, parent, p);
106 rb_insert_color(&candidate->node, &key_user_tree);
107 spin_unlock(&key_user_lock);
108 user = candidate;
109 goto out;
110
111
112found:
113 refcount_inc(&user->usage);
114 spin_unlock(&key_user_lock);
115 kfree(candidate);
116out:
117 return user;
118}
119
120
121
122
123void key_user_put(struct key_user *user)
124{
125 if (refcount_dec_and_lock(&user->usage, &key_user_lock)) {
126 rb_erase(&user->node, &key_user_tree);
127 spin_unlock(&key_user_lock);
128
129 kfree(user);
130 }
131}
132
133
134
135
136
137static inline void key_alloc_serial(struct key *key)
138{
139 struct rb_node *parent, **p;
140 struct key *xkey;
141
142
143
144 do {
145 get_random_bytes(&key->serial, sizeof(key->serial));
146
147 key->serial >>= 1;
148 } while (key->serial < 3);
149
150 spin_lock(&key_serial_lock);
151
152attempt_insertion:
153 parent = NULL;
154 p = &key_serial_tree.rb_node;
155
156 while (*p) {
157 parent = *p;
158 xkey = rb_entry(parent, struct key, serial_node);
159
160 if (key->serial < xkey->serial)
161 p = &(*p)->rb_left;
162 else if (key->serial > xkey->serial)
163 p = &(*p)->rb_right;
164 else
165 goto serial_exists;
166 }
167
168
169 rb_link_node(&key->serial_node, parent, p);
170 rb_insert_color(&key->serial_node, &key_serial_tree);
171
172 spin_unlock(&key_serial_lock);
173 return;
174
175
176
177serial_exists:
178 for (;;) {
179 key->serial++;
180 if (key->serial < 3) {
181 key->serial = 3;
182 goto attempt_insertion;
183 }
184
185 parent = rb_next(parent);
186 if (!parent)
187 goto attempt_insertion;
188
189 xkey = rb_entry(parent, struct key, serial_node);
190 if (key->serial < xkey->serial)
191 goto attempt_insertion;
192 }
193}
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228struct key *key_alloc(struct key_type *type, const char *desc,
229 kuid_t uid, kgid_t gid, const struct cred *cred,
230 key_perm_t perm, unsigned long flags,
231 struct key_restriction *restrict_link)
232{
233 struct key_user *user = NULL;
234 struct key *key;
235 size_t desclen, quotalen;
236 int ret;
237
238 key = ERR_PTR(-EINVAL);
239 if (!desc || !*desc)
240 goto error;
241
242 if (type->vet_description) {
243 ret = type->vet_description(desc);
244 if (ret < 0) {
245 key = ERR_PTR(ret);
246 goto error;
247 }
248 }
249
250 desclen = strlen(desc);
251 quotalen = desclen + 1 + type->def_datalen;
252
253
254 user = key_user_lookup(uid);
255 if (!user)
256 goto no_memory_1;
257
258
259
260 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
261 unsigned maxkeys = uid_eq(uid, GLOBAL_ROOT_UID) ?
262 key_quota_root_maxkeys : key_quota_maxkeys;
263 unsigned maxbytes = uid_eq(uid, GLOBAL_ROOT_UID) ?
264 key_quota_root_maxbytes : key_quota_maxbytes;
265
266 spin_lock(&user->lock);
267 if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) {
268 if (user->qnkeys + 1 >= maxkeys ||
269 user->qnbytes + quotalen >= maxbytes ||
270 user->qnbytes + quotalen < user->qnbytes)
271 goto no_quota;
272 }
273
274 user->qnkeys++;
275 user->qnbytes += quotalen;
276 spin_unlock(&user->lock);
277 }
278
279
280 key = kmem_cache_zalloc(key_jar, GFP_KERNEL);
281 if (!key)
282 goto no_memory_2;
283
284 key->index_key.desc_len = desclen;
285 key->index_key.description = kmemdup(desc, desclen + 1, GFP_KERNEL);
286 if (!key->index_key.description)
287 goto no_memory_3;
288
289 refcount_set(&key->usage, 1);
290 init_rwsem(&key->sem);
291 lockdep_set_class(&key->sem, &type->lock_class);
292 key->index_key.type = type;
293 key->user = user;
294 key->quotalen = quotalen;
295 key->datalen = type->def_datalen;
296 key->uid = uid;
297 key->gid = gid;
298 key->perm = perm;
299 key->restrict_link = restrict_link;
300
301 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA))
302 key->flags |= 1 << KEY_FLAG_IN_QUOTA;
303 if (flags & KEY_ALLOC_BUILT_IN)
304 key->flags |= 1 << KEY_FLAG_BUILTIN;
305
306#ifdef KEY_DEBUGGING
307 key->magic = KEY_DEBUG_MAGIC;
308#endif
309
310
311 ret = security_key_alloc(key, cred, flags);
312 if (ret < 0)
313 goto security_error;
314
315
316 atomic_inc(&user->nkeys);
317 key_alloc_serial(key);
318
319error:
320 return key;
321
322security_error:
323 kfree(key->description);
324 kmem_cache_free(key_jar, key);
325 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
326 spin_lock(&user->lock);
327 user->qnkeys--;
328 user->qnbytes -= quotalen;
329 spin_unlock(&user->lock);
330 }
331 key_user_put(user);
332 key = ERR_PTR(ret);
333 goto error;
334
335no_memory_3:
336 kmem_cache_free(key_jar, key);
337no_memory_2:
338 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
339 spin_lock(&user->lock);
340 user->qnkeys--;
341 user->qnbytes -= quotalen;
342 spin_unlock(&user->lock);
343 }
344 key_user_put(user);
345no_memory_1:
346 key = ERR_PTR(-ENOMEM);
347 goto error;
348
349no_quota:
350 spin_unlock(&user->lock);
351 key_user_put(user);
352 key = ERR_PTR(-EDQUOT);
353 goto error;
354}
355EXPORT_SYMBOL(key_alloc);
356
357
358
359
360
361
362
363
364
365
366
367
368int key_payload_reserve(struct key *key, size_t datalen)
369{
370 int delta = (int)datalen - key->datalen;
371 int ret = 0;
372
373 key_check(key);
374
375
376 if (delta != 0 && test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {
377 unsigned maxbytes = uid_eq(key->user->uid, GLOBAL_ROOT_UID) ?
378 key_quota_root_maxbytes : key_quota_maxbytes;
379
380 spin_lock(&key->user->lock);
381
382 if (delta > 0 &&
383 (key->user->qnbytes + delta >= maxbytes ||
384 key->user->qnbytes + delta < key->user->qnbytes)) {
385 ret = -EDQUOT;
386 }
387 else {
388 key->user->qnbytes += delta;
389 key->quotalen += delta;
390 }
391 spin_unlock(&key->user->lock);
392 }
393
394
395 if (ret == 0)
396 key->datalen = datalen;
397
398 return ret;
399}
400EXPORT_SYMBOL(key_payload_reserve);
401
402
403
404
405
406
407
408static int __key_instantiate_and_link(struct key *key,
409 struct key_preparsed_payload *prep,
410 struct key *keyring,
411 struct key *authkey,
412 struct assoc_array_edit **_edit)
413{
414 int ret, awaken;
415
416 key_check(key);
417 key_check(keyring);
418
419 awaken = 0;
420 ret = -EBUSY;
421
422 mutex_lock(&key_construction_mutex);
423
424
425 if (!test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) {
426
427 ret = key->type->instantiate(key, prep);
428
429 if (ret == 0) {
430
431 atomic_inc(&key->user->nikeys);
432 set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
433
434 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
435 awaken = 1;
436
437
438 if (keyring) {
439 if (test_bit(KEY_FLAG_KEEP, &keyring->flags))
440 set_bit(KEY_FLAG_KEEP, &key->flags);
441
442 __key_link(key, _edit);
443 }
444
445
446 if (authkey)
447 key_revoke(authkey);
448
449 if (prep->expiry != TIME_T_MAX) {
450 key->expiry = prep->expiry;
451 key_schedule_gc(prep->expiry + key_gc_delay);
452 }
453 }
454 }
455
456 mutex_unlock(&key_construction_mutex);
457
458
459 if (awaken)
460 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
461
462 return ret;
463}
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481int key_instantiate_and_link(struct key *key,
482 const void *data,
483 size_t datalen,
484 struct key *keyring,
485 struct key *authkey)
486{
487 struct key_preparsed_payload prep;
488 struct assoc_array_edit *edit;
489 int ret;
490
491 memset(&prep, 0, sizeof(prep));
492 prep.data = data;
493 prep.datalen = datalen;
494 prep.quotalen = key->type->def_datalen;
495 prep.expiry = TIME_T_MAX;
496 if (key->type->preparse) {
497 ret = key->type->preparse(&prep);
498 if (ret < 0)
499 goto error;
500 }
501
502 if (keyring) {
503 ret = __key_link_begin(keyring, &key->index_key, &edit);
504 if (ret < 0)
505 goto error;
506
507 if (keyring->restrict_link && keyring->restrict_link->check) {
508 struct key_restriction *keyres = keyring->restrict_link;
509
510 ret = keyres->check(keyring, key->type, &prep.payload,
511 keyres->key);
512 if (ret < 0)
513 goto error_link_end;
514 }
515 }
516
517 ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
518
519error_link_end:
520 if (keyring)
521 __key_link_end(keyring, &key->index_key, edit);
522
523error:
524 if (key->type->preparse)
525 key->type->free_preparse(&prep);
526 return ret;
527}
528
529EXPORT_SYMBOL(key_instantiate_and_link);
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552int key_reject_and_link(struct key *key,
553 unsigned timeout,
554 unsigned error,
555 struct key *keyring,
556 struct key *authkey)
557{
558 struct assoc_array_edit *edit;
559 struct timespec now;
560 int ret, awaken, link_ret = 0;
561
562 key_check(key);
563 key_check(keyring);
564
565 awaken = 0;
566 ret = -EBUSY;
567
568 if (keyring) {
569 if (keyring->restrict_link)
570 return -EPERM;
571
572 link_ret = __key_link_begin(keyring, &key->index_key, &edit);
573 }
574
575 mutex_lock(&key_construction_mutex);
576
577
578 if (!test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) {
579
580 atomic_inc(&key->user->nikeys);
581 key->reject_error = -error;
582 smp_wmb();
583 set_bit(KEY_FLAG_NEGATIVE, &key->flags);
584 set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
585 now = current_kernel_time();
586 key->expiry = now.tv_sec + timeout;
587 key_schedule_gc(key->expiry + key_gc_delay);
588
589 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
590 awaken = 1;
591
592 ret = 0;
593
594
595 if (keyring && link_ret == 0)
596 __key_link(key, &edit);
597
598
599 if (authkey)
600 key_revoke(authkey);
601 }
602
603 mutex_unlock(&key_construction_mutex);
604
605 if (keyring && link_ret == 0)
606 __key_link_end(keyring, &key->index_key, edit);
607
608
609 if (awaken)
610 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
611
612 return ret == 0 ? link_ret : ret;
613}
614EXPORT_SYMBOL(key_reject_and_link);
615
616
617
618
619
620
621
622
623
624void key_put(struct key *key)
625{
626 if (key) {
627 key_check(key);
628
629 if (refcount_dec_and_test(&key->usage))
630 schedule_work(&key_gc_work);
631 }
632}
633EXPORT_SYMBOL(key_put);
634
635
636
637
638struct key *key_lookup(key_serial_t id)
639{
640 struct rb_node *n;
641 struct key *key;
642
643 spin_lock(&key_serial_lock);
644
645
646 n = key_serial_tree.rb_node;
647 while (n) {
648 key = rb_entry(n, struct key, serial_node);
649
650 if (id < key->serial)
651 n = n->rb_left;
652 else if (id > key->serial)
653 n = n->rb_right;
654 else
655 goto found;
656 }
657
658not_found:
659 key = ERR_PTR(-ENOKEY);
660 goto error;
661
662found:
663
664
665
666 if (!refcount_inc_not_zero(&key->usage))
667 goto not_found;
668
669error:
670 spin_unlock(&key_serial_lock);
671 return key;
672}
673
674
675
676
677
678
679
680struct key_type *key_type_lookup(const char *type)
681{
682 struct key_type *ktype;
683
684 down_read(&key_types_sem);
685
686
687
688 list_for_each_entry(ktype, &key_types_list, link) {
689 if (strcmp(ktype->name, type) == 0)
690 goto found_kernel_type;
691 }
692
693 up_read(&key_types_sem);
694 ktype = ERR_PTR(-ENOKEY);
695
696found_kernel_type:
697 return ktype;
698}
699
700void key_set_timeout(struct key *key, unsigned timeout)
701{
702 struct timespec now;
703 time_t expiry = 0;
704
705
706 down_write(&key->sem);
707
708 if (timeout > 0) {
709 now = current_kernel_time();
710 expiry = now.tv_sec + timeout;
711 }
712
713 key->expiry = expiry;
714 key_schedule_gc(key->expiry + key_gc_delay);
715
716 up_write(&key->sem);
717}
718EXPORT_SYMBOL_GPL(key_set_timeout);
719
720
721
722
723void key_type_put(struct key_type *ktype)
724{
725 up_read(&key_types_sem);
726}
727
728
729
730
731
732
733
734static inline key_ref_t __key_update(key_ref_t key_ref,
735 struct key_preparsed_payload *prep)
736{
737 struct key *key = key_ref_to_ptr(key_ref);
738 int ret;
739
740
741 ret = key_permission(key_ref, KEY_NEED_WRITE);
742 if (ret < 0)
743 goto error;
744
745 ret = -EEXIST;
746 if (!key->type->update)
747 goto error;
748
749 down_write(&key->sem);
750
751 ret = key->type->update(key, prep);
752 if (ret == 0)
753
754 clear_bit(KEY_FLAG_NEGATIVE, &key->flags);
755
756 up_write(&key->sem);
757
758 if (ret < 0)
759 goto error;
760out:
761 return key_ref;
762
763error:
764 key_put(key);
765 key_ref = ERR_PTR(ret);
766 goto out;
767}
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794key_ref_t key_create_or_update(key_ref_t keyring_ref,
795 const char *type,
796 const char *description,
797 const void *payload,
798 size_t plen,
799 key_perm_t perm,
800 unsigned long flags)
801{
802 struct keyring_index_key index_key = {
803 .description = description,
804 };
805 struct key_preparsed_payload prep;
806 struct assoc_array_edit *edit;
807 const struct cred *cred = current_cred();
808 struct key *keyring, *key = NULL;
809 key_ref_t key_ref;
810 int ret;
811 struct key_restriction *restrict_link = NULL;
812
813
814
815 index_key.type = key_type_lookup(type);
816 if (IS_ERR(index_key.type)) {
817 key_ref = ERR_PTR(-ENODEV);
818 goto error;
819 }
820
821 key_ref = ERR_PTR(-EINVAL);
822 if (!index_key.type->instantiate ||
823 (!index_key.description && !index_key.type->preparse))
824 goto error_put_type;
825
826 keyring = key_ref_to_ptr(keyring_ref);
827
828 key_check(keyring);
829
830 key_ref = ERR_PTR(-EPERM);
831 if (!(flags & KEY_ALLOC_BYPASS_RESTRICTION))
832 restrict_link = keyring->restrict_link;
833
834 key_ref = ERR_PTR(-ENOTDIR);
835 if (keyring->type != &key_type_keyring)
836 goto error_put_type;
837
838 memset(&prep, 0, sizeof(prep));
839 prep.data = payload;
840 prep.datalen = plen;
841 prep.quotalen = index_key.type->def_datalen;
842 prep.expiry = TIME_T_MAX;
843 if (index_key.type->preparse) {
844 ret = index_key.type->preparse(&prep);
845 if (ret < 0) {
846 key_ref = ERR_PTR(ret);
847 goto error_free_prep;
848 }
849 if (!index_key.description)
850 index_key.description = prep.description;
851 key_ref = ERR_PTR(-EINVAL);
852 if (!index_key.description)
853 goto error_free_prep;
854 }
855 index_key.desc_len = strlen(index_key.description);
856
857 ret = __key_link_begin(keyring, &index_key, &edit);
858 if (ret < 0) {
859 key_ref = ERR_PTR(ret);
860 goto error_free_prep;
861 }
862
863 if (restrict_link && restrict_link->check) {
864 ret = restrict_link->check(keyring, index_key.type,
865 &prep.payload, restrict_link->key);
866 if (ret < 0) {
867 key_ref = ERR_PTR(ret);
868 goto error_link_end;
869 }
870 }
871
872
873
874 ret = key_permission(keyring_ref, KEY_NEED_WRITE);
875 if (ret < 0) {
876 key_ref = ERR_PTR(ret);
877 goto error_link_end;
878 }
879
880
881
882
883
884 if (index_key.type->update) {
885 key_ref = find_key_to_update(keyring_ref, &index_key);
886 if (key_ref)
887 goto found_matching_key;
888 }
889
890
891 if (perm == KEY_PERM_UNDEF) {
892 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
893 perm |= KEY_USR_VIEW;
894
895 if (index_key.type->read)
896 perm |= KEY_POS_READ;
897
898 if (index_key.type == &key_type_keyring ||
899 index_key.type->update)
900 perm |= KEY_POS_WRITE;
901 }
902
903
904 key = key_alloc(index_key.type, index_key.description,
905 cred->fsuid, cred->fsgid, cred, perm, flags, NULL);
906 if (IS_ERR(key)) {
907 key_ref = ERR_CAST(key);
908 goto error_link_end;
909 }
910
911
912 ret = __key_instantiate_and_link(key, &prep, keyring, NULL, &edit);
913 if (ret < 0) {
914 key_put(key);
915 key_ref = ERR_PTR(ret);
916 goto error_link_end;
917 }
918
919 key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
920
921error_link_end:
922 __key_link_end(keyring, &index_key, edit);
923error_free_prep:
924 if (index_key.type->preparse)
925 index_key.type->free_preparse(&prep);
926error_put_type:
927 key_type_put(index_key.type);
928error:
929 return key_ref;
930
931 found_matching_key:
932
933
934
935 __key_link_end(keyring, &index_key, edit);
936
937 key_ref = __key_update(key_ref, &prep);
938 goto error_free_prep;
939}
940EXPORT_SYMBOL(key_create_or_update);
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955int key_update(key_ref_t key_ref, const void *payload, size_t plen)
956{
957 struct key_preparsed_payload prep;
958 struct key *key = key_ref_to_ptr(key_ref);
959 int ret;
960
961 key_check(key);
962
963
964 ret = key_permission(key_ref, KEY_NEED_WRITE);
965 if (ret < 0)
966 return ret;
967
968
969 if (!key->type->update)
970 return -EOPNOTSUPP;
971
972 memset(&prep, 0, sizeof(prep));
973 prep.data = payload;
974 prep.datalen = plen;
975 prep.quotalen = key->type->def_datalen;
976 prep.expiry = TIME_T_MAX;
977 if (key->type->preparse) {
978 ret = key->type->preparse(&prep);
979 if (ret < 0)
980 goto error;
981 }
982
983 down_write(&key->sem);
984
985 ret = key->type->update(key, &prep);
986 if (ret == 0)
987
988 clear_bit(KEY_FLAG_NEGATIVE, &key->flags);
989
990 up_write(&key->sem);
991
992error:
993 if (key->type->preparse)
994 key->type->free_preparse(&prep);
995 return ret;
996}
997EXPORT_SYMBOL(key_update);
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008void key_revoke(struct key *key)
1009{
1010 struct timespec now;
1011 time_t time;
1012
1013 key_check(key);
1014
1015
1016
1017
1018
1019
1020 down_write_nested(&key->sem, 1);
1021 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags) &&
1022 key->type->revoke)
1023 key->type->revoke(key);
1024
1025
1026 now = current_kernel_time();
1027 time = now.tv_sec;
1028 if (key->revoked_at == 0 || key->revoked_at > time) {
1029 key->revoked_at = time;
1030 key_schedule_gc(key->revoked_at + key_gc_delay);
1031 }
1032
1033 up_write(&key->sem);
1034}
1035EXPORT_SYMBOL(key_revoke);
1036
1037
1038
1039
1040
1041
1042
1043
1044void key_invalidate(struct key *key)
1045{
1046 kenter("%d", key_serial(key));
1047
1048 key_check(key);
1049
1050 if (!test_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1051 down_write_nested(&key->sem, 1);
1052 if (!test_and_set_bit(KEY_FLAG_INVALIDATED, &key->flags))
1053 key_schedule_gc_links();
1054 up_write(&key->sem);
1055 }
1056}
1057EXPORT_SYMBOL(key_invalidate);
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
1070{
1071 int ret;
1072
1073 pr_devel("==>%s()\n", __func__);
1074
1075 ret = key_payload_reserve(key, prep->quotalen);
1076 if (ret == 0) {
1077 rcu_assign_keypointer(key, prep->payload.data[0]);
1078 key->payload.data[1] = prep->payload.data[1];
1079 key->payload.data[2] = prep->payload.data[2];
1080 key->payload.data[3] = prep->payload.data[3];
1081 prep->payload.data[0] = NULL;
1082 prep->payload.data[1] = NULL;
1083 prep->payload.data[2] = NULL;
1084 prep->payload.data[3] = NULL;
1085 }
1086 pr_devel("<==%s() = %d\n", __func__, ret);
1087 return ret;
1088}
1089EXPORT_SYMBOL(generic_key_instantiate);
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099int register_key_type(struct key_type *ktype)
1100{
1101 struct key_type *p;
1102 int ret;
1103
1104 memset(&ktype->lock_class, 0, sizeof(ktype->lock_class));
1105
1106 ret = -EEXIST;
1107 down_write(&key_types_sem);
1108
1109
1110 list_for_each_entry(p, &key_types_list, link) {
1111 if (strcmp(p->name, ktype->name) == 0)
1112 goto out;
1113 }
1114
1115
1116 list_add(&ktype->link, &key_types_list);
1117
1118 pr_notice("Key type %s registered\n", ktype->name);
1119 ret = 0;
1120
1121out:
1122 up_write(&key_types_sem);
1123 return ret;
1124}
1125EXPORT_SYMBOL(register_key_type);
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135void unregister_key_type(struct key_type *ktype)
1136{
1137 down_write(&key_types_sem);
1138 list_del_init(&ktype->link);
1139 downgrade_write(&key_types_sem);
1140 key_gc_keytype(ktype);
1141 pr_notice("Key type %s unregistered\n", ktype->name);
1142 up_read(&key_types_sem);
1143}
1144EXPORT_SYMBOL(unregister_key_type);
1145
1146
1147
1148
1149void __init key_init(void)
1150{
1151
1152 key_jar = kmem_cache_create("key_jar", sizeof(struct key),
1153 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1154
1155
1156 list_add_tail(&key_type_keyring.link, &key_types_list);
1157 list_add_tail(&key_type_dead.link, &key_types_list);
1158 list_add_tail(&key_type_user.link, &key_types_list);
1159 list_add_tail(&key_type_logon.link, &key_types_list);
1160
1161
1162 rb_link_node(&root_key_user.node,
1163 NULL,
1164 &key_user_tree.rb_node);
1165
1166 rb_insert_color(&root_key_user.node,
1167 &key_user_tree);
1168}
1169