mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-22 17:08:53 +02:00
GDBusWorker: as a precaution, access 'stopped' boolean atomically
This member is written in _g_dbus_worker_stop from arbitrary threads, and read by the worker thread, so it should be accessed atomically. Bug: https://bugzilla.gnome.org/show_bug.cgi?id=651268 Bug-NB: NB#271520 Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk> Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
committed by
David Zeuthen
parent
407b4cf8c4
commit
e128c045eb
@@ -392,7 +392,8 @@ struct GDBusWorker
|
|||||||
{
|
{
|
||||||
volatile gint ref_count;
|
volatile gint ref_count;
|
||||||
|
|
||||||
gboolean stopped;
|
/* really a boolean, but GLib 2.28 lacks atomic boolean ops */
|
||||||
|
volatile gint stopped;
|
||||||
|
|
||||||
/* TODO: frozen (e.g. G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) currently
|
/* TODO: frozen (e.g. G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) currently
|
||||||
* only affects messages received from the other peer (since GDBusServer is the
|
* only affects messages received from the other peer (since GDBusServer is the
|
||||||
@@ -526,7 +527,7 @@ _g_dbus_worker_emit_disconnected (GDBusWorker *worker,
|
|||||||
gboolean remote_peer_vanished,
|
gboolean remote_peer_vanished,
|
||||||
GError *error)
|
GError *error)
|
||||||
{
|
{
|
||||||
if (!worker->stopped)
|
if (!g_atomic_int_get (&worker->stopped))
|
||||||
worker->disconnected_callback (worker, remote_peer_vanished, error, worker->user_data);
|
worker->disconnected_callback (worker, remote_peer_vanished, error, worker->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -534,7 +535,7 @@ static void
|
|||||||
_g_dbus_worker_emit_message_received (GDBusWorker *worker,
|
_g_dbus_worker_emit_message_received (GDBusWorker *worker,
|
||||||
GDBusMessage *message)
|
GDBusMessage *message)
|
||||||
{
|
{
|
||||||
if (!worker->stopped)
|
if (!g_atomic_int_get (&worker->stopped))
|
||||||
worker->message_received_callback (worker, message, worker->user_data);
|
worker->message_received_callback (worker, message, worker->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,7 +544,7 @@ _g_dbus_worker_emit_message_about_to_be_sent (GDBusWorker *worker,
|
|||||||
GDBusMessage *message)
|
GDBusMessage *message)
|
||||||
{
|
{
|
||||||
GDBusMessage *ret;
|
GDBusMessage *ret;
|
||||||
if (!worker->stopped)
|
if (!g_atomic_int_get (&worker->stopped))
|
||||||
ret = worker->message_about_to_be_sent_callback (worker, message, worker->user_data);
|
ret = worker->message_about_to_be_sent_callback (worker, message, worker->user_data);
|
||||||
else
|
else
|
||||||
ret = message;
|
ret = message;
|
||||||
@@ -625,7 +626,7 @@ _g_dbus_worker_do_read_cb (GInputStream *input_stream,
|
|||||||
g_mutex_lock (worker->read_lock);
|
g_mutex_lock (worker->read_lock);
|
||||||
|
|
||||||
/* If already stopped, don't even process the reply */
|
/* If already stopped, don't even process the reply */
|
||||||
if (worker->stopped)
|
if (g_atomic_int_get (&worker->stopped))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
@@ -1684,7 +1685,7 @@ _g_dbus_worker_close (GDBusWorker *worker,
|
|||||||
void
|
void
|
||||||
_g_dbus_worker_stop (GDBusWorker *worker)
|
_g_dbus_worker_stop (GDBusWorker *worker)
|
||||||
{
|
{
|
||||||
worker->stopped = TRUE;
|
g_atomic_int_set (&worker->stopped, TRUE);
|
||||||
|
|
||||||
/* cancel any pending operations and schedule a close of the underlying I/O
|
/* cancel any pending operations and schedule a close of the underlying I/O
|
||||||
* stream in the worker thread
|
* stream in the worker thread
|
||||||
|
Reference in New Issue
Block a user