diff mbox

[v2,05/20] curl: Handle failure for potentially large allocations

Message ID 1401287873-25805-6-git-send-email-kwolf@redhat.com
State New
Headers show

Commit Message

Kevin Wolf May 28, 2014, 2:37 p.m. UTC
Some code in the block layer makes potentially huge allocations. Failure
is not completely unexpected there, so avoid aborting qemu and handle
out-of-memory situations gracefully.

This patch addresses the allocations in the curl block driver.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/curl.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Benoît Canet May 30, 2014, 12:19 p.m. UTC | #1
The Wednesday 28 May 2014 à 16:37:38 (+0200), Kevin Wolf wrote :
> Some code in the block layer makes potentially huge allocations. Failure
> is not completely unexpected there, so avoid aborting qemu and handle
> out-of-memory situations gracefully.
> 
> This patch addresses the allocations in the curl block driver.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
>  block/curl.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/block/curl.c b/block/curl.c
> index f491b0b..ae996e2 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -604,7 +604,13 @@ static void curl_readv_bh_cb(void *p)
>      state->buf_start = start;
>      state->buf_len = acb->end + s->readahead_size;
>      end = MIN(start + state->buf_len, s->len) - 1;
> -    state->orig_buf = g_malloc(state->buf_len);
> +    state->orig_buf = g_try_malloc(state->buf_len);
> +    if (state->buf_len && state->orig_buf == NULL) {
> +        curl_clean_state(state);
> +        acb->common.cb(acb->common.opaque, -ENOMEM);
> +        qemu_aio_release(acb);
> +        return;
> +    }
>      state->acb[0] = acb;
>  
>      snprintf(state->range, 127, "%zd-%zd", start, end);
> -- 
> 1.8.3.1
> 
> 
eviewed-by: Benoit Canet <benoit@irqsave.net>
diff mbox

Patch

diff --git a/block/curl.c b/block/curl.c
index f491b0b..ae996e2 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -604,7 +604,13 @@  static void curl_readv_bh_cb(void *p)
     state->buf_start = start;
     state->buf_len = acb->end + s->readahead_size;
     end = MIN(start + state->buf_len, s->len) - 1;
-    state->orig_buf = g_malloc(state->buf_len);
+    state->orig_buf = g_try_malloc(state->buf_len);
+    if (state->buf_len && state->orig_buf == NULL) {
+        curl_clean_state(state);
+        acb->common.cb(acb->common.opaque, -ENOMEM);
+        qemu_aio_release(acb);
+        return;
+    }
     state->acb[0] = acb;
 
     snprintf(state->range, 127, "%zd-%zd", start, end);