diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c index dfb048cefb60..1176533a55c9 100644 --- a/crypto/algif_hash.c +++ b/crypto/algif_hash.c @@ -83,26 +83,14 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg, ctx->more = false; - while (msg_data_left(msg)) { + do { ctx->sgl.sgt.sgl = ctx->sgl.sgl; ctx->sgl.sgt.nents = 0; ctx->sgl.sgt.orig_nents = 0; err = -EIO; npages = iov_iter_npages(&msg->msg_iter, max_pages); - if (npages == 0) - goto unlock_free; - - if (npages > ARRAY_SIZE(ctx->sgl.sgl)) { - err = -ENOMEM; - ctx->sgl.sgt.sgl = - kvmalloc(array_size(npages, - sizeof(*ctx->sgl.sgt.sgl)), - GFP_KERNEL); - if (!ctx->sgl.sgt.sgl) - goto unlock_free; - } - sg_init_table(ctx->sgl.sgl, npages); + sg_init_table(ctx->sgl.sgl, max_t(size_t, npages, 1)); ctx->sgl.need_unpin = iov_iter_extract_will_pin(&msg->msg_iter); @@ -111,7 +99,8 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg, if (err < 0) goto unlock_free; len = err; - sg_mark_end(ctx->sgl.sgt.sgl + ctx->sgl.sgt.nents - 1); + if (len > 0) + sg_mark_end(ctx->sgl.sgt.sgl + ctx->sgl.sgt.nents - 1); if (!msg_data_left(msg)) { err = hash_alloc_result(sk, ctx); @@ -148,7 +137,7 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg, copied += len; af_alg_free_sg(&ctx->sgl); - } + } while (msg_data_left(msg)); ctx->more = msg->msg_flags & MSG_MORE; err = 0; diff --git a/lib/scatterlist.c b/lib/scatterlist.c index e97d7060329e..77a7b18ee751 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -1340,7 +1340,7 @@ ssize_t extract_iter_to_sg(struct iov_iter *iter, size_t maxsize, struct sg_table *sgtable, unsigned int sg_max, iov_iter_extraction_t extraction_flags) { - if (maxsize == 0) + if (!maxsize || !iter->count) return 0; switch (iov_iter_type(iter)) {