The code paths protected by the socket-lock do not use or modify the socket in a non-atomic fashion. The actions pertaining the socket do not even need to be handled as an atomic operation. Thus, the socket-lock can be safely ignored. This fixes a bug regarding scheduling in atomic as the callback function may be invoked in interrupt context. In addition, the sock_hold is moved before the AIO encrypt/decrypt operation to ensure that the socket is always present. This avoids a tiny race window where the socket is unprotected and yet used by the AIO operation. Finally, the release of resources for a crypto operation is moved into a common function of af_alg_free_resources.
Showing the changes to include/crypto (1 of 4 files). Show all
Unified · Split
| @@ -242,6 +242,7 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, · 241 unmodified lines | |||
| 242 | unsigned int ivsize); | 242 | unsigned int ivsize); |
| 243 | ssize_t af_alg_sendpage(struct socket *sock, struct page *page, | 243 | ssize_t af_alg_sendpage(struct socket *sock, struct page *page, |
| 244 | int offset, size_t size, int flags); | 244 | int offset, size_t size, int flags); |
| 245 | void af_alg_free_resources(struct af_alg_async_req *areq); | ||
| 245 | void af_alg_async_cb(struct crypto_async_request *_req, int err); | 246 | void af_alg_async_cb(struct crypto_async_request *_req, int err); |
| 246 | unsigned int af_alg_poll(struct file *file, struct socket *sock, | 247 | unsigned int af_alg_poll(struct file *file, struct socket *sock, |
| 247 | poll_table *wait); | 248 | poll_table *wait); |