Merge tag 'v6.6-p1' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[platform/kernel/linux-starfive.git] / crypto / af_alg.c
index 06b15b9..ea6fb8e 100644 (file)
@@ -320,18 +320,21 @@ static int alg_setkey_by_key_serial(struct alg_sock *ask, sockptr_t optval,
 
        if (IS_ERR(ret)) {
                up_read(&key->sem);
+               key_put(key);
                return PTR_ERR(ret);
        }
 
        key_data = sock_kmalloc(&ask->sk, key_datalen, GFP_KERNEL);
        if (!key_data) {
                up_read(&key->sem);
+               key_put(key);
                return -ENOMEM;
        }
 
        memcpy(key_data, ret, key_datalen);
 
        up_read(&key->sem);
+       key_put(key);
 
        err = type->setkey(ask->private, key_data, key_datalen);
 
@@ -1192,6 +1195,7 @@ struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
 
        areq->areqlen = areqlen;
        areq->sk = sk;
+       areq->first_rsgl.sgl.sgt.sgl = areq->first_rsgl.sgl.sgl;
        areq->last_rsgl = NULL;
        INIT_LIST_HEAD(&areq->rsgl_list);
        areq->tsgl = NULL;
@@ -1241,6 +1245,8 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
                                return -ENOMEM;
                }
 
+               rsgl->sgl.need_unpin =
+                       iov_iter_extract_will_pin(&msg->msg_iter);
                rsgl->sgl.sgt.sgl = rsgl->sgl.sgl;
                rsgl->sgl.sgt.nents = 0;
                rsgl->sgl.sgt.orig_nents = 0;
@@ -1255,8 +1261,6 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
                }
 
                sg_mark_end(rsgl->sgl.sgt.sgl + rsgl->sgl.sgt.nents - 1);
-               rsgl->sgl.need_unpin =
-                       iov_iter_extract_will_pin(&msg->msg_iter);
 
                /* chain the new scatterlist with previous one */
                if (areq->last_rsgl)