File: 0001_remove-weak-pointers-on-dispose.patch

package info (click to toggle)
libmatemixer 1.26.0-2%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 3,092 kB
  • sloc: ansic: 17,765; makefile: 371; xml: 34; sh: 21
file content (152 lines) | stat: -rw-r--r-- 6,705 bytes parent folder | download
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);