diff options
author | Miloslav Trmač <mitr@redhat.com> | 2010-07-26 19:41:45 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-26 20:25:59 +0200 |
commit | 3bb54aaf5effff41a945eebdd326fc5881f6cbed (patch) | |
tree | 5fa793533e72fc1e48401fcdbc2c9a138056fabc /cryptodev_main.c | |
parent | f8ee9fe8abff32704e658923003eae1420f97e16 (diff) | |
download | cryptodev-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.c | 28 |
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, |