1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
From d0c6df12a42e2339d323048ff51ae25eea1a3c07 Mon Sep 17 00:00:00 2001
From: Adric Blake <promarbler14@gmail.com>
Date: Fri, 1 Sep 2023 21:30:19 -0400
Subject: [PATCH] Remove weak pointers on dispose
A weak pointer has a callback that will happily overwrite freed object memory if the weakly referenced object outlives the object storing the reference. Remove those callbacks when they are no longer needed.
---
libmatemixer/matemixer-device-switch.c | 17 +++++++++++++++++
libmatemixer/matemixer-stream-control.c | 15 +++++++++++++++
libmatemixer/matemixer-stream-switch.c | 17 +++++++++++++++++
libmatemixer/matemixer-stream.c | 4 ++++
4 files changed, 53 insertions(+)
diff --git a/libmatemixer/matemixer-device-switch.c b/libmatemixer/matemixer-device-switch.c
index 51e946e..a8fa18c 100644
--- a/libmatemixer/matemixer-device-switch.c
+++ b/libmatemixer/matemixer-device-switch.c
@@ -53,6 +53,8 @@ static void mate_mixer_device_switch_set_property (GObject *o
const GValue *value,
GParamSpec *pspec);
+static void mate_mixer_device_switch_dispose (GObject *object);
+
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MateMixerDeviceSwitch, mate_mixer_device_switch, MATE_MIXER_TYPE_SWITCH)
static void
@@ -61,6 +63,7 @@ mate_mixer_device_switch_class_init (MateMixerDeviceSwitchClass *klass)
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_device_switch_dispose;
object_class->get_property = mate_mixer_device_switch_get_property;
object_class->set_property = mate_mixer_device_switch_set_property;
@@ -143,6 +146,20 @@ mate_mixer_device_switch_init (MateMixerDeviceSwitch *swtch)
swtch->priv = mate_mixer_device_switch_get_instance_private (swtch);
}
+static void
+mate_mixer_device_switch_dispose (GObject *object)
+{
+ MateMixerDeviceSwitch *swtch;
+
+ swtch = MATE_MIXER_DEVICE_SWITCH (object);
+
+ if (swtch->priv->device != NULL)
+ g_object_remove_weak_pointer(G_OBJECT (swtch->priv->device),
+ (gpointer *) &swtch->priv->device);
+
+ G_OBJECT_CLASS (mate_mixer_device_switch_parent_class)->dispose (object);
+}
+
/**
* mate_mixer_device_switch_get_role:
* @swtch: a #MateMixerDeviceSwitch
diff --git a/libmatemixer/matemixer-stream-control.c b/libmatemixer/matemixer-stream-control.c
index df02df1..fa1829a 100644
--- a/libmatemixer/matemixer-stream-control.c
+++ b/libmatemixer/matemixer-stream-control.c
@@ -75,6 +75,7 @@ static void mate_mixer_stream_control_set_property (GObject
const GValue *value,
GParamSpec *pspec);
+static void mate_mixer_stream_control_dispose (GObject *object);
static void mate_mixer_stream_control_finalize (GObject *object);
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MateMixerStreamControl, mate_mixer_stream_control, G_TYPE_OBJECT)
@@ -85,6 +86,7 @@ mate_mixer_stream_control_class_init (MateMixerStreamControlClass *klass)
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_stream_control_dispose;
object_class->finalize = mate_mixer_stream_control_finalize;
object_class->get_property = mate_mixer_stream_control_get_property;
object_class->set_property = mate_mixer_stream_control_set_property;
@@ -284,6 +286,19 @@ mate_mixer_stream_control_init (MateMixerStreamControl *control)
control->priv = mate_mixer_stream_control_get_instance_private (control);
}
+static void
+mate_mixer_stream_control_dispose (GObject *object)
+{
+ MateMixerStreamControl *control;
+
+ control = MATE_MIXER_STREAM_CONTROL (object);
+ if (control->priv->stream != NULL)
+ g_object_remove_weak_pointer(G_OBJECT (control->priv->stream),
+ (gpointer *) &control->priv->stream);
+
+ G_OBJECT_CLASS (mate_mixer_stream_control_parent_class)->dispose (object);
+}
+
static void
mate_mixer_stream_control_finalize (GObject *object)
{
diff --git a/libmatemixer/matemixer-stream-switch.c b/libmatemixer/matemixer-stream-switch.c
index 814918d..cfb74c8 100644
--- a/libmatemixer/matemixer-stream-switch.c
+++ b/libmatemixer/matemixer-stream-switch.c
@@ -55,6 +55,8 @@ static void mate_mixer_stream_switch_set_property (GObject *o
const GValue *value,
GParamSpec *pspec);
+static void mate_mixer_stream_switch_dispose (GObject *object);
+
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MateMixerStreamSwitch, mate_mixer_stream_switch, MATE_MIXER_TYPE_SWITCH)
static void
@@ -63,6 +65,7 @@ mate_mixer_stream_switch_class_init (MateMixerStreamSwitchClass *klass)
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_stream_switch_dispose;
object_class->get_property = mate_mixer_stream_switch_get_property;
object_class->set_property = mate_mixer_stream_switch_set_property;
@@ -161,6 +164,20 @@ mate_mixer_stream_switch_init (MateMixerStreamSwitch *swtch)
swtch->priv = mate_mixer_stream_switch_get_instance_private (swtch);
}
+static void
+mate_mixer_stream_switch_dispose (GObject *object)
+{
+ MateMixerStreamSwitch *swtch;
+
+ swtch = MATE_MIXER_STREAM_SWITCH (object);
+
+ if (swtch->priv->stream != NULL)
+ g_object_remove_weak_pointer(G_OBJECT (swtch->priv->stream),
+ (gpointer *) &swtch->priv->stream);
+
+ G_OBJECT_CLASS (mate_mixer_stream_switch_parent_class)->dispose (object);
+}
+
/**
* mate_mixer_stream_switch_get_flags:
* @swtch: a #MateMixerStreamSwitch
diff --git a/libmatemixer/matemixer-stream.c b/libmatemixer/matemixer-stream.c
index ca7bc81..41da51b 100644
--- a/libmatemixer/matemixer-stream.c
+++ b/libmatemixer/matemixer-stream.c
@@ -281,6 +281,10 @@ mate_mixer_stream_dispose (GObject *object)
stream = MATE_MIXER_STREAM (object);
+ if (stream->priv->device != NULL)
+ g_object_remove_weak_pointer (G_OBJECT (stream->priv->device),
+ (gpointer *) &stream->priv->device);
+
g_clear_object (&stream->priv->control);
G_OBJECT_CLASS (mate_mixer_stream_parent_class)->dispose (object);
|