summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-09-21 20:14:50 +0200
committerAlexander Larsson <alexl@redhat.com>2010-09-21 20:14:50 +0200
commit587584a4e468dfe46649df9864d12f51a80d34a6 (patch)
treec45bfe6589003184dfedfe1e0a51dbdcbd32cb36 /server
parent485ba90b0303f6c8b7995f22936560b518eec012 (diff)
downloadspice-587584a4e468dfe46649df9864d12f51a80d34a6.tar.gz
spice-587584a4e468dfe46649df9864d12f51a80d34a6.tar.xz
spice-587584a4e468dfe46649df9864d12f51a80d34a6.zip
server: Handle self_image in localize_bitmap
When drawing a drawable with a NULL src bitmap that means we should be using the previously generated self_bitmap. Not doing this causes a segfault due to accessing the NULL.
Diffstat (limited to 'server')
-rw-r--r--server/red_worker.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index f307aefc..d59726f0 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -3715,10 +3715,17 @@ static void image_cache_eaging(ImageCache *cache)
#endif
}
-static void localize_bitmap(RedWorker *worker, SpiceImage **image_ptr, SpiceImage *image_store)
+static void localize_bitmap(RedWorker *worker, SpiceImage **image_ptr, SpiceImage *image_store, Drawable *drawable)
{
SpiceImage *image = *image_ptr;
+ if (image == NULL) {
+ ASSERT(drawable != NULL);
+ ASSERT(drawable->self_bitmap != NULL);
+ *image_ptr = drawable->self_bitmap;
+ return;
+ }
+
if (image_cache_hit(&worker->image_cache, image->descriptor.id)) {
image_store->descriptor = image->descriptor;
image_store->descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE;
@@ -3753,14 +3760,14 @@ static void localize_bitmap(RedWorker *worker, SpiceImage **image_ptr, SpiceImag
static void localize_brush(RedWorker *worker, SpiceBrush *brush, SpiceImage *image_store)
{
if (brush->type == SPICE_BRUSH_TYPE_PATTERN) {
- localize_bitmap(worker, &brush->u.pattern.pat, image_store);
+ localize_bitmap(worker, &brush->u.pattern.pat, image_store, NULL);
}
}
static void localize_mask(RedWorker *worker, SpiceQMask *mask, SpiceImage *image_store)
{
if (mask->bitmap) {
- localize_bitmap(worker, &mask->bitmap, image_store);
+ localize_bitmap(worker, &mask->bitmap, image_store, NULL);
}
}
@@ -3793,7 +3800,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
SpiceOpaque opaque = drawable->red_drawable->u.opaque;
SpiceImage img1, img2, img3;
localize_brush(worker, &opaque.brush, &img1);
- localize_bitmap(worker, &opaque.src_bitmap, &img2);
+ localize_bitmap(worker, &opaque.src_bitmap, &img2, drawable);
localize_mask(worker, &opaque.mask, &img3);
canvas->ops->draw_opaque(canvas, &drawable->red_drawable->bbox, &clip, &opaque);
break;
@@ -3801,7 +3808,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
case QXL_DRAW_COPY: {
SpiceCopy copy = drawable->red_drawable->u.copy;
SpiceImage img1, img2;
- localize_bitmap(worker, &copy.src_bitmap, &img1);
+ localize_bitmap(worker, &copy.src_bitmap, &img1, drawable);
localize_mask(worker, &copy.mask, &img2);
canvas->ops->draw_copy(canvas, &drawable->red_drawable->bbox,
&clip, &copy);
@@ -3810,7 +3817,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
case QXL_DRAW_TRANSPARENT: {
SpiceTransparent transparent = drawable->red_drawable->u.transparent;
SpiceImage img1;
- localize_bitmap(worker, &transparent.src_bitmap, &img1);
+ localize_bitmap(worker, &transparent.src_bitmap, &img1, drawable);
canvas->ops->draw_transparent(canvas,
&drawable->red_drawable->bbox, &clip, &transparent);
break;
@@ -3818,7 +3825,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
case QXL_DRAW_ALPHA_BLEND: {
SpiceAlphaBlend alpha_blend = drawable->red_drawable->u.alpha_blend;
SpiceImage img1;
- localize_bitmap(worker, &alpha_blend.src_bitmap, &img1);
+ localize_bitmap(worker, &alpha_blend.src_bitmap, &img1, drawable);
canvas->ops->draw_alpha_blend(canvas,
&drawable->red_drawable->bbox, &clip, &alpha_blend);
break;
@@ -3831,7 +3838,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
case QXL_DRAW_BLEND: {
SpiceBlend blend = drawable->red_drawable->u.blend;
SpiceImage img1, img2;
- localize_bitmap(worker, &blend.src_bitmap, &img1);
+ localize_bitmap(worker, &blend.src_bitmap, &img1, drawable);
localize_mask(worker, &blend.mask, &img2);
canvas->ops->draw_blend(canvas, &drawable->red_drawable->bbox,
&clip, &blend);
@@ -3865,7 +3872,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
SpiceRop3 rop3 = drawable->red_drawable->u.rop3;
SpiceImage img1, img2, img3;
localize_brush(worker, &rop3.brush, &img1);
- localize_bitmap(worker, &rop3.src_bitmap, &img2);
+ localize_bitmap(worker, &rop3.src_bitmap, &img2, drawable);
localize_mask(worker, &rop3.mask, &img3);
canvas->ops->draw_rop3(canvas, &drawable->red_drawable->bbox,
&clip, &rop3);