On Fri, May 29, 2009 at 11:32:54AM -0400, Jarod Wilson wrote: > At present, its entirely possible to add a test vector to testmgr with > an input longer than a page in length w/o specifying a .np option, and > overflow the page of memory allocated to {a,}xbuf[0], silently > corrupting memory. I know, because I've accidentally done it. :) > > While this doesn't currently happen in practice w/the existing code, > due to all !np vectors being less than a 4k page in length (and the > page allocation loop often returns contiguous pages anyway), explicit > checks or a way to remove the 4k limit would be a good idea. > > A few ways to fix and/or work around this: > > 1) allocate some larger guaranteed contiguous buffers using > __get_free_pages() or kmalloc and use them in the !np case > > 2) catch the > PAGE_SIZE && !np case and then do things similar to how > they are done in the np case > > 3) catch the > PAGE_SIZE && !np case and simply exit with an error > > Since there currently aren't any test vectors that are actually larger > than a page and not tagged np, option 1 seems like a waste of memory > and option 2 sounds like unnecessary complexity, so I'd offer up > option 3 as the most viable alternative right now. > > Signed-off-by: Jarod Wilson <jarod@xxxxxxxxxx> > Given the rate at which test vectors are added to the testmgr, and the likelyhood one will be over a page in size, I think this is probably the best way forward. Its saves memory/complexity until for now, and catches anyone trying to exceed the current 1 page size, at which point we can spend the time to modify the testmanager to make use of scatter/gather chains to handle the longer vectors. Neil Acked-by: Neil Horman <nhorman@xxxxxxxxxxxxx> > --- > crypto/testmgr.c | 34 ++++++++++++++++++++++++++++++++++ > 1 files changed, 34 insertions(+), 0 deletions(-) > > diff --git a/crypto/testmgr.c b/crypto/testmgr.c > index 376ea88..9483a2b 100644 > --- a/crypto/testmgr.c > +++ b/crypto/testmgr.c > @@ -185,6 +185,13 @@ static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, > > hash_buff = xbuf[0]; > > + if (template[i].psize > PAGE_SIZE) { > + printk(KERN_ERR "alg: hash: psize %u larger than " > + "contiguous buffer space\n", template[i].psize); > + ret = -EOVERFLOW; > + goto out; > + } > + > memcpy(hash_buff, template[i].plaintext, template[i].psize); > sg_init_one(&sg[0], hash_buff, template[i].psize); > > @@ -357,6 +364,16 @@ static int test_aead(struct crypto_aead *tfm, int enc, > input = xbuf[0]; > assoc = axbuf[0]; > > + if (template[i].ilen > PAGE_SIZE || > + template[i].alen > PAGE_SIZE) { > + printk(KERN_ERR "alg: aead: input larger than " > + "contiguous buffer space (ilen: %u, " > + "alen: %u)\n", > + template[i].ilen, template[i].alen); > + ret = -EOVERFLOW; > + goto out; > + } > + > memcpy(input, template[i].input, template[i].ilen); > memcpy(assoc, template[i].assoc, template[i].alen); > if (template[i].iv) > @@ -651,6 +668,14 @@ static int test_cipher(struct crypto_cipher *tfm, int enc, > j++; > > data = xbuf[0]; > + > + if (template[i].ilen > PAGE_SIZE) { > + printk(KERN_ERR "alg: cipher: ilen %u larger than " > + "contiguous buffer space\n", template[i].ilen); > + ret = -EOVERFLOW; > + goto out; > + } > + > memcpy(data, template[i].input, template[i].ilen); > > crypto_cipher_clear_flags(tfm, ~0); > @@ -742,6 +767,15 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc, > j++; > > data = xbuf[0]; > + > + if (template[i].ilen > PAGE_SIZE) { > + printk(KERN_ERR "alg: skcipher: ilen %u larger " > + "than contiguous buffer space\n", > + template[i].ilen); > + ret = -EOVERFLOW; > + goto out; > + } > + > memcpy(data, template[i].input, template[i].ilen); > > crypto_ablkcipher_clear_flags(tfm, ~0); > > -- > Jarod Wilson > jarod@xxxxxxxxxx > -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html