diff options
| author | Jan Stancek <jstancek@redhat.com> | 2016-09-28 10:38:37 -0400 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-10-02 10:33:43 -0400 |
| commit | 7bcb87bca2f51226f3ec382fcd3ff52cc15747bb (patch) | |
| tree | 07bb151f7e7dd849a87822e33506f15925c28419 /crypto | |
| parent | 3387879524ec07fd9ba371eddd17e717abdd5e4f (diff) | |
crypto: testmgr - add guard to dst buffer for ahash_export
Add a guard to 'state' buffer and warn if its consistency after
call to crypto_ahash_export() changes, so that any write that
goes beyond advertised statesize (and thus causing potential
memory corruption [1]) is more visible.
[1] https://marc.info/?l=linux-crypto-vger&m=147467656516085
Signed-off-by: Jan Stancek <jstancek@redhat.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Marcelo Cerri <marcelo.cerri@canonical.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
| -rw-r--r-- | crypto/testmgr.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/crypto/testmgr.c b/crypto/testmgr.c index 0b01c3d062e2..62dffa0028ac 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c | |||
| @@ -209,16 +209,19 @@ static int ahash_partial_update(struct ahash_request **preq, | |||
| 209 | char *state; | 209 | char *state; |
| 210 | struct ahash_request *req; | 210 | struct ahash_request *req; |
| 211 | int statesize, ret = -EINVAL; | 211 | int statesize, ret = -EINVAL; |
| 212 | const char guard[] = { 0x00, 0xba, 0xad, 0x00 }; | ||
| 212 | 213 | ||
| 213 | req = *preq; | 214 | req = *preq; |
| 214 | statesize = crypto_ahash_statesize( | 215 | statesize = crypto_ahash_statesize( |
| 215 | crypto_ahash_reqtfm(req)); | 216 | crypto_ahash_reqtfm(req)); |
| 216 | state = kmalloc(statesize, GFP_KERNEL); | 217 | state = kmalloc(statesize + sizeof(guard), GFP_KERNEL); |
| 217 | if (!state) { | 218 | if (!state) { |
| 218 | pr_err("alt: hash: Failed to alloc state for %s\n", algo); | 219 | pr_err("alt: hash: Failed to alloc state for %s\n", algo); |
| 219 | goto out_nostate; | 220 | goto out_nostate; |
| 220 | } | 221 | } |
| 222 | memcpy(state + statesize, guard, sizeof(guard)); | ||
| 221 | ret = crypto_ahash_export(req, state); | 223 | ret = crypto_ahash_export(req, state); |
| 224 | WARN_ON(memcmp(state + statesize, guard, sizeof(guard))); | ||
| 222 | if (ret) { | 225 | if (ret) { |
| 223 | pr_err("alt: hash: Failed to export() for %s\n", algo); | 226 | pr_err("alt: hash: Failed to export() for %s\n", algo); |
| 224 | goto out; | 227 | goto out; |
