diff options
Diffstat (limited to 'security/keys/keyring.c')
| -rw-r--r-- | security/keys/keyring.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index 90a551e4da66..a1f6bac647a1 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c | |||
| @@ -129,7 +129,7 @@ static int keyring_duplicate(struct key *keyring, const struct key *source) | |||
| 129 | int loop, ret; | 129 | int loop, ret; |
| 130 | 130 | ||
| 131 | const unsigned limit = | 131 | const unsigned limit = |
| 132 | (PAGE_SIZE - sizeof(*klist)) / sizeof(struct key); | 132 | (PAGE_SIZE - sizeof(*klist)) / sizeof(struct key *); |
| 133 | 133 | ||
| 134 | ret = 0; | 134 | ret = 0; |
| 135 | 135 | ||
| @@ -150,7 +150,7 @@ static int keyring_duplicate(struct key *keyring, const struct key *source) | |||
| 150 | max = limit; | 150 | max = limit; |
| 151 | 151 | ||
| 152 | ret = -ENOMEM; | 152 | ret = -ENOMEM; |
| 153 | size = sizeof(*klist) + sizeof(struct key) * max; | 153 | size = sizeof(*klist) + sizeof(struct key *) * max; |
| 154 | klist = kmalloc(size, GFP_KERNEL); | 154 | klist = kmalloc(size, GFP_KERNEL); |
| 155 | if (!klist) | 155 | if (!klist) |
| 156 | goto error; | 156 | goto error; |
| @@ -163,7 +163,7 @@ static int keyring_duplicate(struct key *keyring, const struct key *source) | |||
| 163 | klist->nkeys = sklist->nkeys; | 163 | klist->nkeys = sklist->nkeys; |
| 164 | memcpy(klist->keys, | 164 | memcpy(klist->keys, |
| 165 | sklist->keys, | 165 | sklist->keys, |
| 166 | sklist->nkeys * sizeof(struct key)); | 166 | sklist->nkeys * sizeof(struct key *)); |
| 167 | 167 | ||
| 168 | for (loop = klist->nkeys - 1; loop >= 0; loop--) | 168 | for (loop = klist->nkeys - 1; loop >= 0; loop--) |
| 169 | atomic_inc(&klist->keys[loop]->usage); | 169 | atomic_inc(&klist->keys[loop]->usage); |
| @@ -783,7 +783,7 @@ int __key_link(struct key *keyring, struct key *key) | |||
| 783 | ret = -ENFILE; | 783 | ret = -ENFILE; |
| 784 | if (max > 65535) | 784 | if (max > 65535) |
| 785 | goto error3; | 785 | goto error3; |
| 786 | size = sizeof(*klist) + sizeof(*key) * max; | 786 | size = sizeof(*klist) + sizeof(struct key *) * max; |
| 787 | if (size > PAGE_SIZE) | 787 | if (size > PAGE_SIZE) |
| 788 | goto error3; | 788 | goto error3; |
| 789 | 789 | ||
| @@ -895,7 +895,8 @@ int key_unlink(struct key *keyring, struct key *key) | |||
| 895 | 895 | ||
| 896 | key_is_present: | 896 | key_is_present: |
| 897 | /* we need to copy the key list for RCU purposes */ | 897 | /* we need to copy the key list for RCU purposes */ |
| 898 | nklist = kmalloc(sizeof(*klist) + sizeof(*key) * klist->maxkeys, | 898 | nklist = kmalloc(sizeof(*klist) + |
| 899 | sizeof(struct key *) * klist->maxkeys, | ||
| 899 | GFP_KERNEL); | 900 | GFP_KERNEL); |
| 900 | if (!nklist) | 901 | if (!nklist) |
| 901 | goto nomem; | 902 | goto nomem; |
| @@ -905,12 +906,12 @@ key_is_present: | |||
| 905 | if (loop > 0) | 906 | if (loop > 0) |
| 906 | memcpy(&nklist->keys[0], | 907 | memcpy(&nklist->keys[0], |
| 907 | &klist->keys[0], | 908 | &klist->keys[0], |
| 908 | loop * sizeof(klist->keys[0])); | 909 | loop * sizeof(struct key *)); |
| 909 | 910 | ||
| 910 | if (loop < nklist->nkeys) | 911 | if (loop < nklist->nkeys) |
| 911 | memcpy(&nklist->keys[loop], | 912 | memcpy(&nklist->keys[loop], |
| 912 | &klist->keys[loop + 1], | 913 | &klist->keys[loop + 1], |
| 913 | (nklist->nkeys - loop) * sizeof(klist->keys[0])); | 914 | (nklist->nkeys - loop) * sizeof(struct key *)); |
| 914 | 915 | ||
| 915 | /* adjust the user's quota */ | 916 | /* adjust the user's quota */ |
| 916 | key_payload_reserve(keyring, | 917 | key_payload_reserve(keyring, |
