diff --git a/glib/gvariant.c b/glib/gvariant.c index 8ea52d50a..5256397f6 100644 --- a/glib/gvariant.c +++ b/glib/gvariant.c @@ -3746,6 +3746,7 @@ g_variant_builder_end (GVariantBuilder *builder) { GVariantType *my_type; GVariant *value; + GVariant **children; return_val_if_invalid_builder (builder, NULL); g_return_val_if_fail (GVSB(builder)->offset >= GVSB(builder)->min_items, @@ -3774,10 +3775,14 @@ g_variant_builder_end (GVariantBuilder *builder) else g_assert_not_reached (); + children = GVSB(builder)->children; + + /* shrink allocation to release extra space to allocator */ + if G_UNLIKELY (GVSB(builder)->offset < GVSB(builder)->allocated_children) + children = g_renew (GVariant *, children, GVSB(builder)->offset); + value = g_variant_new_from_children (my_type, - g_renew (GVariant *, - GVSB(builder)->children, - GVSB(builder)->offset), + children, GVSB(builder)->offset, GVSB(builder)->trusted); GVSB(builder)->children = NULL;