diff options
author | Javier Celaya <javier.celaya@flexvm.es> | 2015-01-28 11:49:44 +0100 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2015-02-03 10:43:31 +0100 |
commit | 6049db492f527a8d48ca951613fa5fe467646aaa (patch) | |
tree | 867f9bbaf8381fb8386b80e63246e17eb1f6b4e9 | |
parent | ac26fd7acbe863964148b960a949ec87cbfb56c1 (diff) |
LZ4: Fix output buffer size
-rw-r--r-- | common/canvas_base.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/common/canvas_base.c b/common/canvas_base.c index 64d0aae..f2898ca 100644 --- a/common/canvas_base.c +++ b/common/canvas_base.c @@ -521,7 +521,7 @@ static pixman_image_t *canvas_get_jpeg(CanvasBase *canvas, SpiceImage *image) static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image) { pixman_image_t *surface = NULL; - int dec_size, enc_size; + int dec_size, enc_size, available; int stride; int stride_abs; uint8_t *dest, *data, *data_end; @@ -550,6 +550,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image) dest = (uint8_t *)pixman_image_get_data(surface); stride = pixman_image_get_stride(surface); stride_abs = abs(stride); + available = height * stride_abs; if (direction == 1) { dest -= (stride_abs * (height - 1)); } @@ -559,7 +560,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image) enc_size = ntohl(*((uint32_t *)data)); data += 4; dec_size = LZ4_decompress_safe_continue(stream, (const char *) data, - (char *) dest, enc_size, height * stride_abs); + (char *) dest, enc_size, available); if (dec_size <= 0) { spice_warning("Error decoding LZ4 block\n"); pixman_image_unref(surface); @@ -567,6 +568,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image) break; } dest += dec_size; + available -= dec_size; data += enc_size; } while (data < data_end); |