StTextureCache: Plug leaks in tiled image loading
We weren't freeing the whole pixbuf, nor were we the GList of subpixbufs. Plug both of these leaks in the error handling path and in the default case. All of the unreffing/cleanup should happen in the GDestroyNotify for the result, not some in the handler. https://bugzilla.gnome.org/show_bug.cgi?id=636489
This commit is contained in:
parent
94da2531e7
commit
bdfc516715
@ -1183,9 +1183,7 @@ on_sliced_image_loaded (GObject *source_object,
|
|||||||
{
|
{
|
||||||
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data));
|
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data));
|
||||||
clutter_actor_hide (actor);
|
clutter_actor_hide (actor);
|
||||||
|
|
||||||
clutter_container_add_actor (CLUTTER_CONTAINER (data->group), actor);
|
clutter_container_add_actor (CLUTTER_CONTAINER (data->group), actor);
|
||||||
g_object_unref (list->data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1198,6 +1196,17 @@ on_data_destroy (gpointer data)
|
|||||||
g_free (d);
|
g_free (d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_glist_unref_gobjects (gpointer p)
|
||||||
|
{
|
||||||
|
GList *list = p;
|
||||||
|
GList *iter;
|
||||||
|
|
||||||
|
for (iter = list; iter; iter = iter->next)
|
||||||
|
g_object_unref (iter->data);
|
||||||
|
g_list_free (list);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_sliced_image (GSimpleAsyncResult *result,
|
load_sliced_image (GSimpleAsyncResult *result,
|
||||||
GObject *object,
|
GObject *object,
|
||||||
@ -1223,17 +1232,14 @@ load_sliced_image (GSimpleAsyncResult *result,
|
|||||||
for (x = 0; x < width; x += data->grid_height)
|
for (x = 0; x < width; x += data->grid_height)
|
||||||
{
|
{
|
||||||
GdkPixbuf *pixbuf = gdk_pixbuf_new_subpixbuf (pix, x, y, data->grid_width, data->grid_height);
|
GdkPixbuf *pixbuf = gdk_pixbuf_new_subpixbuf (pix, x, y, data->grid_width, data->grid_height);
|
||||||
if (!pixbuf)
|
g_assert (pixbuf != NULL);
|
||||||
{
|
|
||||||
g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
|
|
||||||
"Has failed thumbnail");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
res = g_list_append (res, pixbuf);
|
res = g_list_append (res, pixbuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (res)
|
/* We don't need the original pixbuf anymore, though the subpixbufs
|
||||||
g_simple_async_result_set_op_res_gpointer (result, res, (GDestroyNotify)g_list_free);
|
will hold a reference. */
|
||||||
|
g_object_unref (pix);
|
||||||
|
g_simple_async_result_set_op_res_gpointer (result, res, free_glist_unref_gobjects);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user