diff options
Diffstat (limited to 'security/keys/key.c')
-rw-r--r-- | security/keys/key.c | 56 |
1 files changed, 3 insertions, 53 deletions
diff --git a/security/keys/key.c b/security/keys/key.c index 01bcfecb7eae..bb036623d0a8 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -240,9 +240,9 @@ static inline void key_alloc_serial(struct key *key) | |||
240 | /* | 240 | /* |
241 | * allocate a key of the specified type | 241 | * allocate a key of the specified type |
242 | * - update the user's quota to reflect the existence of the key | 242 | * - update the user's quota to reflect the existence of the key |
243 | * - called from a key-type operation with key_types_sem read-locked by either | 243 | * - called from a key-type operation with key_types_sem read-locked by |
244 | * key_create_or_update() or by key_duplicate(); this prevents unregistration | 244 | * key_create_or_update() |
245 | * of the key type | 245 | * - this prevents unregistration of the key type |
246 | * - upon return the key is as yet uninstantiated; the caller needs to either | 246 | * - upon return the key is as yet uninstantiated; the caller needs to either |
247 | * instantiate the key or discard it before returning | 247 | * instantiate the key or discard it before returning |
248 | */ | 248 | */ |
@@ -889,56 +889,6 @@ EXPORT_SYMBOL(key_update); | |||
889 | 889 | ||
890 | /*****************************************************************************/ | 890 | /*****************************************************************************/ |
891 | /* | 891 | /* |
892 | * duplicate a key, potentially with a revised description | ||
893 | * - must be supported by the keytype (keyrings for instance can be duplicated) | ||
894 | */ | ||
895 | struct key *key_duplicate(struct key *source, const char *desc) | ||
896 | { | ||
897 | struct key *key; | ||
898 | int ret; | ||
899 | |||
900 | key_check(source); | ||
901 | |||
902 | if (!desc) | ||
903 | desc = source->description; | ||
904 | |||
905 | down_read(&key_types_sem); | ||
906 | |||
907 | ret = -EINVAL; | ||
908 | if (!source->type->duplicate) | ||
909 | goto error; | ||
910 | |||
911 | /* allocate and instantiate a key */ | ||
912 | key = key_alloc(source->type, desc, current->fsuid, current->fsgid, | ||
913 | source->perm, 0); | ||
914 | if (IS_ERR(key)) | ||
915 | goto error_k; | ||
916 | |||
917 | down_read(&source->sem); | ||
918 | ret = key->type->duplicate(key, source); | ||
919 | up_read(&source->sem); | ||
920 | if (ret < 0) | ||
921 | goto error2; | ||
922 | |||
923 | atomic_inc(&key->user->nikeys); | ||
924 | set_bit(KEY_FLAG_INSTANTIATED, &key->flags); | ||
925 | |||
926 | error_k: | ||
927 | up_read(&key_types_sem); | ||
928 | out: | ||
929 | return key; | ||
930 | |||
931 | error2: | ||
932 | key_put(key); | ||
933 | error: | ||
934 | up_read(&key_types_sem); | ||
935 | key = ERR_PTR(ret); | ||
936 | goto out; | ||
937 | |||
938 | } /* end key_duplicate() */ | ||
939 | |||
940 | /*****************************************************************************/ | ||
941 | /* | ||
942 | * revoke a key | 892 | * revoke a key |
943 | */ | 893 | */ |
944 | void key_revoke(struct key *key) | 894 | void key_revoke(struct key *key) |