summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej S. Szmigiero <mail@maciej.szmigiero.name>2022-10-09 23:34:06 +0200
committerMaciej S. Szmigiero <mail@maciej.szmigiero.name>2022-10-11 14:51:41 +0200
commit93351f169bc57bc993d7dbaacce601ec25b1c60f (patch)
tree4316a134b4200a353c49c9cd774d804371b2b6ce
parent3689c50e15b7e67017f961f66605d2de68c08a64 (diff)
downloadgeoclue-93351f169bc57bc993d7dbaacce601ec25b1c60f.tar.gz
Make sure to not cast user_data to GObjects in callback if call is canceled
This can abort at runtime if the object pointed to by user_data is already gone by the time the callback is run.
-rw-r--r--src/gclue-3g.c11
-rw-r--r--src/gclue-cdma.c11
-rw-r--r--src/gclue-client-info.c7
-rw-r--r--src/gclue-compass.c16
-rw-r--r--src/gclue-modem-gps.c11
-rw-r--r--src/gclue-modem-manager.c107
-rw-r--r--src/gclue-nmea-source.c32
-rw-r--r--src/gclue-wifi.c33
8 files changed, 133 insertions, 95 deletions
diff --git a/src/gclue-3g.c b/src/gclue-3g.c
index fef6c93..3166a7b 100644
--- a/src/gclue-3g.c
+++ b/src/gclue-3g.c
@@ -83,14 +83,15 @@ on_3g_enabled (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
- GClue3G *source = GCLUE_3G (user_data);
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
- if (!gclue_modem_enable_3g_finish (source->priv->modem,
+ if (!gclue_modem_enable_3g_finish (GCLUE_MODEM (source_object),
result,
&error)) {
- g_warning ("Failed to enable 3GPP: %s", error->message);
- g_error_free (error);
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to enable 3GPP: %s", error->message);
+ }
}
}
diff --git a/src/gclue-cdma.c b/src/gclue-cdma.c
index 602660b..d6c0561 100644
--- a/src/gclue-cdma.c
+++ b/src/gclue-cdma.c
@@ -79,14 +79,15 @@ on_cdma_enabled (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
- GClueCDMA *source = GCLUE_CDMA (user_data);
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
- if (!gclue_modem_enable_cdma_finish (source->priv->modem,
+ if (!gclue_modem_enable_cdma_finish (GCLUE_MODEM (source_object),
result,
&error)) {
- g_warning ("Failed to enable CDMA: %s", error->message);
- g_error_free (error);
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to enable CDMA: %s", error->message);
+ }
}
}
diff --git a/src/gclue-client-info.c b/src/gclue-client-info.c
index 7fc2ac7..9362c85 100644
--- a/src/gclue-client-info.c
+++ b/src/gclue-client-info.c
@@ -356,15 +356,18 @@ on_dbus_proxy_ready (GObject *source_object,
GTask *task = G_TASK (user_data);
gpointer *info = g_task_get_source_object (task);
GClueClientInfoPrivate *priv = GCLUE_CLIENT_INFO (info)->priv;
+ GDBusProxy *dbus_proxy;
GError *error = NULL;
- priv->dbus_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
- if (priv->dbus_proxy == NULL) {
+ dbus_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+ if (dbus_proxy == NULL) {
g_task_return_error (task, error);
g_object_unref (task);
return;
}
+ priv->dbus_proxy = dbus_proxy;
+
g_dbus_proxy_call (priv->dbus_proxy,
"GetConnectionUnixUser",
g_variant_new ("(s)", priv->bus_name),
diff --git a/src/gclue-compass.c b/src/gclue-compass.c
index f425aac..f5fc594 100644
--- a/src/gclue-compass.c
+++ b/src/gclue-compass.c
@@ -141,15 +141,16 @@ on_compass_claimed (GObject *source_object,
{
GClueCompass *compass;
Compass *proxy = COMPASS (source_object);
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
if (!compass_call_claim_compass_finish (proxy, res, &error)) {
- if (error->code != G_IO_ERROR_CANCELLED)
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
g_debug ("Failed to claim IIO proxy compass: %s",
error->message);
- g_error_free (error);
- g_object_unref (proxy);
+ }
+ g_object_unref (proxy);
return;
}
g_debug ("IIO compass claimed");
@@ -173,14 +174,15 @@ on_compass_proxy_ready (GObject *source_object,
{
GClueCompass *compass;
Compass *proxy;
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
proxy = compass_proxy_new_for_bus_finish (res, &error);
if (proxy == NULL) {
- if (error->code != G_IO_ERROR_CANCELLED)
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
g_debug ("Failed to connect to IIO compass proxy: %s",
error->message);
- g_error_free (error);
+ }
return;
}
diff --git a/src/gclue-modem-gps.c b/src/gclue-modem-gps.c
index c258eda..fba6bcb 100644
--- a/src/gclue-modem-gps.c
+++ b/src/gclue-modem-gps.c
@@ -80,14 +80,15 @@ on_gps_enabled (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
- GClueModemGPS *source = GCLUE_MODEM_GPS (user_data);
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
- if (!gclue_modem_enable_gps_finish (source->priv->modem,
+ if (!gclue_modem_enable_gps_finish (GCLUE_MODEM (source_object),
result,
&error)) {
- g_warning ("Failed to enable GPS: %s", error->message);
- g_error_free (error);
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to enable GPS: %s", error->message);
+ }
}
}
diff --git a/src/gclue-modem-manager.c b/src/gclue-modem-manager.c
index de7e6be..5c03d80 100644
--- a/src/gclue-modem-manager.c
+++ b/src/gclue-modem-manager.c
@@ -339,31 +339,35 @@ on_get_3gpp_ready (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data);
- GClueModemManagerPrivate *priv = manager->priv;
+ GClueModemManager *manager;
+ GClueModemManagerPrivate *priv;
MMModemLocation *modem_location = MM_MODEM_LOCATION (source_object);
g_autoptr(MMLocation3gpp) location_3gpp = NULL;
const gchar *opc;
gulong lac, cell_id;
GClueTowerTec tec = GCLUE_TOWER_TEC_3G;
#if !MM_CHECK_VERSION(1, 18, 0)
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
gchar opc_buf[GCLUE_3G_TOWER_OPERATOR_CODE_STR_LEN + 1];
location_3gpp = mm_modem_location_get_3gpp_finish (modem_location,
res,
&error);
if (error != NULL) {
- g_warning ("Failed to get location from 3GPP: %s",
- error->message);
- g_error_free (error);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to get location from 3GPP: %s",
+ error->message);
+ }
+
return;
}
#else
location_3gpp = mm_modem_location_get_signaled_3gpp (modem_location);
-
#endif
+ manager = GCLUE_MODEM_MANAGER (user_data);
+ priv = manager->priv;
+
if (location_3gpp == NULL) {
g_debug ("No 3GPP");
clear_3gpp_location (manager);
@@ -423,25 +427,29 @@ on_get_cdma_ready (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data);
+ GClueModemManager *manager;
MMModemLocation *modem_location = MM_MODEM_LOCATION (source_object);
g_autoptr(MMLocationCdmaBs) location_cdma = NULL;
#if !MM_CHECK_VERSION(1, 18, 0)
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
location_cdma = mm_modem_location_get_cdma_bs_finish (modem_location,
res,
&error);
if (error != NULL) {
- g_warning ("Failed to get location from 3GPP: %s",
- error->message);
- g_error_free (error);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to get location from CDMA: %s",
+ error->message);
+ }
+
return;
}
#else
location_cdma = mm_modem_location_get_signaled_cdma_bs (modem_location);
#endif
+ manager = GCLUE_MODEM_MANAGER (user_data);
+
if (location_cdma == NULL) {
g_debug ("No CDMA");
return;
@@ -487,29 +495,34 @@ on_get_gps_nmea_ready (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data);
- GClueModemManagerPrivate *priv = manager->priv;
+ GClueModemManager *manager;
+ GClueModemManagerPrivate *priv;
MMModemLocation *modem_location = MM_MODEM_LOCATION (source_object);
g_autoptr(MMLocationGpsNmea) location_nmea = NULL;
static const gchar *sentences[3];
const gchar *gga, *rmc;
gint i = 0;
#if !MM_CHECK_VERSION(1, 18, 0)
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
location_nmea = mm_modem_location_get_gps_nmea_finish (modem_location,
res,
&error);
if (error != NULL) {
- g_warning ("Failed to get location from NMEA information: %s",
- error->message);
- g_error_free (error);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to get location from NMEA information: %s",
+ error->message);
+ }
+
return;
}
#else
location_nmea = mm_modem_location_get_signaled_gps_nmea (modem_location);
#endif
+ manager = GCLUE_MODEM_MANAGER (user_data);
+ priv = manager->priv;
+
if (location_nmea == NULL) {
g_debug ("No NMEA");
return;
@@ -575,8 +588,9 @@ on_modem_location_setup (GObject *modem_object,
gpointer user_data)
{
GTask *task = G_TASK (user_data);
- GClueModemManager *manager;
- GClueModemManagerPrivate *priv;
+ GClueModemManager *manager = GCLUE_MODEM_MANAGER
+ (g_task_get_source_object (task));
+ GClueModemManagerPrivate *priv = manager->priv;
GError *error = NULL;
if (!mm_modem_location_setup_finish (MM_MODEM_LOCATION (modem_object),
@@ -586,8 +600,7 @@ on_modem_location_setup (GObject *modem_object,
goto out;
}
- manager = GCLUE_MODEM_MANAGER (g_task_get_source_object (task));
- priv = manager->priv;
+
g_debug ("Modem '%s' setup.", mm_object_get_path (priv->mm_object));
/* Make sure that we actually emit that signal */
@@ -612,8 +625,6 @@ enable_caps (GClueModemManager *manager,
priv->caps |= caps;
task = g_task_new (manager, cancellable, callback, user_data);
- priv = GCLUE_MODEM_MANAGER (g_task_get_source_object (task))->priv;
-
caps = mm_modem_location_get_enabled (priv->modem_location) | priv->caps;
mm_modem_location_setup (priv->modem_location,
caps,
@@ -717,15 +728,13 @@ on_gps_refresh_rate_set (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- gboolean ret;
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
- ret = mm_modem_location_set_gps_refresh_rate_finish
+ mm_modem_location_set_gps_refresh_rate_finish
(MM_MODEM_LOCATION (source_object), res, &error);
- if (!ret) {
+ if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
g_warning ("Failed to set GPS refresh rate: %s",
error->message);
- g_error_free (error);
}
}
@@ -816,20 +825,27 @@ on_manager_new_ready (GObject *modem_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data);
- GClueModemManagerPrivate *priv = manager->priv;
+ MMManager *mmmanager;
+ GClueModemManager *manager;
+ GClueModemManagerPrivate *priv;
GList *objects, *node;
- GError *error = NULL;
-
- priv->manager = mm_manager_new_finish (res, &error);
- if (priv->manager == NULL) {
- g_warning ("Failed to connect to ModemManager: %s",
- error->message);
- g_error_free (error);
+ g_autoptr(GError) error = NULL;
+
+ mmmanager = mm_manager_new_finish (res, &error);
+ if (mmmanager == NULL) {
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to connect to ModemManager: %s",
+ error->message);
+ }
return;
}
+ manager = GCLUE_MODEM_MANAGER (user_data);
+ priv = manager->priv;
+ priv->manager = mmmanager;
+
objects = g_dbus_object_manager_get_objects
(G_DBUS_OBJECT_MANAGER (priv->manager));
for (node = objects; node != NULL; node = node->next) {
@@ -859,19 +875,22 @@ on_bus_get_ready (GObject *modem_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueModemManagerPrivate *priv = GCLUE_MODEM_MANAGER (user_data)->priv;
- GDBusConnection *connection;
- GError *error = NULL;
+ GClueModemManagerPrivate *priv;
+ g_autoptr(GDBusConnection) connection = NULL;
+ g_autoptr(GError) error = NULL;
connection = g_bus_get_finish (res, &error);
if (connection == NULL) {
- g_warning ("Failed to connect to system D-Bus: %s",
- error->message);
- g_error_free (error);
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to connect to system D-Bus: %s",
+ error->message);
+ }
return;
}
+ priv = GCLUE_MODEM_MANAGER (user_data)->priv;
mm_manager_new (connection,
0,
priv->cancellable,
diff --git a/src/gclue-nmea-source.c b/src/gclue-nmea-source.c
index 248a2be..365fc44 100644
--- a/src/gclue-nmea-source.c
+++ b/src/gclue-nmea-source.c
@@ -668,8 +668,11 @@ static void nmea_skip_delim (GBufferedInputStream *stream,
delim_skip = strnspn (buf, NMEA_LINE_END, buf_size);
for (size_t ctr = 0; ctr < delim_skip; ctr++) {
if (g_buffered_input_stream_read_byte (stream, cancellable, &error) < 0) {
- g_warning ("Failed to skip %zu / %zu NMEA delimiter: %s",
- ctr, delim_skip, error->message);
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to skip %zu / %zu NMEA delimiter: %s",
+ ctr, delim_skip, error->message);
+ }
break;
}
}
@@ -692,7 +695,7 @@ on_read_nmea_sentence (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
- GClueNMEASource *source = GCLUE_NMEA_SOURCE (user_data);
+ GClueNMEASource *source = NULL;
GDataInputStream *data_input_stream = G_DATA_INPUT_STREAM (object);
g_autoptr(GError) error = NULL;
GClueLocation *prev_location;
@@ -713,11 +716,15 @@ on_read_nmea_sentence (GObject *object,
rmc[0] = '\0';
do {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ if (!source)
+ source = GCLUE_NMEA_SOURCE (user_data);
+
if (message == NULL) {
if (error != NULL) {
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- return;
- } else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED)) {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED)) {
g_debug ("NMEA socket closed.");
} else {
g_warning ("Error when receiving message: %s",
@@ -791,8 +798,8 @@ on_connection_to_location_server (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
- GClueNMEASource *source = GCLUE_NMEA_SOURCE (user_data);
GSocketClient *client = G_SOCKET_CLIENT (object);
+ GClueNMEASource *source;
g_autoptr(GSocketConnection) connection = NULL;
g_autoptr(GError) error = NULL;
@@ -801,16 +808,19 @@ on_connection_to_location_server (GObject *object,
result,
&error);
- if (error != NULL) {
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- return;
- }
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ return;
+ }
+
+ source = GCLUE_NMEA_SOURCE (user_data);
+ if (error != NULL) {
g_warning ("Failed to connect to NMEA service: %s", error->message);
service_broken (source);
return;
}
+ g_assert (connection);
g_debug ("NMEA service connected.");
g_assert (!source->priv->connection);
diff --git a/src/gclue-wifi.c b/src/gclue-wifi.c
index 6318827..97ab12c 100644
--- a/src/gclue-wifi.c
+++ b/src/gclue-wifi.c
@@ -344,18 +344,15 @@ on_bss_proxy_ready (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueWifi *wifi = GCLUE_WIFI (user_data);
+ GClueWifi *wifi;
WPABSS *bss;
g_autoptr(GError) error = NULL;
char ssid[MAX_SSID_LEN + 1] = { 0 };
bss = wpa_bss_proxy_new_for_bus_finish (res, &error);
if (bss == NULL) {
- if (error) {
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- return;
- }
-
+ if (error && !g_error_matches (error, G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
g_warning ("BSS proxy setup failed: %s",
error->message);
}
@@ -363,6 +360,8 @@ on_bss_proxy_ready (GObject *source_object,
return;
}
+ wifi = GCLUE_WIFI (user_data);
+
if (gclue_mozilla_should_ignore_bss (bss)) {
g_object_unref (bss);
@@ -596,18 +595,19 @@ on_scan_call_done (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueWifi *wifi = GCLUE_WIFI (user_data);
g_autoptr(GError) error = NULL;
- if (!wpa_interface_call_scan_finish
- (WPA_INTERFACE (source_object),
- res,
- &error)) {
- if (error) {
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- return;
- }
+ if (!wpa_interface_call_scan_finish (WPA_INTERFACE (source_object),
+ res, &error)) {
+ GClueWifi *wifi;
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ return;
+ }
+
+ wifi = GCLUE_WIFI (user_data);
+
+ if (error) {
g_warning ("Scanning of WiFi networks failed: %s",
error->message);
}
@@ -883,7 +883,7 @@ on_interface_proxy_ready (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GClueWifi *wifi = GCLUE_WIFI (user_data);
+ GClueWifi *wifi;
WPAInterface *interface;
g_autoptr(GError) error = NULL;
@@ -901,6 +901,7 @@ on_interface_proxy_ready (GObject *source_object,
return;
}
+ wifi = GCLUE_WIFI (user_data);
if (wifi->priv->interface != NULL) {
g_object_unref (interface);
return;