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:
Dan Winship 2012-11-09 11:38:08 -05:00
parent edeffe0c87
commit f1b34cab8a

View File

@ -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