Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: scatterwalk - Fix test in scatterwalk_done

When there is more data to be processed, the current test in
scatterwalk_done may prevent us from calling pagedone even when
we should.

In particular, if we're on an SG entry spanning multiple pages
where the last page is not a full page, we will incorrectly skip
calling pagedone on the second last page.

This patch fixes this by adding a separate test for whether we've
reached the end of a page.

Cc: stable@vger.kernel.org
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

+2 -1
+2 -1
crypto/scatterwalk.c
··· 72 72 73 73 void scatterwalk_done(struct scatter_walk *walk, int out, int more) 74 74 { 75 - if (!(scatterwalk_pagelen(walk) & (PAGE_SIZE - 1)) || !more) 75 + if (!more || walk->offset >= walk->sg->offset + walk->sg->length || 76 + !(walk->offset & (PAGE_SIZE - 1))) 76 77 scatterwalk_pagedone(walk, out, more); 77 78 } 78 79 EXPORT_SYMBOL_GPL(scatterwalk_done);