diff options
author | Christian Engelmayer <cengelma@gmx.at> | 2014-04-21 14:45:59 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-04-28 06:21:17 -0400 |
commit | ac5f863f8c548ab72511213b30368cfc8007ae01 (patch) | |
tree | 5bae766d43ab3847ad573c7a0c15d1e395c2b9a7 /crypto/tcrypt.c | |
parent | 3d67be2761dc4b5b792037f296f3394a29581efc (diff) |
crypto: tcrypt - Fix potential leak in test_aead_speed() if aad_size is too big
Fix a potential memory leak in the error handling of test_aead_speed(). In case
the size check on the associate data length parameter fails, the function goes
through the wrong exit label. Reported by Coverity - CID 1163870.
Signed-off-by: Christian Engelmayer <cengelma@gmx.at>
Acked-by: Tim Chen <tim.c.chen@linux.intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/tcrypt.c')
-rw-r--r-- | crypto/tcrypt.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 870be7b4dc05..1856d7ff2688 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
@@ -282,6 +282,11 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec, | |||
282 | unsigned int *b_size; | 282 | unsigned int *b_size; |
283 | unsigned int iv_len; | 283 | unsigned int iv_len; |
284 | 284 | ||
285 | if (aad_size >= PAGE_SIZE) { | ||
286 | pr_err("associate data length (%u) too big\n", aad_size); | ||
287 | return; | ||
288 | } | ||
289 | |||
285 | if (enc == ENCRYPT) | 290 | if (enc == ENCRYPT) |
286 | e = "encryption"; | 291 | e = "encryption"; |
287 | else | 292 | else |
@@ -323,14 +328,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec, | |||
323 | b_size = aead_sizes; | 328 | b_size = aead_sizes; |
324 | do { | 329 | do { |
325 | assoc = axbuf[0]; | 330 | assoc = axbuf[0]; |
326 | 331 | memset(assoc, 0xff, aad_size); | |
327 | if (aad_size < PAGE_SIZE) | ||
328 | memset(assoc, 0xff, aad_size); | ||
329 | else { | ||
330 | pr_err("associate data length (%u) too big\n", | ||
331 | aad_size); | ||
332 | goto out_nosg; | ||
333 | } | ||
334 | sg_init_one(&asg[0], assoc, aad_size); | 332 | sg_init_one(&asg[0], assoc, aad_size); |
335 | 333 | ||
336 | if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) { | 334 | if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) { |