summaryrefslogtreecommitdiffstats
path: root/cryptodev_main.c
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-07-26 19:41:45 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-26 20:25:59 +0200
commit3bb54aaf5effff41a945eebdd326fc5881f6cbed (patch)
tree5fa793533e72fc1e48401fcdbc2c9a138056fabc /cryptodev_main.c
parentf8ee9fe8abff32704e658923003eae1420f97e16 (diff)
downloadcryptodev-linux-3bb54aaf5effff41a945eebdd326fc5881f6cbed.tar.gz
cryptodev-linux-3bb54aaf5effff41a945eebdd326fc5881f6cbed.tar.xz
cryptodev-linux-3bb54aaf5effff41a945eebdd326fc5881f6cbed.zip
Don't leak memory on realloc failure.
This guarantees ses->sg and ses->pages are non-NULL, so drop no longer necessary checks for NULL.
Diffstat (limited to 'cryptodev_main.c')
-rw-r--r--cryptodev_main.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/cryptodev_main.c b/cryptodev_main.c
index f6124cd..f2e336e 100644
--- a/cryptodev_main.c
+++ b/cryptodev_main.c
@@ -561,19 +561,27 @@ static int get_userbuf(struct csession *ses,
(*tot_pages) = pagecount = src_pagecount + dst_pagecount;
if (pagecount > ses->array_size) {
- while (ses->array_size < pagecount)
- ses->array_size *= 2;
+ struct scatterlist *sg;
+ struct page **pages;
+ int array_size;
- dprintk(2, KERN_DEBUG, "%s: reallocating to %d elements\n",
- __func__, ses->array_size);
- ses->pages = krealloc(ses->pages, ses->array_size *
- sizeof(struct page *), GFP_KERNEL);
- ses->sg = krealloc(ses->sg, ses->array_size *
- sizeof(struct scatterlist), GFP_KERNEL);
+ for (array_size = ses->array_size; array_size < pagecount;
+ array_size *= 2)
+ ;
- if (ses->sg == NULL || ses->pages == NULL) {
+ dprintk(2, KERN_DEBUG, "%s: reallocating to %d elements\n",
+ __func__, array_size);
+ pages = krealloc(ses->pages, array_size * sizeof(struct page *),
+ GFP_KERNEL);
+ if (pages == NULL)
return -ENOMEM;
- }
+ ses->pages = pages;
+ sg = krealloc(ses->sg, array_size * sizeof(struct scatterlist),
+ GFP_KERNEL);
+ if (sg == NULL)
+ return -ENOMEM;
+ ses->sg = sg;
+ ses->array_size = array_size;
}
if (__get_userbuf(cop->src, cop->len, write_src,