printing: Fix memory leak when listing Avahi printers
Return values of g_variant_get_child_value() were not unreffed correctly together with one value returned by g_variant_get(). Use g_variant_get_data() instead of copying each byte separately. https://bugzilla.gnome.org/show_bug.cgi?id=712799
This commit is contained in:
@ -2697,10 +2697,11 @@ avahi_service_resolver_cb (GObject *source_object,
|
|||||||
gchar *endptr;
|
gchar *endptr;
|
||||||
gchar *key;
|
gchar *key;
|
||||||
gchar *value;
|
gchar *value;
|
||||||
|
gsize length;
|
||||||
gint interface;
|
gint interface;
|
||||||
gint protocol;
|
gint protocol;
|
||||||
gint aprotocol;
|
gint aprotocol;
|
||||||
gint i, j;
|
gint i;
|
||||||
|
|
||||||
output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
|
output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
|
||||||
res,
|
res,
|
||||||
@ -2728,11 +2729,11 @@ avahi_service_resolver_cb (GObject *source_object,
|
|||||||
{
|
{
|
||||||
child = g_variant_get_child_value (txt, i);
|
child = g_variant_get_child_value (txt, i);
|
||||||
|
|
||||||
tmp = g_new0 (gchar, g_variant_n_children (child) + 1);
|
length = g_variant_get_size (child);
|
||||||
for (j = 0; j < g_variant_n_children (child); j++)
|
if (length > 0)
|
||||||
{
|
{
|
||||||
tmp[j] = g_variant_get_byte (g_variant_get_child_value (child, j));
|
tmp = g_strndup (g_variant_get_data (child), length);
|
||||||
}
|
g_variant_unref (child);
|
||||||
|
|
||||||
if (!avahi_txt_get_key_value_pair (tmp, &key, &value))
|
if (!avahi_txt_get_key_value_pair (tmp, &key, &value))
|
||||||
{
|
{
|
||||||
@ -2773,6 +2774,11 @@ avahi_service_resolver_cb (GObject *source_object,
|
|||||||
g_clear_pointer (&value, g_free);
|
g_clear_pointer (&value, g_free);
|
||||||
g_free (tmp);
|
g_free (tmp);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_variant_unref (child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (queue_name)
|
if (queue_name)
|
||||||
{
|
{
|
||||||
@ -2810,6 +2816,7 @@ avahi_service_resolver_cb (GObject *source_object,
|
|||||||
g_free (data);
|
g_free (data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_variant_unref (txt);
|
||||||
g_variant_unref (output);
|
g_variant_unref (output);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user