1 // SPDX-License-Identifier: GPL-2.0-or-later 1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 2 /* 3 * af_alg: User-space algorithm interface 3 * af_alg: User-space algorithm interface 4 * 4 * 5 * This file provides the user-space API for a 5 * This file provides the user-space API for algorithms. 6 * 6 * 7 * Copyright (c) 2010 Herbert Xu <herbert@gond 7 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au> 8 */ 8 */ 9 9 10 #include <linux/atomic.h> 10 #include <linux/atomic.h> 11 #include <crypto/if_alg.h> 11 #include <crypto/if_alg.h> 12 #include <linux/crypto.h> 12 #include <linux/crypto.h> 13 #include <linux/init.h> 13 #include <linux/init.h> 14 #include <linux/kernel.h> 14 #include <linux/kernel.h> 15 #include <linux/key.h> << 16 #include <linux/key-type.h> << 17 #include <linux/list.h> 15 #include <linux/list.h> 18 #include <linux/module.h> 16 #include <linux/module.h> 19 #include <linux/net.h> 17 #include <linux/net.h> 20 #include <linux/rwsem.h> 18 #include <linux/rwsem.h> 21 #include <linux/sched.h> 19 #include <linux/sched.h> 22 #include <linux/sched/signal.h> 20 #include <linux/sched/signal.h> 23 #include <linux/security.h> 21 #include <linux/security.h> 24 #include <linux/string.h> << 25 #include <keys/user-type.h> << 26 #include <keys/trusted-type.h> << 27 #include <keys/encrypted-type.h> << 28 22 29 struct alg_type_list { 23 struct alg_type_list { 30 const struct af_alg_type *type; 24 const struct af_alg_type *type; 31 struct list_head list; 25 struct list_head list; 32 }; 26 }; 33 27 >> 28 static atomic_long_t alg_memory_allocated; >> 29 34 static struct proto alg_proto = { 30 static struct proto alg_proto = { 35 .name = "ALG", 31 .name = "ALG", 36 .owner = THIS_MODULE, 32 .owner = THIS_MODULE, >> 33 .memory_allocated = &alg_memory_allocated, 37 .obj_size = sizeof(struc 34 .obj_size = sizeof(struct alg_sock), 38 }; 35 }; 39 36 40 static LIST_HEAD(alg_types); 37 static LIST_HEAD(alg_types); 41 static DECLARE_RWSEM(alg_types_sem); 38 static DECLARE_RWSEM(alg_types_sem); 42 39 43 static const struct af_alg_type *alg_get_type( 40 static const struct af_alg_type *alg_get_type(const char *name) 44 { 41 { 45 const struct af_alg_type *type = ERR_P 42 const struct af_alg_type *type = ERR_PTR(-ENOENT); 46 struct alg_type_list *node; 43 struct alg_type_list *node; 47 44 48 down_read(&alg_types_sem); 45 down_read(&alg_types_sem); 49 list_for_each_entry(node, &alg_types, 46 list_for_each_entry(node, &alg_types, list) { 50 if (strcmp(node->type->name, n 47 if (strcmp(node->type->name, name)) 51 continue; 48 continue; 52 49 53 if (try_module_get(node->type- 50 if (try_module_get(node->type->owner)) 54 type = node->type; 51 type = node->type; 55 break; 52 break; 56 } 53 } 57 up_read(&alg_types_sem); 54 up_read(&alg_types_sem); 58 55 59 return type; 56 return type; 60 } 57 } 61 58 62 int af_alg_register_type(const struct af_alg_t 59 int af_alg_register_type(const struct af_alg_type *type) 63 { 60 { 64 struct alg_type_list *node; 61 struct alg_type_list *node; 65 int err = -EEXIST; 62 int err = -EEXIST; 66 63 67 down_write(&alg_types_sem); 64 down_write(&alg_types_sem); 68 list_for_each_entry(node, &alg_types, 65 list_for_each_entry(node, &alg_types, list) { 69 if (!strcmp(node->type->name, 66 if (!strcmp(node->type->name, type->name)) 70 goto unlock; 67 goto unlock; 71 } 68 } 72 69 73 node = kmalloc(sizeof(*node), GFP_KERN 70 node = kmalloc(sizeof(*node), GFP_KERNEL); 74 err = -ENOMEM; 71 err = -ENOMEM; 75 if (!node) 72 if (!node) 76 goto unlock; 73 goto unlock; 77 74 78 type->ops->owner = THIS_MODULE; 75 type->ops->owner = THIS_MODULE; 79 if (type->ops_nokey) 76 if (type->ops_nokey) 80 type->ops_nokey->owner = THIS_ 77 type->ops_nokey->owner = THIS_MODULE; 81 node->type = type; 78 node->type = type; 82 list_add(&node->list, &alg_types); 79 list_add(&node->list, &alg_types); 83 err = 0; 80 err = 0; 84 81 85 unlock: 82 unlock: 86 up_write(&alg_types_sem); 83 up_write(&alg_types_sem); 87 84 88 return err; 85 return err; 89 } 86 } 90 EXPORT_SYMBOL_GPL(af_alg_register_type); 87 EXPORT_SYMBOL_GPL(af_alg_register_type); 91 88 92 int af_alg_unregister_type(const struct af_alg 89 int af_alg_unregister_type(const struct af_alg_type *type) 93 { 90 { 94 struct alg_type_list *node; 91 struct alg_type_list *node; 95 int err = -ENOENT; 92 int err = -ENOENT; 96 93 97 down_write(&alg_types_sem); 94 down_write(&alg_types_sem); 98 list_for_each_entry(node, &alg_types, 95 list_for_each_entry(node, &alg_types, list) { 99 if (strcmp(node->type->name, t 96 if (strcmp(node->type->name, type->name)) 100 continue; 97 continue; 101 98 102 list_del(&node->list); 99 list_del(&node->list); 103 kfree(node); 100 kfree(node); 104 err = 0; 101 err = 0; 105 break; 102 break; 106 } 103 } 107 up_write(&alg_types_sem); 104 up_write(&alg_types_sem); 108 105 109 return err; 106 return err; 110 } 107 } 111 EXPORT_SYMBOL_GPL(af_alg_unregister_type); 108 EXPORT_SYMBOL_GPL(af_alg_unregister_type); 112 109 113 static void alg_do_release(const struct af_alg 110 static void alg_do_release(const struct af_alg_type *type, void *private) 114 { 111 { 115 if (!type) 112 if (!type) 116 return; 113 return; 117 114 118 type->release(private); 115 type->release(private); 119 module_put(type->owner); 116 module_put(type->owner); 120 } 117 } 121 118 122 int af_alg_release(struct socket *sock) 119 int af_alg_release(struct socket *sock) 123 { 120 { 124 if (sock->sk) { 121 if (sock->sk) { 125 sock_put(sock->sk); 122 sock_put(sock->sk); 126 sock->sk = NULL; 123 sock->sk = NULL; 127 } 124 } 128 return 0; 125 return 0; 129 } 126 } 130 EXPORT_SYMBOL_GPL(af_alg_release); 127 EXPORT_SYMBOL_GPL(af_alg_release); 131 128 132 void af_alg_release_parent(struct sock *sk) 129 void af_alg_release_parent(struct sock *sk) 133 { 130 { 134 struct alg_sock *ask = alg_sk(sk); 131 struct alg_sock *ask = alg_sk(sk); 135 unsigned int nokey = atomic_read(&ask- 132 unsigned int nokey = atomic_read(&ask->nokey_refcnt); 136 133 137 sk = ask->parent; 134 sk = ask->parent; 138 ask = alg_sk(sk); 135 ask = alg_sk(sk); 139 136 140 if (nokey) 137 if (nokey) 141 atomic_dec(&ask->nokey_refcnt) 138 atomic_dec(&ask->nokey_refcnt); 142 139 143 if (atomic_dec_and_test(&ask->refcnt)) 140 if (atomic_dec_and_test(&ask->refcnt)) 144 sock_put(sk); 141 sock_put(sk); 145 } 142 } 146 EXPORT_SYMBOL_GPL(af_alg_release_parent); 143 EXPORT_SYMBOL_GPL(af_alg_release_parent); 147 144 148 static int alg_bind(struct socket *sock, struc 145 static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) 149 { 146 { 150 const u32 allowed = CRYPTO_ALG_KERN_DR 147 const u32 allowed = CRYPTO_ALG_KERN_DRIVER_ONLY; 151 struct sock *sk = sock->sk; 148 struct sock *sk = sock->sk; 152 struct alg_sock *ask = alg_sk(sk); 149 struct alg_sock *ask = alg_sk(sk); 153 struct sockaddr_alg_new *sa = (void *) 150 struct sockaddr_alg_new *sa = (void *)uaddr; 154 const struct af_alg_type *type; 151 const struct af_alg_type *type; 155 void *private; 152 void *private; 156 int err; 153 int err; 157 154 158 if (sock->state == SS_CONNECTED) 155 if (sock->state == SS_CONNECTED) 159 return -EINVAL; 156 return -EINVAL; 160 157 161 BUILD_BUG_ON(offsetof(struct sockaddr_ 158 BUILD_BUG_ON(offsetof(struct sockaddr_alg_new, salg_name) != 162 offsetof(struct sockaddr_ 159 offsetof(struct sockaddr_alg, salg_name)); 163 BUILD_BUG_ON(offsetof(struct sockaddr_ 160 BUILD_BUG_ON(offsetof(struct sockaddr_alg, salg_name) != sizeof(*sa)); 164 161 165 if (addr_len < sizeof(*sa) + 1) 162 if (addr_len < sizeof(*sa) + 1) 166 return -EINVAL; 163 return -EINVAL; 167 164 168 /* If caller uses non-allowed flag, re 165 /* If caller uses non-allowed flag, return error. */ 169 if ((sa->salg_feat & ~allowed) || (sa- 166 if ((sa->salg_feat & ~allowed) || (sa->salg_mask & ~allowed)) 170 return -EINVAL; 167 return -EINVAL; 171 168 172 sa->salg_type[sizeof(sa->salg_type) - 169 sa->salg_type[sizeof(sa->salg_type) - 1] = 0; 173 sa->salg_name[addr_len - sizeof(*sa) - 170 sa->salg_name[addr_len - sizeof(*sa) - 1] = 0; 174 171 175 type = alg_get_type(sa->salg_type); 172 type = alg_get_type(sa->salg_type); 176 if (PTR_ERR(type) == -ENOENT) { 173 if (PTR_ERR(type) == -ENOENT) { 177 request_module("algif-%s", sa- 174 request_module("algif-%s", sa->salg_type); 178 type = alg_get_type(sa->salg_t 175 type = alg_get_type(sa->salg_type); 179 } 176 } 180 177 181 if (IS_ERR(type)) 178 if (IS_ERR(type)) 182 return PTR_ERR(type); 179 return PTR_ERR(type); 183 180 184 private = type->bind(sa->salg_name, sa 181 private = type->bind(sa->salg_name, sa->salg_feat, sa->salg_mask); 185 if (IS_ERR(private)) { 182 if (IS_ERR(private)) { 186 module_put(type->owner); 183 module_put(type->owner); 187 return PTR_ERR(private); 184 return PTR_ERR(private); 188 } 185 } 189 186 190 err = -EBUSY; 187 err = -EBUSY; 191 lock_sock(sk); 188 lock_sock(sk); 192 if (atomic_read(&ask->refcnt)) 189 if (atomic_read(&ask->refcnt)) 193 goto unlock; 190 goto unlock; 194 191 195 swap(ask->type, type); 192 swap(ask->type, type); 196 swap(ask->private, private); 193 swap(ask->private, private); 197 194 198 err = 0; 195 err = 0; 199 196 200 unlock: 197 unlock: 201 release_sock(sk); 198 release_sock(sk); 202 199 203 alg_do_release(type, private); 200 alg_do_release(type, private); 204 201 205 return err; 202 return err; 206 } 203 } 207 204 208 static int alg_setkey(struct sock *sk, sockptr 205 static int alg_setkey(struct sock *sk, sockptr_t ukey, unsigned int keylen) 209 { 206 { 210 struct alg_sock *ask = alg_sk(sk); 207 struct alg_sock *ask = alg_sk(sk); 211 const struct af_alg_type *type = ask-> 208 const struct af_alg_type *type = ask->type; 212 u8 *key; 209 u8 *key; 213 int err; 210 int err; 214 211 215 key = sock_kmalloc(sk, keylen, GFP_KER 212 key = sock_kmalloc(sk, keylen, GFP_KERNEL); 216 if (!key) 213 if (!key) 217 return -ENOMEM; 214 return -ENOMEM; 218 215 219 err = -EFAULT; 216 err = -EFAULT; 220 if (copy_from_sockptr(key, ukey, keyle 217 if (copy_from_sockptr(key, ukey, keylen)) 221 goto out; 218 goto out; 222 219 223 err = type->setkey(ask->private, key, 220 err = type->setkey(ask->private, key, keylen); 224 221 225 out: 222 out: 226 sock_kzfree_s(sk, key, keylen); 223 sock_kzfree_s(sk, key, keylen); 227 224 228 return err; 225 return err; 229 } 226 } 230 227 231 #ifdef CONFIG_KEYS << 232 << 233 static const u8 *key_data_ptr_user(const struc << 234 unsigned in << 235 { << 236 const struct user_key_payload *ukp; << 237 << 238 ukp = user_key_payload_locked(key); << 239 if (IS_ERR_OR_NULL(ukp)) << 240 return ERR_PTR(-EKEYREVOKED); << 241 << 242 *datalen = key->datalen; << 243 << 244 return ukp->data; << 245 } << 246 << 247 static const u8 *key_data_ptr_encrypted(const << 248 unsign << 249 { << 250 const struct encrypted_key_payload *ek << 251 << 252 ekp = dereference_key_locked(key); << 253 if (IS_ERR_OR_NULL(ekp)) << 254 return ERR_PTR(-EKEYREVOKED); << 255 << 256 *datalen = ekp->decrypted_datalen; << 257 << 258 return ekp->decrypted_data; << 259 } << 260 << 261 static const u8 *key_data_ptr_trusted(const st << 262 unsigned << 263 { << 264 const struct trusted_key_payload *tkp; << 265 << 266 tkp = dereference_key_locked(key); << 267 if (IS_ERR_OR_NULL(tkp)) << 268 return ERR_PTR(-EKEYREVOKED); << 269 << 270 *datalen = tkp->key_len; << 271 << 272 return tkp->key; << 273 } << 274 << 275 static struct key *lookup_key(key_serial_t ser << 276 { << 277 key_ref_t key_ref; << 278 << 279 key_ref = lookup_user_key(serial, 0, K << 280 if (IS_ERR(key_ref)) << 281 return ERR_CAST(key_ref); << 282 << 283 return key_ref_to_ptr(key_ref); << 284 } << 285 << 286 static int alg_setkey_by_key_serial(struct alg << 287 unsigned i << 288 { << 289 const struct af_alg_type *type = ask-> << 290 u8 *key_data = NULL; << 291 unsigned int key_datalen; << 292 key_serial_t serial; << 293 struct key *key; << 294 const u8 *ret; << 295 int err; << 296 << 297 if (optlen != sizeof(serial)) << 298 return -EINVAL; << 299 << 300 if (copy_from_sockptr(&serial, optval, << 301 return -EFAULT; << 302 << 303 key = lookup_key(serial); << 304 if (IS_ERR(key)) << 305 return PTR_ERR(key); << 306 << 307 down_read(&key->sem); << 308 << 309 ret = ERR_PTR(-ENOPROTOOPT); << 310 if (!strcmp(key->type->name, "user") | << 311 !strcmp(key->type->name, "logon")) << 312 ret = key_data_ptr_user(key, & << 313 } else if (IS_REACHABLE(CONFIG_ENCRYPT << 314 !strcmp(key->type-> << 315 ret = key_data_ptr_encrypted(k << 316 } else if (IS_REACHABLE(CONFIG_TRUSTED << 317 !strcmp(key->type-> << 318 ret = key_data_ptr_trusted(key << 319 } << 320 << 321 if (IS_ERR(ret)) { << 322 up_read(&key->sem); << 323 key_put(key); << 324 return PTR_ERR(ret); << 325 } << 326 << 327 key_data = sock_kmalloc(&ask->sk, key_ << 328 if (!key_data) { << 329 up_read(&key->sem); << 330 key_put(key); << 331 return -ENOMEM; << 332 } << 333 << 334 memcpy(key_data, ret, key_datalen); << 335 << 336 up_read(&key->sem); << 337 key_put(key); << 338 << 339 err = type->setkey(ask->private, key_d << 340 << 341 sock_kzfree_s(&ask->sk, key_data, key_ << 342 << 343 return err; << 344 } << 345 << 346 #else << 347 << 348 static inline int alg_setkey_by_key_serial(str << 349 soc << 350 uns << 351 { << 352 return -ENOPROTOOPT; << 353 } << 354 << 355 #endif << 356 << 357 static int alg_setsockopt(struct socket *sock, 228 static int alg_setsockopt(struct socket *sock, int level, int optname, 358 sockptr_t optval, un 229 sockptr_t optval, unsigned int optlen) 359 { 230 { 360 struct sock *sk = sock->sk; 231 struct sock *sk = sock->sk; 361 struct alg_sock *ask = alg_sk(sk); 232 struct alg_sock *ask = alg_sk(sk); 362 const struct af_alg_type *type; 233 const struct af_alg_type *type; 363 int err = -EBUSY; 234 int err = -EBUSY; 364 235 365 lock_sock(sk); 236 lock_sock(sk); 366 if (atomic_read(&ask->refcnt) != atomi 237 if (atomic_read(&ask->refcnt) != atomic_read(&ask->nokey_refcnt)) 367 goto unlock; 238 goto unlock; 368 239 369 type = ask->type; 240 type = ask->type; 370 241 371 err = -ENOPROTOOPT; 242 err = -ENOPROTOOPT; 372 if (level != SOL_ALG || !type) 243 if (level != SOL_ALG || !type) 373 goto unlock; 244 goto unlock; 374 245 375 switch (optname) { 246 switch (optname) { 376 case ALG_SET_KEY: 247 case ALG_SET_KEY: 377 case ALG_SET_KEY_BY_KEY_SERIAL: << 378 if (sock->state == SS_CONNECTE 248 if (sock->state == SS_CONNECTED) 379 goto unlock; 249 goto unlock; 380 if (!type->setkey) 250 if (!type->setkey) 381 goto unlock; 251 goto unlock; 382 252 383 if (optname == ALG_SET_KEY_BY_ !! 253 err = alg_setkey(sk, optval, optlen); 384 err = alg_setkey_by_ke << 385 else << 386 err = alg_setkey(sk, o << 387 break; 254 break; 388 case ALG_SET_AEAD_AUTHSIZE: 255 case ALG_SET_AEAD_AUTHSIZE: 389 if (sock->state == SS_CONNECTE 256 if (sock->state == SS_CONNECTED) 390 goto unlock; 257 goto unlock; 391 if (!type->setauthsize) 258 if (!type->setauthsize) 392 goto unlock; 259 goto unlock; 393 err = type->setauthsize(ask->p 260 err = type->setauthsize(ask->private, optlen); 394 break; 261 break; 395 case ALG_SET_DRBG_ENTROPY: 262 case ALG_SET_DRBG_ENTROPY: 396 if (sock->state == SS_CONNECTE 263 if (sock->state == SS_CONNECTED) 397 goto unlock; 264 goto unlock; 398 if (!type->setentropy) 265 if (!type->setentropy) 399 goto unlock; 266 goto unlock; 400 267 401 err = type->setentropy(ask->pr 268 err = type->setentropy(ask->private, optval, optlen); 402 } 269 } 403 270 404 unlock: 271 unlock: 405 release_sock(sk); 272 release_sock(sk); 406 273 407 return err; 274 return err; 408 } 275 } 409 276 410 int af_alg_accept(struct sock *sk, struct sock !! 277 int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern) 411 struct proto_accept_arg *arg << 412 { 278 { 413 struct alg_sock *ask = alg_sk(sk); 279 struct alg_sock *ask = alg_sk(sk); 414 const struct af_alg_type *type; 280 const struct af_alg_type *type; 415 struct sock *sk2; 281 struct sock *sk2; 416 unsigned int nokey; 282 unsigned int nokey; 417 int err; 283 int err; 418 284 419 lock_sock(sk); 285 lock_sock(sk); 420 type = ask->type; 286 type = ask->type; 421 287 422 err = -EINVAL; 288 err = -EINVAL; 423 if (!type) 289 if (!type) 424 goto unlock; 290 goto unlock; 425 291 426 sk2 = sk_alloc(sock_net(sk), PF_ALG, G !! 292 sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto, kern); 427 err = -ENOMEM; 293 err = -ENOMEM; 428 if (!sk2) 294 if (!sk2) 429 goto unlock; 295 goto unlock; 430 296 431 sock_init_data(newsock, sk2); 297 sock_init_data(newsock, sk2); 432 security_sock_graft(sk2, newsock); 298 security_sock_graft(sk2, newsock); 433 security_sk_clone(sk, sk2); 299 security_sk_clone(sk, sk2); 434 300 435 /* 301 /* 436 * newsock->ops assigned here to allow 302 * newsock->ops assigned here to allow type->accept call to override 437 * them when required. 303 * them when required. 438 */ 304 */ 439 newsock->ops = type->ops; 305 newsock->ops = type->ops; 440 err = type->accept(ask->private, sk2); 306 err = type->accept(ask->private, sk2); 441 307 442 nokey = err == -ENOKEY; 308 nokey = err == -ENOKEY; 443 if (nokey && type->accept_nokey) 309 if (nokey && type->accept_nokey) 444 err = type->accept_nokey(ask-> 310 err = type->accept_nokey(ask->private, sk2); 445 311 446 if (err) 312 if (err) 447 goto unlock; 313 goto unlock; 448 314 449 if (atomic_inc_return_relaxed(&ask->re 315 if (atomic_inc_return_relaxed(&ask->refcnt) == 1) 450 sock_hold(sk); 316 sock_hold(sk); 451 if (nokey) { 317 if (nokey) { 452 atomic_inc(&ask->nokey_refcnt) 318 atomic_inc(&ask->nokey_refcnt); 453 atomic_set(&alg_sk(sk2)->nokey 319 atomic_set(&alg_sk(sk2)->nokey_refcnt, 1); 454 } 320 } 455 alg_sk(sk2)->parent = sk; 321 alg_sk(sk2)->parent = sk; 456 alg_sk(sk2)->type = type; 322 alg_sk(sk2)->type = type; 457 323 458 newsock->state = SS_CONNECTED; 324 newsock->state = SS_CONNECTED; 459 325 460 if (nokey) 326 if (nokey) 461 newsock->ops = type->ops_nokey 327 newsock->ops = type->ops_nokey; 462 328 463 err = 0; 329 err = 0; 464 330 465 unlock: 331 unlock: 466 release_sock(sk); 332 release_sock(sk); 467 333 468 return err; 334 return err; 469 } 335 } 470 EXPORT_SYMBOL_GPL(af_alg_accept); 336 EXPORT_SYMBOL_GPL(af_alg_accept); 471 337 472 static int alg_accept(struct socket *sock, str !! 338 static int alg_accept(struct socket *sock, struct socket *newsock, int flags, 473 struct proto_accept_arg !! 339 bool kern) 474 { 340 { 475 return af_alg_accept(sock->sk, newsock !! 341 return af_alg_accept(sock->sk, newsock, kern); 476 } 342 } 477 343 478 static const struct proto_ops alg_proto_ops = 344 static const struct proto_ops alg_proto_ops = { 479 .family = PF_ALG, 345 .family = PF_ALG, 480 .owner = THIS_MODULE, 346 .owner = THIS_MODULE, 481 347 482 .connect = sock_no_connec 348 .connect = sock_no_connect, 483 .socketpair = sock_no_socket 349 .socketpair = sock_no_socketpair, 484 .getname = sock_no_getnam 350 .getname = sock_no_getname, 485 .ioctl = sock_no_ioctl, 351 .ioctl = sock_no_ioctl, 486 .listen = sock_no_listen 352 .listen = sock_no_listen, 487 .shutdown = sock_no_shutdo 353 .shutdown = sock_no_shutdown, 488 .mmap = sock_no_mmap, 354 .mmap = sock_no_mmap, >> 355 .sendpage = sock_no_sendpage, 489 .sendmsg = sock_no_sendms 356 .sendmsg = sock_no_sendmsg, 490 .recvmsg = sock_no_recvms 357 .recvmsg = sock_no_recvmsg, 491 358 492 .bind = alg_bind, 359 .bind = alg_bind, 493 .release = af_alg_release 360 .release = af_alg_release, 494 .setsockopt = alg_setsockopt 361 .setsockopt = alg_setsockopt, 495 .accept = alg_accept, 362 .accept = alg_accept, 496 }; 363 }; 497 364 498 static void alg_sock_destruct(struct sock *sk) 365 static void alg_sock_destruct(struct sock *sk) 499 { 366 { 500 struct alg_sock *ask = alg_sk(sk); 367 struct alg_sock *ask = alg_sk(sk); 501 368 502 alg_do_release(ask->type, ask->private 369 alg_do_release(ask->type, ask->private); 503 } 370 } 504 371 505 static int alg_create(struct net *net, struct 372 static int alg_create(struct net *net, struct socket *sock, int protocol, 506 int kern) 373 int kern) 507 { 374 { 508 struct sock *sk; 375 struct sock *sk; 509 int err; 376 int err; 510 377 511 if (sock->type != SOCK_SEQPACKET) 378 if (sock->type != SOCK_SEQPACKET) 512 return -ESOCKTNOSUPPORT; 379 return -ESOCKTNOSUPPORT; 513 if (protocol != 0) 380 if (protocol != 0) 514 return -EPROTONOSUPPORT; 381 return -EPROTONOSUPPORT; 515 382 516 err = -ENOMEM; 383 err = -ENOMEM; 517 sk = sk_alloc(net, PF_ALG, GFP_KERNEL, 384 sk = sk_alloc(net, PF_ALG, GFP_KERNEL, &alg_proto, kern); 518 if (!sk) 385 if (!sk) 519 goto out; 386 goto out; 520 387 521 sock->ops = &alg_proto_ops; 388 sock->ops = &alg_proto_ops; 522 sock_init_data(sock, sk); 389 sock_init_data(sock, sk); 523 390 524 sk->sk_destruct = alg_sock_destruct; 391 sk->sk_destruct = alg_sock_destruct; 525 392 526 return 0; 393 return 0; 527 out: 394 out: 528 return err; 395 return err; 529 } 396 } 530 397 531 static const struct net_proto_family alg_famil 398 static const struct net_proto_family alg_family = { 532 .family = PF_ALG, 399 .family = PF_ALG, 533 .create = alg_create, 400 .create = alg_create, 534 .owner = THIS_MODULE, 401 .owner = THIS_MODULE, 535 }; 402 }; 536 403 >> 404 int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len) >> 405 { >> 406 size_t off; >> 407 ssize_t n; >> 408 int npages, i; >> 409 >> 410 n = iov_iter_get_pages(iter, sgl->pages, len, ALG_MAX_PAGES, &off); >> 411 if (n < 0) >> 412 return n; >> 413 >> 414 npages = DIV_ROUND_UP(off + n, PAGE_SIZE); >> 415 if (WARN_ON(npages == 0)) >> 416 return -EINVAL; >> 417 /* Add one extra for linking */ >> 418 sg_init_table(sgl->sg, npages + 1); >> 419 >> 420 for (i = 0, len = n; i < npages; i++) { >> 421 int plen = min_t(int, len, PAGE_SIZE - off); >> 422 >> 423 sg_set_page(sgl->sg + i, sgl->pages[i], plen, off); >> 424 >> 425 off = 0; >> 426 len -= plen; >> 427 } >> 428 sg_mark_end(sgl->sg + npages - 1); >> 429 sgl->npages = npages; >> 430 >> 431 return n; >> 432 } >> 433 EXPORT_SYMBOL_GPL(af_alg_make_sg); >> 434 537 static void af_alg_link_sg(struct af_alg_sgl * 435 static void af_alg_link_sg(struct af_alg_sgl *sgl_prev, 538 struct af_alg_sgl * 436 struct af_alg_sgl *sgl_new) 539 { 437 { 540 sg_unmark_end(sgl_prev->sgt.sgl + sgl_ !! 438 sg_unmark_end(sgl_prev->sg + sgl_prev->npages - 1); 541 sg_chain(sgl_prev->sgt.sgl, sgl_prev-> !! 439 sg_chain(sgl_prev->sg, sgl_prev->npages + 1, sgl_new->sg); 542 } 440 } 543 441 544 void af_alg_free_sg(struct af_alg_sgl *sgl) 442 void af_alg_free_sg(struct af_alg_sgl *sgl) 545 { 443 { 546 int i; 444 int i; 547 445 548 if (sgl->sgt.sgl) { !! 446 for (i = 0; i < sgl->npages; i++) 549 if (sgl->need_unpin) !! 447 put_page(sgl->pages[i]); 550 for (i = 0; i < sgl->s << 551 unpin_user_pag << 552 if (sgl->sgt.sgl != sgl->sgl) << 553 kvfree(sgl->sgt.sgl); << 554 sgl->sgt.sgl = NULL; << 555 } << 556 } 448 } 557 EXPORT_SYMBOL_GPL(af_alg_free_sg); 449 EXPORT_SYMBOL_GPL(af_alg_free_sg); 558 450 559 static int af_alg_cmsg_send(struct msghdr *msg 451 static int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con) 560 { 452 { 561 struct cmsghdr *cmsg; 453 struct cmsghdr *cmsg; 562 454 563 for_each_cmsghdr(cmsg, msg) { 455 for_each_cmsghdr(cmsg, msg) { 564 if (!CMSG_OK(msg, cmsg)) 456 if (!CMSG_OK(msg, cmsg)) 565 return -EINVAL; 457 return -EINVAL; 566 if (cmsg->cmsg_level != SOL_AL 458 if (cmsg->cmsg_level != SOL_ALG) 567 continue; 459 continue; 568 460 569 switch (cmsg->cmsg_type) { 461 switch (cmsg->cmsg_type) { 570 case ALG_SET_IV: 462 case ALG_SET_IV: 571 if (cmsg->cmsg_len < C 463 if (cmsg->cmsg_len < CMSG_LEN(sizeof(*con->iv))) 572 return -EINVAL 464 return -EINVAL; 573 con->iv = (void *)CMSG 465 con->iv = (void *)CMSG_DATA(cmsg); 574 if (cmsg->cmsg_len < C 466 if (cmsg->cmsg_len < CMSG_LEN(con->iv->ivlen + 575 467 sizeof(*con->iv))) 576 return -EINVAL 468 return -EINVAL; 577 break; 469 break; 578 470 579 case ALG_SET_OP: 471 case ALG_SET_OP: 580 if (cmsg->cmsg_len < C 472 if (cmsg->cmsg_len < CMSG_LEN(sizeof(u32))) 581 return -EINVAL 473 return -EINVAL; 582 con->op = *(u32 *)CMSG 474 con->op = *(u32 *)CMSG_DATA(cmsg); 583 break; 475 break; 584 476 585 case ALG_SET_AEAD_ASSOCLEN: 477 case ALG_SET_AEAD_ASSOCLEN: 586 if (cmsg->cmsg_len < C 478 if (cmsg->cmsg_len < CMSG_LEN(sizeof(u32))) 587 return -EINVAL 479 return -EINVAL; 588 con->aead_assoclen = * 480 con->aead_assoclen = *(u32 *)CMSG_DATA(cmsg); 589 break; 481 break; 590 482 591 default: 483 default: 592 return -EINVAL; 484 return -EINVAL; 593 } 485 } 594 } 486 } 595 487 596 return 0; 488 return 0; 597 } 489 } 598 490 599 /** 491 /** 600 * af_alg_alloc_tsgl - allocate the TX SGL 492 * af_alg_alloc_tsgl - allocate the TX SGL 601 * 493 * 602 * @sk: socket of connection to user space 494 * @sk: socket of connection to user space 603 * Return: 0 upon success, < 0 upon error 495 * Return: 0 upon success, < 0 upon error 604 */ 496 */ 605 static int af_alg_alloc_tsgl(struct sock *sk) 497 static int af_alg_alloc_tsgl(struct sock *sk) 606 { 498 { 607 struct alg_sock *ask = alg_sk(sk); 499 struct alg_sock *ask = alg_sk(sk); 608 struct af_alg_ctx *ctx = ask->private; 500 struct af_alg_ctx *ctx = ask->private; 609 struct af_alg_tsgl *sgl; 501 struct af_alg_tsgl *sgl; 610 struct scatterlist *sg = NULL; 502 struct scatterlist *sg = NULL; 611 503 612 sgl = list_entry(ctx->tsgl_list.prev, 504 sgl = list_entry(ctx->tsgl_list.prev, struct af_alg_tsgl, list); 613 if (!list_empty(&ctx->tsgl_list)) 505 if (!list_empty(&ctx->tsgl_list)) 614 sg = sgl->sg; 506 sg = sgl->sg; 615 507 616 if (!sg || sgl->cur >= MAX_SGL_ENTS) { 508 if (!sg || sgl->cur >= MAX_SGL_ENTS) { 617 sgl = sock_kmalloc(sk, 509 sgl = sock_kmalloc(sk, 618 struct_size 510 struct_size(sgl, sg, (MAX_SGL_ENTS + 1)), 619 GFP_KERNEL) 511 GFP_KERNEL); 620 if (!sgl) 512 if (!sgl) 621 return -ENOMEM; 513 return -ENOMEM; 622 514 623 sg_init_table(sgl->sg, MAX_SGL 515 sg_init_table(sgl->sg, MAX_SGL_ENTS + 1); 624 sgl->cur = 0; 516 sgl->cur = 0; 625 517 626 if (sg) 518 if (sg) 627 sg_chain(sg, MAX_SGL_E 519 sg_chain(sg, MAX_SGL_ENTS + 1, sgl->sg); 628 520 629 list_add_tail(&sgl->list, &ctx 521 list_add_tail(&sgl->list, &ctx->tsgl_list); 630 } 522 } 631 523 632 return 0; 524 return 0; 633 } 525 } 634 526 635 /** 527 /** 636 * af_alg_count_tsgl - Count number of TX SG e 528 * af_alg_count_tsgl - Count number of TX SG entries 637 * 529 * 638 * The counting starts from the beginning of t 530 * The counting starts from the beginning of the SGL to @bytes. If 639 * an @offset is provided, the counting of the 531 * an @offset is provided, the counting of the SG entries starts at the @offset. 640 * 532 * 641 * @sk: socket of connection to user space 533 * @sk: socket of connection to user space 642 * @bytes: Count the number of SG entries hold 534 * @bytes: Count the number of SG entries holding given number of bytes. 643 * @offset: Start the counting of SG entries f 535 * @offset: Start the counting of SG entries from the given offset. 644 * Return: Number of TX SG entries found given 536 * Return: Number of TX SG entries found given the constraints 645 */ 537 */ 646 unsigned int af_alg_count_tsgl(struct sock *sk 538 unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset) 647 { 539 { 648 const struct alg_sock *ask = alg_sk(sk 540 const struct alg_sock *ask = alg_sk(sk); 649 const struct af_alg_ctx *ctx = ask->pr 541 const struct af_alg_ctx *ctx = ask->private; 650 const struct af_alg_tsgl *sgl; 542 const struct af_alg_tsgl *sgl; 651 unsigned int i; 543 unsigned int i; 652 unsigned int sgl_count = 0; 544 unsigned int sgl_count = 0; 653 545 654 if (!bytes) 546 if (!bytes) 655 return 0; 547 return 0; 656 548 657 list_for_each_entry(sgl, &ctx->tsgl_li 549 list_for_each_entry(sgl, &ctx->tsgl_list, list) { 658 const struct scatterlist *sg = 550 const struct scatterlist *sg = sgl->sg; 659 551 660 for (i = 0; i < sgl->cur; i++) 552 for (i = 0; i < sgl->cur; i++) { 661 size_t bytes_count; 553 size_t bytes_count; 662 554 663 /* Skip offset */ 555 /* Skip offset */ 664 if (offset >= sg[i].le 556 if (offset >= sg[i].length) { 665 offset -= sg[i 557 offset -= sg[i].length; 666 bytes -= sg[i] 558 bytes -= sg[i].length; 667 continue; 559 continue; 668 } 560 } 669 561 670 bytes_count = sg[i].le 562 bytes_count = sg[i].length - offset; 671 563 672 offset = 0; 564 offset = 0; 673 sgl_count++; 565 sgl_count++; 674 566 675 /* If we have seen req 567 /* If we have seen requested number of bytes, stop */ 676 if (bytes_count >= byt 568 if (bytes_count >= bytes) 677 return sgl_cou 569 return sgl_count; 678 570 679 bytes -= bytes_count; 571 bytes -= bytes_count; 680 } 572 } 681 } 573 } 682 574 683 return sgl_count; 575 return sgl_count; 684 } 576 } 685 EXPORT_SYMBOL_GPL(af_alg_count_tsgl); 577 EXPORT_SYMBOL_GPL(af_alg_count_tsgl); 686 578 687 /** 579 /** 688 * af_alg_pull_tsgl - Release the specified bu 580 * af_alg_pull_tsgl - Release the specified buffers from TX SGL 689 * 581 * 690 * If @dst is non-null, reassign the pages to 582 * If @dst is non-null, reassign the pages to @dst. The caller must release 691 * the pages. If @dst_offset is given only rea 583 * the pages. If @dst_offset is given only reassign the pages to @dst starting 692 * at the @dst_offset (byte). The caller must 584 * at the @dst_offset (byte). The caller must ensure that @dst is large 693 * enough (e.g. by using af_alg_count_tsgl wit 585 * enough (e.g. by using af_alg_count_tsgl with the same offset). 694 * 586 * 695 * @sk: socket of connection to user space 587 * @sk: socket of connection to user space 696 * @used: Number of bytes to pull from TX SGL 588 * @used: Number of bytes to pull from TX SGL 697 * @dst: If non-NULL, buffer is reassigned to 589 * @dst: If non-NULL, buffer is reassigned to dst SGL instead of releasing. The 698 * caller must release the buffers in ds 590 * caller must release the buffers in dst. 699 * @dst_offset: Reassign the TX SGL from given 591 * @dst_offset: Reassign the TX SGL from given offset. All buffers before 700 * reaching the offset is release 592 * reaching the offset is released. 701 */ 593 */ 702 void af_alg_pull_tsgl(struct sock *sk, size_t 594 void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst, 703 size_t dst_offset) 595 size_t dst_offset) 704 { 596 { 705 struct alg_sock *ask = alg_sk(sk); 597 struct alg_sock *ask = alg_sk(sk); 706 struct af_alg_ctx *ctx = ask->private; 598 struct af_alg_ctx *ctx = ask->private; 707 struct af_alg_tsgl *sgl; 599 struct af_alg_tsgl *sgl; 708 struct scatterlist *sg; 600 struct scatterlist *sg; 709 unsigned int i, j = 0; 601 unsigned int i, j = 0; 710 602 711 while (!list_empty(&ctx->tsgl_list)) { 603 while (!list_empty(&ctx->tsgl_list)) { 712 sgl = list_first_entry(&ctx->t 604 sgl = list_first_entry(&ctx->tsgl_list, struct af_alg_tsgl, 713 list); 605 list); 714 sg = sgl->sg; 606 sg = sgl->sg; 715 607 716 for (i = 0; i < sgl->cur; i++) 608 for (i = 0; i < sgl->cur; i++) { 717 size_t plen = min_t(si 609 size_t plen = min_t(size_t, used, sg[i].length); 718 struct page *page = sg 610 struct page *page = sg_page(sg + i); 719 611 720 if (!page) 612 if (!page) 721 continue; 613 continue; 722 614 723 /* 615 /* 724 * Assumption: caller 616 * Assumption: caller created af_alg_count_tsgl(len) 725 * SG entries in dst. 617 * SG entries in dst. 726 */ 618 */ 727 if (dst) { 619 if (dst) { 728 if (dst_offset 620 if (dst_offset >= plen) { 729 /* dis 621 /* discard page before offset */ 730 dst_of 622 dst_offset -= plen; 731 } else { 623 } else { 732 /* rea 624 /* reassign page to dst after offset */ 733 get_pa 625 get_page(page); 734 sg_set 626 sg_set_page(dst + j, page, 735 627 plen - dst_offset, 736 628 sg[i].offset + dst_offset); 737 dst_of 629 dst_offset = 0; 738 j++; 630 j++; 739 } 631 } 740 } 632 } 741 633 742 sg[i].length -= plen; 634 sg[i].length -= plen; 743 sg[i].offset += plen; 635 sg[i].offset += plen; 744 636 745 used -= plen; 637 used -= plen; 746 ctx->used -= plen; 638 ctx->used -= plen; 747 639 748 if (sg[i].length) 640 if (sg[i].length) 749 return; 641 return; 750 642 751 put_page(page); 643 put_page(page); 752 sg_assign_page(sg + i, 644 sg_assign_page(sg + i, NULL); 753 } 645 } 754 646 755 list_del(&sgl->list); 647 list_del(&sgl->list); 756 sock_kfree_s(sk, sgl, struct_s 648 sock_kfree_s(sk, sgl, struct_size(sgl, sg, MAX_SGL_ENTS + 1)); 757 } 649 } 758 650 759 if (!ctx->used) 651 if (!ctx->used) 760 ctx->merge = 0; 652 ctx->merge = 0; 761 ctx->init = ctx->more; 653 ctx->init = ctx->more; 762 } 654 } 763 EXPORT_SYMBOL_GPL(af_alg_pull_tsgl); 655 EXPORT_SYMBOL_GPL(af_alg_pull_tsgl); 764 656 765 /** 657 /** 766 * af_alg_free_areq_sgls - Release TX and RX S 658 * af_alg_free_areq_sgls - Release TX and RX SGLs of the request 767 * 659 * 768 * @areq: Request holding the TX and RX SGL 660 * @areq: Request holding the TX and RX SGL 769 */ 661 */ 770 static void af_alg_free_areq_sgls(struct af_al 662 static void af_alg_free_areq_sgls(struct af_alg_async_req *areq) 771 { 663 { 772 struct sock *sk = areq->sk; 664 struct sock *sk = areq->sk; 773 struct alg_sock *ask = alg_sk(sk); 665 struct alg_sock *ask = alg_sk(sk); 774 struct af_alg_ctx *ctx = ask->private; 666 struct af_alg_ctx *ctx = ask->private; 775 struct af_alg_rsgl *rsgl, *tmp; 667 struct af_alg_rsgl *rsgl, *tmp; 776 struct scatterlist *tsgl; 668 struct scatterlist *tsgl; 777 struct scatterlist *sg; 669 struct scatterlist *sg; 778 unsigned int i; 670 unsigned int i; 779 671 780 list_for_each_entry_safe(rsgl, tmp, &a 672 list_for_each_entry_safe(rsgl, tmp, &areq->rsgl_list, list) { 781 atomic_sub(rsgl->sg_num_bytes, 673 atomic_sub(rsgl->sg_num_bytes, &ctx->rcvused); 782 af_alg_free_sg(&rsgl->sgl); 674 af_alg_free_sg(&rsgl->sgl); 783 list_del(&rsgl->list); 675 list_del(&rsgl->list); 784 if (rsgl != &areq->first_rsgl) 676 if (rsgl != &areq->first_rsgl) 785 sock_kfree_s(sk, rsgl, 677 sock_kfree_s(sk, rsgl, sizeof(*rsgl)); 786 } 678 } 787 679 788 tsgl = areq->tsgl; 680 tsgl = areq->tsgl; 789 if (tsgl) { 681 if (tsgl) { 790 for_each_sg(tsgl, sg, areq->ts 682 for_each_sg(tsgl, sg, areq->tsgl_entries, i) { 791 if (!sg_page(sg)) 683 if (!sg_page(sg)) 792 continue; 684 continue; 793 put_page(sg_page(sg)); 685 put_page(sg_page(sg)); 794 } 686 } 795 687 796 sock_kfree_s(sk, tsgl, areq->t 688 sock_kfree_s(sk, tsgl, areq->tsgl_entries * sizeof(*tsgl)); 797 } 689 } 798 } 690 } 799 691 800 /** 692 /** 801 * af_alg_wait_for_wmem - wait for availabilit 693 * af_alg_wait_for_wmem - wait for availability of writable memory 802 * 694 * 803 * @sk: socket of connection to user space 695 * @sk: socket of connection to user space 804 * @flags: If MSG_DONTWAIT is set, then only r 696 * @flags: If MSG_DONTWAIT is set, then only report if function would sleep 805 * Return: 0 when writable memory is available 697 * Return: 0 when writable memory is available, < 0 upon error 806 */ 698 */ 807 static int af_alg_wait_for_wmem(struct sock *s 699 static int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags) 808 { 700 { 809 DEFINE_WAIT_FUNC(wait, woken_wake_func 701 DEFINE_WAIT_FUNC(wait, woken_wake_function); 810 int err = -ERESTARTSYS; 702 int err = -ERESTARTSYS; 811 long timeout; 703 long timeout; 812 704 813 if (flags & MSG_DONTWAIT) 705 if (flags & MSG_DONTWAIT) 814 return -EAGAIN; 706 return -EAGAIN; 815 707 816 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); 708 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); 817 709 818 add_wait_queue(sk_sleep(sk), &wait); 710 add_wait_queue(sk_sleep(sk), &wait); 819 for (;;) { 711 for (;;) { 820 if (signal_pending(current)) 712 if (signal_pending(current)) 821 break; 713 break; 822 timeout = MAX_SCHEDULE_TIMEOUT 714 timeout = MAX_SCHEDULE_TIMEOUT; 823 if (sk_wait_event(sk, &timeout 715 if (sk_wait_event(sk, &timeout, af_alg_writable(sk), &wait)) { 824 err = 0; 716 err = 0; 825 break; 717 break; 826 } 718 } 827 } 719 } 828 remove_wait_queue(sk_sleep(sk), &wait) 720 remove_wait_queue(sk_sleep(sk), &wait); 829 721 830 return err; 722 return err; 831 } 723 } 832 724 833 /** 725 /** 834 * af_alg_wmem_wakeup - wakeup caller when wri 726 * af_alg_wmem_wakeup - wakeup caller when writable memory is available 835 * 727 * 836 * @sk: socket of connection to user space 728 * @sk: socket of connection to user space 837 */ 729 */ 838 void af_alg_wmem_wakeup(struct sock *sk) 730 void af_alg_wmem_wakeup(struct sock *sk) 839 { 731 { 840 struct socket_wq *wq; 732 struct socket_wq *wq; 841 733 842 if (!af_alg_writable(sk)) 734 if (!af_alg_writable(sk)) 843 return; 735 return; 844 736 845 rcu_read_lock(); 737 rcu_read_lock(); 846 wq = rcu_dereference(sk->sk_wq); 738 wq = rcu_dereference(sk->sk_wq); 847 if (skwq_has_sleeper(wq)) 739 if (skwq_has_sleeper(wq)) 848 wake_up_interruptible_sync_pol 740 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | 849 741 EPOLLRDNORM | 850 742 EPOLLRDBAND); 851 sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, !! 743 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); 852 rcu_read_unlock(); 744 rcu_read_unlock(); 853 } 745 } 854 EXPORT_SYMBOL_GPL(af_alg_wmem_wakeup); 746 EXPORT_SYMBOL_GPL(af_alg_wmem_wakeup); 855 747 856 /** 748 /** 857 * af_alg_wait_for_data - wait for availabilit 749 * af_alg_wait_for_data - wait for availability of TX data 858 * 750 * 859 * @sk: socket of connection to user space 751 * @sk: socket of connection to user space 860 * @flags: If MSG_DONTWAIT is set, then only r 752 * @flags: If MSG_DONTWAIT is set, then only report if function would sleep 861 * @min: Set to minimum request size if partia 753 * @min: Set to minimum request size if partial requests are allowed. 862 * Return: 0 when writable memory is available 754 * Return: 0 when writable memory is available, < 0 upon error 863 */ 755 */ 864 int af_alg_wait_for_data(struct sock *sk, unsi 756 int af_alg_wait_for_data(struct sock *sk, unsigned flags, unsigned min) 865 { 757 { 866 DEFINE_WAIT_FUNC(wait, woken_wake_func 758 DEFINE_WAIT_FUNC(wait, woken_wake_function); 867 struct alg_sock *ask = alg_sk(sk); 759 struct alg_sock *ask = alg_sk(sk); 868 struct af_alg_ctx *ctx = ask->private; 760 struct af_alg_ctx *ctx = ask->private; 869 long timeout; 761 long timeout; 870 int err = -ERESTARTSYS; 762 int err = -ERESTARTSYS; 871 763 872 if (flags & MSG_DONTWAIT) 764 if (flags & MSG_DONTWAIT) 873 return -EAGAIN; 765 return -EAGAIN; 874 766 875 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); 767 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); 876 768 877 add_wait_queue(sk_sleep(sk), &wait); 769 add_wait_queue(sk_sleep(sk), &wait); 878 for (;;) { 770 for (;;) { 879 if (signal_pending(current)) 771 if (signal_pending(current)) 880 break; 772 break; 881 timeout = MAX_SCHEDULE_TIMEOUT 773 timeout = MAX_SCHEDULE_TIMEOUT; 882 if (sk_wait_event(sk, &timeout 774 if (sk_wait_event(sk, &timeout, 883 ctx->init && 775 ctx->init && (!ctx->more || 884 776 (min && ctx->used >= min)), 885 &wait)) { 777 &wait)) { 886 err = 0; 778 err = 0; 887 break; 779 break; 888 } 780 } 889 } 781 } 890 remove_wait_queue(sk_sleep(sk), &wait) 782 remove_wait_queue(sk_sleep(sk), &wait); 891 783 892 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk 784 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); 893 785 894 return err; 786 return err; 895 } 787 } 896 EXPORT_SYMBOL_GPL(af_alg_wait_for_data); 788 EXPORT_SYMBOL_GPL(af_alg_wait_for_data); 897 789 898 /** 790 /** 899 * af_alg_data_wakeup - wakeup caller when new 791 * af_alg_data_wakeup - wakeup caller when new data can be sent to kernel 900 * 792 * 901 * @sk: socket of connection to user space 793 * @sk: socket of connection to user space 902 */ 794 */ 903 static void af_alg_data_wakeup(struct sock *sk 795 static void af_alg_data_wakeup(struct sock *sk) 904 { 796 { 905 struct alg_sock *ask = alg_sk(sk); 797 struct alg_sock *ask = alg_sk(sk); 906 struct af_alg_ctx *ctx = ask->private; 798 struct af_alg_ctx *ctx = ask->private; 907 struct socket_wq *wq; 799 struct socket_wq *wq; 908 800 909 if (!ctx->used) 801 if (!ctx->used) 910 return; 802 return; 911 803 912 rcu_read_lock(); 804 rcu_read_lock(); 913 wq = rcu_dereference(sk->sk_wq); 805 wq = rcu_dereference(sk->sk_wq); 914 if (skwq_has_sleeper(wq)) 806 if (skwq_has_sleeper(wq)) 915 wake_up_interruptible_sync_pol 807 wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | 916 808 EPOLLRDNORM | 917 809 EPOLLRDBAND); 918 sk_wake_async_rcu(sk, SOCK_WAKE_SPACE, !! 810 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); 919 rcu_read_unlock(); 811 rcu_read_unlock(); 920 } 812 } 921 813 922 /** 814 /** 923 * af_alg_sendmsg - implementation of sendmsg 815 * af_alg_sendmsg - implementation of sendmsg system call handler 924 * 816 * 925 * The sendmsg system call handler obtains the 817 * The sendmsg system call handler obtains the user data and stores it 926 * in ctx->tsgl_list. This implies allocation 818 * in ctx->tsgl_list. This implies allocation of the required numbers of 927 * struct af_alg_tsgl. 819 * struct af_alg_tsgl. 928 * 820 * 929 * In addition, the ctx is filled with the inf 821 * In addition, the ctx is filled with the information sent via CMSG. 930 * 822 * 931 * @sock: socket of connection to user space 823 * @sock: socket of connection to user space 932 * @msg: message from user space 824 * @msg: message from user space 933 * @size: size of message from user space 825 * @size: size of message from user space 934 * @ivsize: the size of the IV for the cipher 826 * @ivsize: the size of the IV for the cipher operation to verify that the 935 * user-space-provided IV has the righ 827 * user-space-provided IV has the right size 936 * Return: the number of copied data upon succ 828 * Return: the number of copied data upon success, < 0 upon error 937 */ 829 */ 938 int af_alg_sendmsg(struct socket *sock, struct 830 int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, 939 unsigned int ivsize) 831 unsigned int ivsize) 940 { 832 { 941 struct sock *sk = sock->sk; 833 struct sock *sk = sock->sk; 942 struct alg_sock *ask = alg_sk(sk); 834 struct alg_sock *ask = alg_sk(sk); 943 struct af_alg_ctx *ctx = ask->private; 835 struct af_alg_ctx *ctx = ask->private; 944 struct af_alg_tsgl *sgl; 836 struct af_alg_tsgl *sgl; 945 struct af_alg_control con = {}; 837 struct af_alg_control con = {}; 946 long copied = 0; 838 long copied = 0; 947 bool enc = false; 839 bool enc = false; 948 bool init = false; 840 bool init = false; 949 int err = 0; 841 int err = 0; 950 842 951 if (msg->msg_controllen) { 843 if (msg->msg_controllen) { 952 err = af_alg_cmsg_send(msg, &c 844 err = af_alg_cmsg_send(msg, &con); 953 if (err) 845 if (err) 954 return err; 846 return err; 955 847 956 init = true; 848 init = true; 957 switch (con.op) { 849 switch (con.op) { 958 case ALG_OP_ENCRYPT: 850 case ALG_OP_ENCRYPT: 959 enc = true; 851 enc = true; 960 break; 852 break; 961 case ALG_OP_DECRYPT: 853 case ALG_OP_DECRYPT: 962 enc = false; 854 enc = false; 963 break; 855 break; 964 default: 856 default: 965 return -EINVAL; 857 return -EINVAL; 966 } 858 } 967 859 968 if (con.iv && con.iv->ivlen != 860 if (con.iv && con.iv->ivlen != ivsize) 969 return -EINVAL; 861 return -EINVAL; 970 } 862 } 971 863 972 lock_sock(sk); 864 lock_sock(sk); 973 if (ctx->init && !ctx->more) { 865 if (ctx->init && !ctx->more) { 974 if (ctx->used) { 866 if (ctx->used) { 975 err = -EINVAL; 867 err = -EINVAL; 976 goto unlock; 868 goto unlock; 977 } 869 } 978 870 979 pr_info_once( 871 pr_info_once( 980 "%s sent an empty cont 872 "%s sent an empty control message without MSG_MORE.\n", 981 current->comm); 873 current->comm); 982 } 874 } 983 ctx->init = true; 875 ctx->init = true; 984 876 985 if (init) { 877 if (init) { 986 ctx->enc = enc; 878 ctx->enc = enc; 987 if (con.iv) 879 if (con.iv) 988 memcpy(ctx->iv, con.iv 880 memcpy(ctx->iv, con.iv->iv, ivsize); 989 881 990 ctx->aead_assoclen = con.aead_ 882 ctx->aead_assoclen = con.aead_assoclen; 991 } 883 } 992 884 993 while (size) { 885 while (size) { 994 struct scatterlist *sg; 886 struct scatterlist *sg; 995 size_t len = size; 887 size_t len = size; 996 ssize_t plen; !! 888 size_t plen; 997 889 998 /* use the existing memory in 890 /* use the existing memory in an allocated page */ 999 if (ctx->merge && !(msg->msg_f !! 891 if (ctx->merge) { 1000 sgl = list_entry(ctx- 892 sgl = list_entry(ctx->tsgl_list.prev, 1001 stru 893 struct af_alg_tsgl, list); 1002 sg = sgl->sg + sgl->c 894 sg = sgl->sg + sgl->cur - 1; 1003 len = min_t(size_t, l 895 len = min_t(size_t, len, 1004 PAGE_SIZE 896 PAGE_SIZE - sg->offset - sg->length); 1005 897 1006 err = memcpy_from_msg 898 err = memcpy_from_msg(page_address(sg_page(sg)) + 1007 899 sg->offset + sg->length, 1008 900 msg, len); 1009 if (err) 901 if (err) 1010 goto unlock; 902 goto unlock; 1011 903 1012 sg->length += len; 904 sg->length += len; 1013 ctx->merge = (sg->off 905 ctx->merge = (sg->offset + sg->length) & 1014 (PAGE_SI 906 (PAGE_SIZE - 1); 1015 907 1016 ctx->used += len; 908 ctx->used += len; 1017 copied += len; 909 copied += len; 1018 size -= len; 910 size -= len; 1019 continue; 911 continue; 1020 } 912 } 1021 913 1022 if (!af_alg_writable(sk)) { 914 if (!af_alg_writable(sk)) { 1023 err = af_alg_wait_for 915 err = af_alg_wait_for_wmem(sk, msg->msg_flags); 1024 if (err) 916 if (err) 1025 goto unlock; 917 goto unlock; 1026 } 918 } 1027 919 1028 /* allocate a new page */ 920 /* allocate a new page */ 1029 len = min_t(unsigned long, le 921 len = min_t(unsigned long, len, af_alg_sndbuf(sk)); 1030 922 1031 err = af_alg_alloc_tsgl(sk); 923 err = af_alg_alloc_tsgl(sk); 1032 if (err) 924 if (err) 1033 goto unlock; 925 goto unlock; 1034 926 1035 sgl = list_entry(ctx->tsgl_li 927 sgl = list_entry(ctx->tsgl_list.prev, struct af_alg_tsgl, 1036 list); 928 list); 1037 sg = sgl->sg; 929 sg = sgl->sg; 1038 if (sgl->cur) 930 if (sgl->cur) 1039 sg_unmark_end(sg + sg 931 sg_unmark_end(sg + sgl->cur - 1); 1040 932 1041 if (msg->msg_flags & MSG_SPLI !! 933 do { 1042 struct sg_table sgtab !! 934 unsigned int i = sgl->cur; 1043 .sgl !! 935 1044 .nents !! 936 plen = min_t(size_t, len, PAGE_SIZE); 1045 .orig_nents !! 937 1046 }; !! 938 sg_assign_page(sg + i, alloc_page(GFP_KERNEL)); 1047 !! 939 if (!sg_page(sg + i)) { 1048 plen = extract_iter_t !! 940 err = -ENOMEM; 1049 !! 941 goto unlock; 1050 if (plen < 0) { !! 942 } 1051 err = plen; !! 943 >> 944 err = memcpy_from_msg(page_address(sg_page(sg + i)), >> 945 msg, plen); >> 946 if (err) { >> 947 __free_page(sg_page(sg + i)); >> 948 sg_assign_page(sg + i, NULL); 1052 goto unlock; 949 goto unlock; 1053 } 950 } 1054 951 1055 for (; sgl->cur < sgt !! 952 sg[i].length = plen; 1056 get_page(sg_p << 1057 len -= plen; 953 len -= plen; 1058 ctx->used += plen; 954 ctx->used += plen; 1059 copied += plen; 955 copied += plen; 1060 size -= plen; 956 size -= plen; 1061 ctx->merge = 0; !! 957 sgl->cur++; 1062 } else { !! 958 } while (len && sgl->cur < MAX_SGL_ENTS); 1063 do { << 1064 struct page * << 1065 unsigned int << 1066 << 1067 plen = min_t( << 1068 << 1069 pg = alloc_pa << 1070 if (!pg) { << 1071 err = << 1072 goto << 1073 } << 1074 << 1075 sg_assign_pag << 1076 << 1077 err = memcpy_ << 1078 page_ << 1079 msg, << 1080 if (err) { << 1081 __fre << 1082 sg_as << 1083 goto << 1084 } << 1085 << 1086 sg[i].length << 1087 len -= plen; << 1088 ctx->used += << 1089 copied += ple << 1090 size -= plen; << 1091 sgl->cur++; << 1092 } while (len && sgl-> << 1093 << 1094 ctx->merge = plen & ( << 1095 } << 1096 959 1097 if (!size) 960 if (!size) 1098 sg_mark_end(sg + sgl- 961 sg_mark_end(sg + sgl->cur - 1); >> 962 >> 963 ctx->merge = plen & (PAGE_SIZE - 1); 1099 } 964 } 1100 965 1101 err = 0; 966 err = 0; 1102 967 1103 ctx->more = msg->msg_flags & MSG_MORE 968 ctx->more = msg->msg_flags & MSG_MORE; 1104 969 1105 unlock: 970 unlock: 1106 af_alg_data_wakeup(sk); 971 af_alg_data_wakeup(sk); 1107 release_sock(sk); 972 release_sock(sk); 1108 973 1109 return copied ?: err; 974 return copied ?: err; 1110 } 975 } 1111 EXPORT_SYMBOL_GPL(af_alg_sendmsg); 976 EXPORT_SYMBOL_GPL(af_alg_sendmsg); 1112 977 1113 /** 978 /** >> 979 * af_alg_sendpage - sendpage system call handler >> 980 * @sock: socket of connection to user space to write to >> 981 * @page: data to send >> 982 * @offset: offset into page to begin sending >> 983 * @size: length of data >> 984 * @flags: message send/receive flags >> 985 * >> 986 * This is a generic implementation of sendpage to fill ctx->tsgl_list. >> 987 */ >> 988 ssize_t af_alg_sendpage(struct socket *sock, struct page *page, >> 989 int offset, size_t size, int flags) >> 990 { >> 991 struct sock *sk = sock->sk; >> 992 struct alg_sock *ask = alg_sk(sk); >> 993 struct af_alg_ctx *ctx = ask->private; >> 994 struct af_alg_tsgl *sgl; >> 995 int err = -EINVAL; >> 996 >> 997 if (flags & MSG_SENDPAGE_NOTLAST) >> 998 flags |= MSG_MORE; >> 999 >> 1000 lock_sock(sk); >> 1001 if (!ctx->more && ctx->used) >> 1002 goto unlock; >> 1003 >> 1004 if (!size) >> 1005 goto done; >> 1006 >> 1007 if (!af_alg_writable(sk)) { >> 1008 err = af_alg_wait_for_wmem(sk, flags); >> 1009 if (err) >> 1010 goto unlock; >> 1011 } >> 1012 >> 1013 err = af_alg_alloc_tsgl(sk); >> 1014 if (err) >> 1015 goto unlock; >> 1016 >> 1017 ctx->merge = 0; >> 1018 sgl = list_entry(ctx->tsgl_list.prev, struct af_alg_tsgl, list); >> 1019 >> 1020 if (sgl->cur) >> 1021 sg_unmark_end(sgl->sg + sgl->cur - 1); >> 1022 >> 1023 sg_mark_end(sgl->sg + sgl->cur); >> 1024 >> 1025 get_page(page); >> 1026 sg_set_page(sgl->sg + sgl->cur, page, size, offset); >> 1027 sgl->cur++; >> 1028 ctx->used += size; >> 1029 >> 1030 done: >> 1031 ctx->more = flags & MSG_MORE; >> 1032 >> 1033 unlock: >> 1034 af_alg_data_wakeup(sk); >> 1035 release_sock(sk); >> 1036 >> 1037 return err ?: size; >> 1038 } >> 1039 EXPORT_SYMBOL_GPL(af_alg_sendpage); >> 1040 >> 1041 /** 1114 * af_alg_free_resources - release resources 1042 * af_alg_free_resources - release resources required for crypto request 1115 * @areq: Request holding the TX and RX SGL 1043 * @areq: Request holding the TX and RX SGL 1116 */ 1044 */ 1117 void af_alg_free_resources(struct af_alg_asyn 1045 void af_alg_free_resources(struct af_alg_async_req *areq) 1118 { 1046 { 1119 struct sock *sk = areq->sk; 1047 struct sock *sk = areq->sk; 1120 struct af_alg_ctx *ctx; << 1121 1048 1122 af_alg_free_areq_sgls(areq); 1049 af_alg_free_areq_sgls(areq); 1123 sock_kfree_s(sk, areq, areq->areqlen) 1050 sock_kfree_s(sk, areq, areq->areqlen); 1124 << 1125 ctx = alg_sk(sk)->private; << 1126 ctx->inflight = false; << 1127 } 1051 } 1128 EXPORT_SYMBOL_GPL(af_alg_free_resources); 1052 EXPORT_SYMBOL_GPL(af_alg_free_resources); 1129 1053 1130 /** 1054 /** 1131 * af_alg_async_cb - AIO callback handler 1055 * af_alg_async_cb - AIO callback handler 1132 * @data: async request completion data !! 1056 * @_req: async request info 1133 * @err: if non-zero, error result to be retu 1057 * @err: if non-zero, error result to be returned via ki_complete(); 1134 * otherwise return the AIO output leng 1058 * otherwise return the AIO output length via ki_complete(). 1135 * 1059 * 1136 * This handler cleans up the struct af_alg_a 1060 * This handler cleans up the struct af_alg_async_req upon completion of the 1137 * AIO operation. 1061 * AIO operation. 1138 * 1062 * 1139 * The number of bytes to be generated with t 1063 * The number of bytes to be generated with the AIO operation must be set 1140 * in areq->outlen before the AIO callback ha 1064 * in areq->outlen before the AIO callback handler is invoked. 1141 */ 1065 */ 1142 void af_alg_async_cb(void *data, int err) !! 1066 void af_alg_async_cb(struct crypto_async_request *_req, int err) 1143 { 1067 { 1144 struct af_alg_async_req *areq = data; !! 1068 struct af_alg_async_req *areq = _req->data; 1145 struct sock *sk = areq->sk; 1069 struct sock *sk = areq->sk; 1146 struct kiocb *iocb = areq->iocb; 1070 struct kiocb *iocb = areq->iocb; 1147 unsigned int resultlen; 1071 unsigned int resultlen; 1148 1072 1149 /* Buffer size written by crypto oper 1073 /* Buffer size written by crypto operation. */ 1150 resultlen = areq->outlen; 1074 resultlen = areq->outlen; 1151 1075 1152 af_alg_free_resources(areq); 1076 af_alg_free_resources(areq); 1153 sock_put(sk); 1077 sock_put(sk); 1154 1078 1155 iocb->ki_complete(iocb, err ? err : ( !! 1079 iocb->ki_complete(iocb, err ? err : (int)resultlen, 0); 1156 } 1080 } 1157 EXPORT_SYMBOL_GPL(af_alg_async_cb); 1081 EXPORT_SYMBOL_GPL(af_alg_async_cb); 1158 1082 1159 /** 1083 /** 1160 * af_alg_poll - poll system call handler 1084 * af_alg_poll - poll system call handler 1161 * @file: file pointer 1085 * @file: file pointer 1162 * @sock: socket to poll 1086 * @sock: socket to poll 1163 * @wait: poll_table 1087 * @wait: poll_table 1164 */ 1088 */ 1165 __poll_t af_alg_poll(struct file *file, struc 1089 __poll_t af_alg_poll(struct file *file, struct socket *sock, 1166 poll_table *wait) 1090 poll_table *wait) 1167 { 1091 { 1168 struct sock *sk = sock->sk; 1092 struct sock *sk = sock->sk; 1169 struct alg_sock *ask = alg_sk(sk); 1093 struct alg_sock *ask = alg_sk(sk); 1170 struct af_alg_ctx *ctx = ask->private 1094 struct af_alg_ctx *ctx = ask->private; 1171 __poll_t mask; 1095 __poll_t mask; 1172 1096 1173 sock_poll_wait(file, sock, wait); 1097 sock_poll_wait(file, sock, wait); 1174 mask = 0; 1098 mask = 0; 1175 1099 1176 if (!ctx->more || ctx->used) 1100 if (!ctx->more || ctx->used) 1177 mask |= EPOLLIN | EPOLLRDNORM 1101 mask |= EPOLLIN | EPOLLRDNORM; 1178 1102 1179 if (af_alg_writable(sk)) 1103 if (af_alg_writable(sk)) 1180 mask |= EPOLLOUT | EPOLLWRNOR 1104 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND; 1181 1105 1182 return mask; 1106 return mask; 1183 } 1107 } 1184 EXPORT_SYMBOL_GPL(af_alg_poll); 1108 EXPORT_SYMBOL_GPL(af_alg_poll); 1185 1109 1186 /** 1110 /** 1187 * af_alg_alloc_areq - allocate struct af_alg 1111 * af_alg_alloc_areq - allocate struct af_alg_async_req 1188 * 1112 * 1189 * @sk: socket of connection to user space 1113 * @sk: socket of connection to user space 1190 * @areqlen: size of struct af_alg_async_req 1114 * @areqlen: size of struct af_alg_async_req + crypto_*_reqsize 1191 * Return: allocated data structure or ERR_PT 1115 * Return: allocated data structure or ERR_PTR upon error 1192 */ 1116 */ 1193 struct af_alg_async_req *af_alg_alloc_areq(st 1117 struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, 1194 un 1118 unsigned int areqlen) 1195 { 1119 { 1196 struct af_alg_ctx *ctx = alg_sk(sk)-> !! 1120 struct af_alg_async_req *areq = sock_kmalloc(sk, areqlen, GFP_KERNEL); 1197 struct af_alg_async_req *areq; << 1198 1121 1199 /* Only one AIO request can be in fli << 1200 if (ctx->inflight) << 1201 return ERR_PTR(-EBUSY); << 1202 << 1203 areq = sock_kmalloc(sk, areqlen, GFP_ << 1204 if (unlikely(!areq)) 1122 if (unlikely(!areq)) 1205 return ERR_PTR(-ENOMEM); 1123 return ERR_PTR(-ENOMEM); 1206 1124 1207 ctx->inflight = true; << 1208 << 1209 areq->areqlen = areqlen; 1125 areq->areqlen = areqlen; 1210 areq->sk = sk; 1126 areq->sk = sk; 1211 areq->first_rsgl.sgl.sgt.sgl = areq-> << 1212 areq->last_rsgl = NULL; 1127 areq->last_rsgl = NULL; 1213 INIT_LIST_HEAD(&areq->rsgl_list); 1128 INIT_LIST_HEAD(&areq->rsgl_list); 1214 areq->tsgl = NULL; 1129 areq->tsgl = NULL; 1215 areq->tsgl_entries = 0; 1130 areq->tsgl_entries = 0; 1216 1131 1217 return areq; 1132 return areq; 1218 } 1133 } 1219 EXPORT_SYMBOL_GPL(af_alg_alloc_areq); 1134 EXPORT_SYMBOL_GPL(af_alg_alloc_areq); 1220 1135 1221 /** 1136 /** 1222 * af_alg_get_rsgl - create the RX SGL for th 1137 * af_alg_get_rsgl - create the RX SGL for the output data from the crypto 1223 * operation 1138 * operation 1224 * 1139 * 1225 * @sk: socket of connection to user space 1140 * @sk: socket of connection to user space 1226 * @msg: user space message 1141 * @msg: user space message 1227 * @flags: flags used to invoke recvmsg with 1142 * @flags: flags used to invoke recvmsg with 1228 * @areq: instance of the cryptographic reque 1143 * @areq: instance of the cryptographic request that will hold the RX SGL 1229 * @maxsize: maximum number of bytes to be pu 1144 * @maxsize: maximum number of bytes to be pulled from user space 1230 * @outlen: number of bytes in the RX SGL 1145 * @outlen: number of bytes in the RX SGL 1231 * Return: 0 on success, < 0 upon error 1146 * Return: 0 on success, < 0 upon error 1232 */ 1147 */ 1233 int af_alg_get_rsgl(struct sock *sk, struct m 1148 int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags, 1234 struct af_alg_async_req * 1149 struct af_alg_async_req *areq, size_t maxsize, 1235 size_t *outlen) 1150 size_t *outlen) 1236 { 1151 { 1237 struct alg_sock *ask = alg_sk(sk); 1152 struct alg_sock *ask = alg_sk(sk); 1238 struct af_alg_ctx *ctx = ask->private 1153 struct af_alg_ctx *ctx = ask->private; 1239 size_t len = 0; 1154 size_t len = 0; 1240 1155 1241 while (maxsize > len && msg_data_left 1156 while (maxsize > len && msg_data_left(msg)) { 1242 struct af_alg_rsgl *rsgl; 1157 struct af_alg_rsgl *rsgl; 1243 ssize_t err; << 1244 size_t seglen; 1158 size_t seglen; >> 1159 int err; 1245 1160 1246 /* limit the amount of readab 1161 /* limit the amount of readable buffers */ 1247 if (!af_alg_readable(sk)) 1162 if (!af_alg_readable(sk)) 1248 break; 1163 break; 1249 1164 1250 seglen = min_t(size_t, (maxsi 1165 seglen = min_t(size_t, (maxsize - len), 1251 msg_data_left( 1166 msg_data_left(msg)); 1252 1167 1253 if (list_empty(&areq->rsgl_li 1168 if (list_empty(&areq->rsgl_list)) { 1254 rsgl = &areq->first_r 1169 rsgl = &areq->first_rsgl; 1255 } else { 1170 } else { 1256 rsgl = sock_kmalloc(s 1171 rsgl = sock_kmalloc(sk, sizeof(*rsgl), GFP_KERNEL); 1257 if (unlikely(!rsgl)) 1172 if (unlikely(!rsgl)) 1258 return -ENOME 1173 return -ENOMEM; 1259 } 1174 } 1260 1175 1261 rsgl->sgl.need_unpin = !! 1176 rsgl->sgl.npages = 0; 1262 iov_iter_extract_will << 1263 rsgl->sgl.sgt.sgl = rsgl->sgl << 1264 rsgl->sgl.sgt.nents = 0; << 1265 rsgl->sgl.sgt.orig_nents = 0; << 1266 list_add_tail(&rsgl->list, &a 1177 list_add_tail(&rsgl->list, &areq->rsgl_list); 1267 1178 1268 sg_init_table(rsgl->sgl.sgt.s !! 1179 /* make one iovec available as scatterlist */ 1269 err = extract_iter_to_sg(&msg !! 1180 err = af_alg_make_sg(&rsgl->sgl, &msg->msg_iter, seglen); 1270 ALG_ << 1271 if (err < 0) { 1181 if (err < 0) { 1272 rsgl->sg_num_bytes = 1182 rsgl->sg_num_bytes = 0; 1273 return err; 1183 return err; 1274 } 1184 } 1275 1185 1276 sg_mark_end(rsgl->sgl.sgt.sgl << 1277 << 1278 /* chain the new scatterlist 1186 /* chain the new scatterlist with previous one */ 1279 if (areq->last_rsgl) 1187 if (areq->last_rsgl) 1280 af_alg_link_sg(&areq- 1188 af_alg_link_sg(&areq->last_rsgl->sgl, &rsgl->sgl); 1281 1189 1282 areq->last_rsgl = rsgl; 1190 areq->last_rsgl = rsgl; 1283 len += err; 1191 len += err; 1284 atomic_add(err, &ctx->rcvused 1192 atomic_add(err, &ctx->rcvused); 1285 rsgl->sg_num_bytes = err; 1193 rsgl->sg_num_bytes = err; >> 1194 iov_iter_advance(&msg->msg_iter, err); 1286 } 1195 } 1287 1196 1288 *outlen = len; 1197 *outlen = len; 1289 return 0; 1198 return 0; 1290 } 1199 } 1291 EXPORT_SYMBOL_GPL(af_alg_get_rsgl); 1200 EXPORT_SYMBOL_GPL(af_alg_get_rsgl); 1292 1201 1293 static int __init af_alg_init(void) 1202 static int __init af_alg_init(void) 1294 { 1203 { 1295 int err = proto_register(&alg_proto, 1204 int err = proto_register(&alg_proto, 0); 1296 1205 1297 if (err) 1206 if (err) 1298 goto out; 1207 goto out; 1299 1208 1300 err = sock_register(&alg_family); 1209 err = sock_register(&alg_family); 1301 if (err != 0) 1210 if (err != 0) 1302 goto out_unregister_proto; 1211 goto out_unregister_proto; 1303 1212 1304 out: 1213 out: 1305 return err; 1214 return err; 1306 1215 1307 out_unregister_proto: 1216 out_unregister_proto: 1308 proto_unregister(&alg_proto); 1217 proto_unregister(&alg_proto); 1309 goto out; 1218 goto out; 1310 } 1219 } 1311 1220 1312 static void __exit af_alg_exit(void) 1221 static void __exit af_alg_exit(void) 1313 { 1222 { 1314 sock_unregister(PF_ALG); 1223 sock_unregister(PF_ALG); 1315 proto_unregister(&alg_proto); 1224 proto_unregister(&alg_proto); 1316 } 1225 } 1317 1226 1318 module_init(af_alg_init); 1227 module_init(af_alg_init); 1319 module_exit(af_alg_exit); 1228 module_exit(af_alg_exit); 1320 MODULE_DESCRIPTION("Crypto userspace interfac << 1321 MODULE_LICENSE("GPL"); 1229 MODULE_LICENSE("GPL"); 1322 MODULE_ALIAS_NETPROTO(AF_ALG); 1230 MODULE_ALIAS_NETPROTO(AF_ALG); 1323 1231
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.