summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Celaya <javier.celaya@flexvm.es>2015-01-28 11:49:44 +0100
committerChristophe Fergeau <cfergeau@redhat.com>2015-02-03 10:43:31 +0100
commit6049db492f527a8d48ca951613fa5fe467646aaa (patch)
tree867f9bbaf8381fb8386b80e63246e17eb1f6b4e9
parentac26fd7acbe863964148b960a949ec87cbfb56c1 (diff)
LZ4: Fix output buffer size
-rw-r--r--common/canvas_base.c6
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);