mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-03 22:52:09 +01:00
gthreadedresolver: fix a bug in the GTask porting of lookup_records
We were passing the wrong destroy notify when returning the list of records, so it would crash if it got called (ie, if you didn't call g_resolver_lookup_records_finish()). (Also fix s/targets/records/ throughout the records functions.)
This commit is contained in:
parent
edeffe0c87
commit
f1b34cab8a
@ -196,6 +196,12 @@ free_lookup_records_data (LookupRecordsData *lrd)
|
|||||||
g_slice_free (LookupRecordsData, lrd);
|
g_slice_free (LookupRecordsData, lrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_records (GList *records)
|
||||||
|
{
|
||||||
|
g_list_free_full (records, (GDestroyNotify) g_variant_unref);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_lookup_records (GTask *task,
|
do_lookup_records (GTask *task,
|
||||||
gpointer source_object,
|
gpointer source_object,
|
||||||
@ -203,7 +209,7 @@ do_lookup_records (GTask *task,
|
|||||||
GCancellable *cancellable)
|
GCancellable *cancellable)
|
||||||
{
|
{
|
||||||
LookupRecordsData *lrd = task_data;
|
LookupRecordsData *lrd = task_data;
|
||||||
GList *targets;
|
GList *records;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
#if defined(G_OS_UNIX)
|
#if defined(G_OS_UNIX)
|
||||||
gint len = 512;
|
gint len = 512;
|
||||||
@ -229,7 +235,7 @@ do_lookup_records (GTask *task,
|
|||||||
}
|
}
|
||||||
|
|
||||||
herr = h_errno;
|
herr = h_errno;
|
||||||
targets = _g_resolver_records_from_res_query (lrd->rrname, rrtype, answer->data, len, herr, &error);
|
records = _g_resolver_records_from_res_query (lrd->rrname, rrtype, answer->data, len, herr, &error);
|
||||||
g_byte_array_free (answer, TRUE);
|
g_byte_array_free (answer, TRUE);
|
||||||
|
|
||||||
#elif defined(G_OS_WIN32)
|
#elif defined(G_OS_WIN32)
|
||||||
@ -239,15 +245,14 @@ do_lookup_records (GTask *task,
|
|||||||
|
|
||||||
dnstype = _g_resolver_record_type_to_dnstype (lrd->record_type);
|
dnstype = _g_resolver_record_type_to_dnstype (lrd->record_type);
|
||||||
status = DnsQuery_A (lrd->rrname, dnstype, DNS_QUERY_STANDARD, NULL, &results, NULL);
|
status = DnsQuery_A (lrd->rrname, dnstype, DNS_QUERY_STANDARD, NULL, &results, NULL);
|
||||||
targets = _g_resolver_records_from_DnsQuery (lrd->rrname, dnstype, status, results, &error);
|
records = _g_resolver_records_from_DnsQuery (lrd->rrname, dnstype, status, results, &error);
|
||||||
if (results != NULL)
|
if (results != NULL)
|
||||||
DnsRecordListFree (results, DnsFreeRecordList);
|
DnsRecordListFree (results, DnsFreeRecordList);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (targets)
|
if (records)
|
||||||
{
|
{
|
||||||
g_task_return_pointer (task, targets,
|
g_task_return_pointer (task, records, (GDestroyNotify) free_records);
|
||||||
(GDestroyNotify)g_resolver_free_targets);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
g_task_return_error (task, error);
|
g_task_return_error (task, error);
|
||||||
@ -261,7 +266,7 @@ lookup_records (GResolver *resolver,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
GTask *task;
|
GTask *task;
|
||||||
GList *targets;
|
GList *records;
|
||||||
LookupRecordsData *lrd;
|
LookupRecordsData *lrd;
|
||||||
|
|
||||||
task = g_task_new (resolver, cancellable, NULL, NULL);
|
task = g_task_new (resolver, cancellable, NULL, NULL);
|
||||||
@ -273,10 +278,10 @@ lookup_records (GResolver *resolver,
|
|||||||
|
|
||||||
g_task_set_return_on_cancel (task, TRUE);
|
g_task_set_return_on_cancel (task, TRUE);
|
||||||
g_task_run_in_thread_sync (task, do_lookup_records);
|
g_task_run_in_thread_sync (task, do_lookup_records);
|
||||||
targets = g_task_propagate_pointer (task, error);
|
records = g_task_propagate_pointer (task, error);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
|
|
||||||
return targets;
|
return records;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user