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

Configure Feed

Select the types of activity you want to include in your feed.

crypto: sahara - fix processing requests with cryptlen < sg->length

It's not always the case that the entire sg entry needs to be processed.
Currently, when cryptlen is less than sg->legth, "Descriptor length" errors
are encountered.

The error was noticed when testing xts(sahara-ecb-aes) with arbitrary sized
input data. To fix this, take the actual request size into account when
populating the hw links.

Fixes: 5de8875281e1 ("crypto: sahara - Add driver for SAHARA2 accelerator.")
Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Ovidiu Panait and committed by
Herbert Xu
5b8668ce afffcf3d

+7 -2
+7 -2
drivers/crypto/sahara.c
··· 444 444 int ret; 445 445 int i, j; 446 446 int idx = 0; 447 + u32 len; 447 448 448 449 memcpy(dev->key_base, ctx->key, ctx->keylen); 449 450 ··· 495 494 /* Create input links */ 496 495 dev->hw_desc[idx]->p1 = dev->hw_phys_link[0]; 497 496 sg = dev->in_sg; 497 + len = dev->total; 498 498 for (i = 0; i < dev->nb_in_sg; i++) { 499 - dev->hw_link[i]->len = sg->length; 499 + dev->hw_link[i]->len = min(len, sg->length); 500 500 dev->hw_link[i]->p = sg->dma_address; 501 501 if (i == (dev->nb_in_sg - 1)) { 502 502 dev->hw_link[i]->next = 0; 503 503 } else { 504 + len -= min(len, sg->length); 504 505 dev->hw_link[i]->next = dev->hw_phys_link[i + 1]; 505 506 sg = sg_next(sg); 506 507 } ··· 511 508 /* Create output links */ 512 509 dev->hw_desc[idx]->p2 = dev->hw_phys_link[i]; 513 510 sg = dev->out_sg; 511 + len = dev->total; 514 512 for (j = i; j < dev->nb_out_sg + i; j++) { 515 - dev->hw_link[j]->len = sg->length; 513 + dev->hw_link[j]->len = min(len, sg->length); 516 514 dev->hw_link[j]->p = sg->dma_address; 517 515 if (j == (dev->nb_out_sg + i - 1)) { 518 516 dev->hw_link[j]->next = 0; 519 517 } else { 518 + len -= min(len, sg->length); 520 519 dev->hw_link[j]->next = dev->hw_phys_link[j + 1]; 521 520 sg = sg_next(sg); 522 521 }