GThreadedResolver: don't overwrite errors

If a dns op was cancelled and then the abandoned op failed, it would
try to overwrite the original error. Fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=658769
This commit is contained in:
Dan Winship 2011-09-20 16:58:34 -04:00
parent 88b3f6b866
commit 855e13cc0a

View File

@ -233,7 +233,7 @@ g_threaded_resolver_request_unref (GThreadedResolverRequest *req)
static void static void
g_threaded_resolver_request_complete (GThreadedResolverRequest *req, g_threaded_resolver_request_complete (GThreadedResolverRequest *req,
gboolean cancelled) GError *error)
{ {
g_mutex_lock (req->mutex); g_mutex_lock (req->mutex);
if (req->complete) if (req->complete)
@ -242,18 +242,18 @@ g_threaded_resolver_request_complete (GThreadedResolverRequest *req,
* well. But we have nowhere to send the result, so just return. * well. But we have nowhere to send the result, so just return.
*/ */
g_mutex_unlock (req->mutex); g_mutex_unlock (req->mutex);
g_clear_error (&error);
return; return;
} }
req->complete = TRUE; req->complete = TRUE;
g_mutex_unlock (req->mutex); g_mutex_unlock (req->mutex);
if (error)
g_propagate_error (&req->error, error);
if (req->cancellable) if (req->cancellable)
{ {
/* Possibly propagate a cancellation error */
if (cancelled && !req->error)
g_cancellable_set_error_if_cancelled (req->cancellable, &req->error);
/* Drop the signal handler's ref on @req */ /* Drop the signal handler's ref on @req */
g_signal_handlers_disconnect_by_func (req->cancellable, request_cancelled, req); g_signal_handlers_disconnect_by_func (req->cancellable, request_cancelled, req);
g_object_unref (req->cancellable); g_object_unref (req->cancellable);
@ -281,8 +281,10 @@ request_cancelled (GCancellable *cancellable,
gpointer user_data) gpointer user_data)
{ {
GThreadedResolverRequest *req = user_data; GThreadedResolverRequest *req = user_data;
GError *error = NULL;
g_threaded_resolver_request_complete (req, TRUE); g_cancellable_set_error_if_cancelled (req->cancellable, &error);
g_threaded_resolver_request_complete (req, error);
/* We can't actually cancel the resolver thread; it will eventually /* We can't actually cancel the resolver thread; it will eventually
* complete on its own and call request_complete() again, which will * complete on its own and call request_complete() again, which will
@ -302,9 +304,10 @@ threaded_resolver_thread (gpointer thread_data,
gpointer pool_data) gpointer pool_data)
{ {
GThreadedResolverRequest *req = thread_data; GThreadedResolverRequest *req = thread_data;
GError *error = NULL;
req->resolve_func (req, &req->error); req->resolve_func (req, &error);
g_threaded_resolver_request_complete (req, FALSE); g_threaded_resolver_request_complete (req, error);
g_threaded_resolver_request_unref (req); g_threaded_resolver_request_unref (req);
} }