diff options
author | Milan Crha <mcrha@redhat.com> | 2018-03-26 15:34:50 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2018-03-26 15:38:43 +0200 |
commit | 5b80a626f4d65c49dda6b3e1f0da3a622981d175 (patch) | |
tree | d4096ad996f09c5a3abaff53981d70e3dbfc55f6 | |
parent | 4088b7e78881c1974e96b45e451df399496286e2 (diff) | |
download | libsoup-gnome-3-24.tar.gz |
Crash under soup_socket_new()gnome-3-24
https://bugzilla.gnome.org/show_bug.cgi?id=762138
-rw-r--r-- | libsoup/soup-session.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index f7aef68e..85501583 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -127,10 +127,11 @@ typedef struct { /* Must hold the conn_lock before potentially creating a new * SoupSessionHost, adding/removing a connection, - * disconnecting a connection, or moving a connection from - * IDLE to IN_USE. Must not emit signals or destroy objects - * while holding it. conn_cond is signaled when it may be - * possible for a previously-blocked message to continue. + * disconnecting a connection, moving a connection from + * IDLE to IN_USE, or when updating socket properties. + * Must not emit signals or destroy objects while holding it. + * The conn_cond is signaled when it may be possible for + * a previously-blocked message to continue. */ GMutex conn_lock; GCond conn_cond; @@ -355,6 +356,7 @@ soup_session_finalize (GObject *object) G_OBJECT_CLASS (soup_session_parent_class)->finalize (object); } +/* requires conn_lock */ static void ensure_socket_props (SoupSession *session) { @@ -770,11 +772,13 @@ soup_session_set_property (GObject *object, guint prop_id, break; } + g_mutex_lock (&priv->conn_lock); if (priv->socket_props && socket_props_changed) { soup_socket_properties_unref (priv->socket_props); priv->socket_props = NULL; ensure_socket_props (session); } + g_mutex_unlock (&priv->conn_lock); } static void @@ -794,7 +798,9 @@ soup_session_get_property (GObject *object, guint prop_id, g_value_set_boxed (value, priv->proxy_uri); break; case PROP_PROXY_RESOLVER: + g_mutex_lock (&priv->conn_lock); ensure_socket_props (session); + g_mutex_unlock (&priv->conn_lock); g_value_set_object (value, priv->proxy_resolver); break; case PROP_MAX_CONNS: @@ -815,12 +821,16 @@ soup_session_get_property (GObject *object, guint prop_id, break; case PROP_SSL_USE_SYSTEM_CA_FILE: tlsdb = g_tls_backend_get_default_database (g_tls_backend_get_default ()); + g_mutex_lock (&priv->conn_lock); ensure_socket_props (session); + g_mutex_unlock (&priv->conn_lock); g_value_set_boolean (value, priv->tlsdb == tlsdb); g_clear_object (&tlsdb); break; case PROP_TLS_DATABASE: + g_mutex_lock (&priv->conn_lock); ensure_socket_props (session); + g_mutex_unlock (&priv->conn_lock); g_value_set_object (value, priv->tlsdb); break; case PROP_TLS_INTERACTION: |