On 11/3/2017 2:42 PM, Herbert Xu wrote: > On Tue, Oct 10, 2017 at 01:21:59PM +0300, Robert Baronescu wrote: >> In case buffer length is a multiple of PAGE_SIZE, >> the S/G table is incorrectly generated. >> Fix this by handling buflen = k * PAGE_SIZE separately. >> >> Signed-off-by: Robert Baronescu <robert.baronescu@xxxxxxx> >> --- >> crypto/tcrypt.c | 6 ++++-- >> 1 file changed, 4 insertions(+), 2 deletions(-) >> >> diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c >> index 0022a18..bd9b66c 100644 >> --- a/crypto/tcrypt.c >> +++ b/crypto/tcrypt.c >> @@ -221,11 +221,13 @@ static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE], >> } >> >> sg_init_table(sg, np + 1); sg_mark_end() marks sg[np]. >> - np--; >> + if (rem) >> + np--; >> for (k = 0; k < np; k++) >> sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE); In case rem == 0, last k value is np-1, thus sg[np-1+1] will be filled here with xbuf[np-1]. >> >> - sg_set_buf(&sg[k + 1], xbuf[k], rem); >> + if (rem) >> + sg_set_buf(&sg[k + 1], xbuf[k], rem); In case rem !=0, sg[np] will be filled here with xbuf[np-1]. > > Sorry but I think this is still buggy because you have not moved the > end-of-table marking in the rem == 0 case. IIUC this is correct, see above comments. Could you please take a look again? Thanks, Horia