Commit bc97e57eb21f8db55bf0e1f182d384e75b2e3c99

Authored by Herbert Xu
1 parent 0f6bb83cb1

crypto: algif_skcipher - Handle unaligned receive buffer

As it is if user-space passes through a receive buffer that's not
aligned to to the cipher block size, we'll end up encrypting or
decrypting a partial block which causes a spurious EINVAL to be
returned.

This patch fixes this by moving the partial block test after the
af_alg_make_sg call.

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

Showing 1 changed file with 7 additions and 6 deletions Side-by-side Diff

crypto/algif_skcipher.c
... ... @@ -454,18 +454,18 @@
454 454  
455 455 used = min_t(unsigned long, used, seglen);
456 456  
  457 + used = af_alg_make_sg(&ctx->rsgl, from, used, 1);
  458 + err = used;
  459 + if (err < 0)
  460 + goto unlock;
  461 +
457 462 if (ctx->more || used < ctx->used)
458 463 used -= used % bs;
459 464  
460 465 err = -EINVAL;
461 466 if (!used)
462   - goto unlock;
  467 + goto free;
463 468  
464   - used = af_alg_make_sg(&ctx->rsgl, from, used, 1);
465   - err = used;
466   - if (err < 0)
467   - goto unlock;
468   -
469 469 ablkcipher_request_set_crypt(&ctx->req, sg,
470 470 ctx->rsgl.sg, used,
471 471 ctx->iv);
... ... @@ -476,6 +476,7 @@
476 476 crypto_ablkcipher_decrypt(&ctx->req),
477 477 &ctx->completion);
478 478  
  479 +free:
479 480 af_alg_free_sg(&ctx->rsgl);
480 481  
481 482 if (err)