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 | |
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.
-rw-r--r-- | cryptodev_main.c | 28 | ||||
-rw-r--r-- | ncr-sessions.c | 41 |
2 files changed, 38 insertions, 31 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, diff --git a/ncr-sessions.c b/ncr-sessions.c index 27c2937..3d9c5a0 100644 --- a/ncr-sessions.c +++ b/ncr-sessions.c @@ -491,22 +491,31 @@ static void _ncr_session_remove(struct list_sem_st* lst, ncr_session_t desc) static int _ncr_session_grow_pages(struct session_item_st *ses, int pagecount) { - if (pagecount < ses->array_size) + struct scatterlist *sg; + struct page **pages; + int array_size; + + if (likely(pagecount < ses->array_size)) return 0; - while (ses->array_size < pagecount) - ses->array_size *= 2; + for (array_size = ses->array_size; array_size < pagecount; + array_size *= 2) + ; 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); - - if (unlikely(ses->sg == NULL || ses->pages == NULL)) { + __func__, array_size); + pages = krealloc(ses->pages, array_size * sizeof(struct page *), + GFP_KERNEL); + if (unlikely(pages == NULL)) return -ENOMEM; - } + ses->pages = pages; + sg = krealloc(ses->sg, array_size * sizeof(struct scatterlist), + GFP_KERNEL); + if (unlikely(sg == NULL)) + return -ENOMEM; + ses->sg = sg; + + ses->array_size = array_size; return 0; } @@ -521,11 +530,6 @@ static int get_userbuf1(struct session_item_st* ses, return -EINVAL; } - if (unlikely(ses->sg == NULL || ses->pages == NULL)) { - err(); - return -ENOMEM; - } - pagecount = PAGECOUNT(udata, udata_size); _ncr_session_grow_pages(ses, pagecount); @@ -555,11 +559,6 @@ static int get_userbuf2(struct session_item_st* ses, return -EINVAL; } - if (unlikely(ses->sg == NULL || ses->pages == NULL)) { - err(); - return -ENOMEM; - } - src_pagecount = PAGECOUNT(op->data.udata.input, input_size); if (op->data.udata.input != op->data.udata.output) { /* non-in-situ transformation */ |