From 93351f169bc57bc993d7dbaacce601ec25b1c60f Mon Sep 17 00:00:00 2001 From: "Maciej S. Szmigiero" Date: Sun, 9 Oct 2022 23:34:06 +0200 Subject: 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. --- src/gclue-3g.c | 11 ++--- src/gclue-cdma.c | 11 ++--- src/gclue-client-info.c | 7 ++- src/gclue-compass.c | 16 ++++--- src/gclue-modem-gps.c | 11 ++--- src/gclue-modem-manager.c | 107 +++++++++++++++++++++++++++------------------- src/gclue-nmea-source.c | 32 +++++++++----- src/gclue-wifi.c | 33 +++++++------- 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; -- cgit v1.2.1