Fix a critical warning when downloading files

The call to g_proxy_resolver_get_default() is (transfer none) and so unref'ing
it causes GLib to get very upset. Also, move it to be per-FwupdClient rather
than per-request as it can be expensive to call in the PAC-runner case.
This commit is contained in:
Richard Hughes 2021-04-30 10:30:54 +01:00
parent 197d3dc3b9
commit 76cafb29b7

View File

@ -61,6 +61,7 @@ typedef struct {
gchar *host_security_id; gchar *host_security_id;
GMutex proxy_mutex; /* for @proxy */ GMutex proxy_mutex; /* for @proxy */
GDBusProxy *proxy; GDBusProxy *proxy;
GProxyResolver *proxy_resolver;
gchar *user_agent; gchar *user_agent;
#ifdef SOUP_SESSION_COMPAT #ifdef SOUP_SESSION_COMPAT
GObject *soup_session; GObject *soup_session;
@ -74,7 +75,6 @@ typedef struct {
CURL *curl; CURL *curl;
curl_mime *mime; curl_mime *mime;
struct curl_slist *headers; struct curl_slist *headers;
GProxyResolver *proxy_resolver;
} FwupdCurlHelper; } FwupdCurlHelper;
#endif #endif
@ -122,8 +122,6 @@ fwupd_client_curl_helper_free (FwupdCurlHelper *helper)
curl_slist_free_all (helper->headers); curl_slist_free_all (helper->headers);
if (helper->urls != NULL) if (helper->urls != NULL)
g_ptr_array_unref (helper->urls); g_ptr_array_unref (helper->urls);
if (helper->proxy_resolver != NULL)
g_object_unref (helper->proxy_resolver);
g_free (helper); g_free (helper);
} }
@ -541,12 +539,15 @@ fwupd_client_progress_callback_cb (void *clientp,
} }
static void static void
fwupd_client_curl_helper_set_proxy (FwupdCurlHelper *helper, const gchar *url) fwupd_client_curl_helper_set_proxy (FwupdClient *self,
FwupdCurlHelper *helper,
const gchar *url)
{ {
FwupdClientPrivate *priv = GET_PRIVATE (self);
g_auto(GStrv) proxies = NULL; g_auto(GStrv) proxies = NULL;
g_autoptr(GError) error_local = NULL; g_autoptr(GError) error_local = NULL;
proxies = g_proxy_resolver_lookup (helper->proxy_resolver, url, proxies = g_proxy_resolver_lookup (priv->proxy_resolver, url,
NULL, &error_local); NULL, &error_local);
if (proxies == NULL) { if (proxies == NULL) {
g_warning ("failed to lookup proxy for %s: %s", g_warning ("failed to lookup proxy for %s: %s",
@ -588,9 +589,6 @@ fwupd_client_curl_new (FwupdClient *self, GError **error)
if (g_getenv ("DISABLE_SSL_STRICT") != NULL) if (g_getenv ("DISABLE_SSL_STRICT") != NULL)
curl_easy_setopt (helper->curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt (helper->curl, CURLOPT_SSL_VERIFYPEER, 0L);
/* get system-wide proxy settings */
helper->proxy_resolver = g_proxy_resolver_get_default ();
/* this disables the double-compression of the firmware.xml.gz file */ /* this disables the double-compression of the firmware.xml.gz file */
curl_easy_setopt (helper->curl, CURLOPT_HTTP_CONTENT_DECODING, 0L); curl_easy_setopt (helper->curl, CURLOPT_HTTP_CONTENT_DECODING, 0L);
return g_steal_pointer (&helper); return g_steal_pointer (&helper);
@ -4456,7 +4454,7 @@ fwupd_client_download_bytes_thread_cb (GTask *task,
const gchar *url = g_ptr_array_index (helper->urls, i); const gchar *url = g_ptr_array_index (helper->urls, i);
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
g_debug ("downloading %s", url); g_debug ("downloading %s", url);
fwupd_client_curl_helper_set_proxy (helper, url); fwupd_client_curl_helper_set_proxy (self, helper, url);
if (fwupd_client_is_url_http (url)) { if (fwupd_client_is_url_http (url)) {
blob = fwupd_client_download_http (self, helper->curl, url, &error); blob = fwupd_client_download_http (self, helper->curl, url, &error);
if (blob != NULL) if (blob != NULL)
@ -5062,6 +5060,7 @@ fwupd_client_init (FwupdClient *self)
g_mutex_init (&priv->proxy_mutex); g_mutex_init (&priv->proxy_mutex);
g_mutex_init (&priv->idle_mutex); g_mutex_init (&priv->idle_mutex);
priv->idle_sources = g_ptr_array_new_with_free_func ((GDestroyNotify) fwupd_client_context_helper_free); priv->idle_sources = g_ptr_array_new_with_free_func ((GDestroyNotify) fwupd_client_context_helper_free);
priv->proxy_resolver = g_proxy_resolver_get_default ();
} }
static void static void