[glib/mcatanzaro/#2393: 213/216] gtlsconnection: use a vfunc to implement get_negotiated_protocol()
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/mcatanzaro/#2393: 213/216] gtlsconnection: use a vfunc to implement get_negotiated_protocol()
- Date: Mon, 21 Jun 2021 14:32:14 +0000 (UTC)
commit 5e6c2e1e2cf28287682022e57c25ea2b2ad7a7fe
Author: Michael Catanzaro <mcatanzaro gnome org>
Date: Thu Apr 29 13:47:40 2021 -0500
gtlsconnection: use a vfunc to implement get_negotiated_protocol()
The current code is unsafe to use from multiple threads at once.
GIOStream functions like this are supposed to be semi-threadsafe. It's
allowed for them to be called on both a reader thread and a writer
thread at the same time. Of course, it's still tricky and dangerous,
because it's only *really* threadsafe if the handshake has finished,
and API users have no plausible way to know that because the API
does not require performing an explicit handshake operation. But that's
a glib-networking problem. We can at least avoid the most obvious
threadsafety issue here in the API layer.
Note that we'll need to implement the new vfunc in glib-networking for
this to actually work.
Fixes #2393
gio/gtlsconnection.c | 46 ++++++----------------------------------------
gio/gtlsconnection.h | 4 +++-
2 files changed, 9 insertions(+), 41 deletions(-)
---
diff --git a/gio/gtlsconnection.c b/gio/gtlsconnection.c
index 3bd37ae97..0239489b7 100644
--- a/gio/gtlsconnection.c
+++ b/gio/gtlsconnection.c
@@ -55,12 +55,7 @@
* Since: 2.28
*/
-struct _GTlsConnectionPrivate
-{
- gchar *negotiated_protocol;
-};
-
-G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GTlsConnection, g_tls_connection, G_TYPE_IO_STREAM)
+G_DEFINE_ABSTRACT_TYPE (GTlsConnection, g_tls_connection, G_TYPE_IO_STREAM)
static void g_tls_connection_get_property (GObject *object,
guint prop_id,
@@ -70,7 +65,6 @@ static void g_tls_connection_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
-static void g_tls_connection_finalize (GObject *object);
enum {
ACCEPT_CERTIFICATE,
@@ -104,7 +98,6 @@ g_tls_connection_class_init (GTlsConnectionClass *klass)
gobject_class->get_property = g_tls_connection_get_property;
gobject_class->set_property = g_tls_connection_set_property;
- gobject_class->finalize = g_tls_connection_finalize;
/**
* GTlsConnection:base-io-stream:
@@ -413,17 +406,6 @@ g_tls_connection_set_property (GObject *object,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
-static void
-g_tls_connection_finalize (GObject *object)
-{
- GTlsConnection *conn = G_TLS_CONNECTION(object);
- GTlsConnectionPrivate *priv = g_tls_connection_get_instance_private (conn);
-
- g_clear_pointer (&priv->negotiated_protocol, g_free);
-
- G_OBJECT_CLASS (g_tls_connection_parent_class)->finalize (object);
-}
-
/**
* g_tls_connection_set_use_system_certdb:
* @conn: a #GTlsConnection
@@ -871,31 +853,15 @@ g_tls_connection_set_advertised_protocols (GTlsConnection *conn,
const gchar *
g_tls_connection_get_negotiated_protocol (GTlsConnection *conn)
{
- GTlsConnectionPrivate *priv;
- gchar *protocol;
+ GTlsConnectionClass *class;
g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL);
- g_object_get (G_OBJECT (conn),
- "negotiated-protocol", &protocol,
- NULL);
-
- /*
- * Cache the property internally so we can return a `const` pointer
- * to the caller.
- */
- priv = g_tls_connection_get_instance_private (conn);
- if (g_strcmp0 (priv->negotiated_protocol, protocol) != 0)
- {
- g_free (priv->negotiated_protocol);
- priv->negotiated_protocol = protocol;
- }
- else
- {
- g_free (protocol);
- }
+ class = G_TLS_CONNECTION_GET_CLASS (conn);
+ if (class->get_negotiated_protocol == NULL)
+ return NULL;
- return priv->negotiated_protocol;
+ return class->get_negotiated_protocol (conn);
}
/**
diff --git a/gio/gtlsconnection.h b/gio/gtlsconnection.h
index a40a253a6..90a8db8db 100644
--- a/gio/gtlsconnection.h
+++ b/gio/gtlsconnection.h
@@ -73,9 +73,11 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
GError **error);
G_GNUC_END_IGNORE_DEPRECATIONS
+ const gchar *(*get_negotiated_protocol) (GTlsConnection *conn);
+
/*< private >*/
/* Padding for future expansion */
- gpointer padding[7];
+ gpointer padding[6];
};
GLIB_AVAILABLE_IN_ALL
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]