]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - crypto/algif_hash.c
crypto: algif_hash - Only export and import on sockets with data
[karo-tx-linux.git] / crypto / algif_hash.c
index 01da360bdb5510b78eac0ee43630795c4a011d76..b4c24fe3dcfb5ed575350406c9dd7ece3c006aef 100644 (file)
@@ -34,8 +34,8 @@ struct hash_ctx {
        struct ahash_request req;
 };
 
-static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
-                       struct msghdr *msg, size_t ignored)
+static int hash_sendmsg(struct socket *sock, struct msghdr *msg,
+                       size_t ignored)
 {
        int limit = ALG_MAX_PAGES * PAGE_SIZE;
        struct sock *sk = sock->sk;
@@ -56,8 +56,8 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
 
        ctx->more = 0;
 
-       while (iov_iter_count(&msg->msg_iter)) {
-               int len = iov_iter_count(&msg->msg_iter);
+       while (msg_data_left(msg)) {
+               int len = msg_data_left(msg);
 
                if (len > limit)
                        len = limit;
@@ -139,8 +139,8 @@ unlock:
        return err ?: size;
 }
 
-static int hash_recvmsg(struct kiocb *unused, struct socket *sock,
-                       struct msghdr *msg, size_t len, int flags)
+static int hash_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
+                       int flags)
 {
        struct sock *sk = sock->sk;
        struct alg_sock *ask = alg_sk(sk);
@@ -181,9 +181,14 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags)
        struct sock *sk2;
        struct alg_sock *ask2;
        struct hash_ctx *ctx2;
+       bool more;
        int err;
 
-       err = crypto_ahash_export(req, state);
+       lock_sock(sk);
+       more = ctx->more;
+       err = more ? crypto_ahash_export(req, state) : 0;
+       release_sock(sk);
+
        if (err)
                return err;
 
@@ -194,7 +199,10 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags)
        sk2 = newsock->sk;
        ask2 = alg_sk(sk2);
        ctx2 = ask2->private;
-       ctx2->more = 1;
+       ctx2->more = more;
+
+       if (!more)
+               return err;
 
        err = crypto_ahash_import(&ctx2->req, state);
        if (err) {