summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2020-04-06 11:17:54 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2020-04-06 11:17:54 +0200
commit62746068d51c2f2d89ca8387744f6de5b6eccfa7 (patch)
tree63bd4b0e6ed7982b184ad1c7da1e70dc62eaadda
parent163118b7734b32f057a824aa1add23cccf9bf6a1 (diff)
parentb6397279f9efd8beb9f8449dbaca9dd425b588cc (diff)
downloadnetwork-manager-applet-62746068d51c2f2d89ca8387744f6de5b6eccfa7.tar.gz
applet: merge branch 'bg/vpn-request-crash-rh1775278'
https://bugzilla.redhat.com/show_bug.cgi?id=1775278 https://gitlab.gnome.org/GNOME/network-manager-applet/-/merge_requests/80
-rw-r--r--src/applet-vpn-request.c137
1 files changed, 74 insertions, 63 deletions
diff --git a/src/applet-vpn-request.c b/src/applet-vpn-request.c
index 91368f92..79dc93be 100644
--- a/src/applet-vpn-request.c
+++ b/src/applet-vpn-request.c
@@ -50,6 +50,7 @@ typedef struct {
/* These are just for the external UI mode */
EuiSecret *eui_secrets;
+ GtkDialog *dialog;
} RequestData;
typedef struct {
@@ -59,7 +60,6 @@ typedef struct {
/*****************************************************************************/
-static void request_data_free (RequestData *req_data);
static void complete_request (VpnSecretsInfo *info);
/*****************************************************************************/
@@ -125,6 +125,7 @@ external_ui_dialog_response (GtkDialog *dialog, int response_id, gpointer user_d
}
gtk_widget_destroy (GTK_WIDGET (dialog));
+ g_clear_object (&req_data->dialog);
external_ui_add_secrets (info);
complete_request (info);
}
@@ -211,7 +212,7 @@ external_ui_from_child_response (VpnSecretsInfo *info, GError **error)
* create a dialog and display it. */
if (num_ask > 0) {
dialog = (NMAVpnPasswordDialog *) nma_vpn_password_dialog_new (title, message, NULL);
- g_object_ref_sink (dialog);
+ req_data->dialog = g_object_ref_sink (dialog);
nma_vpn_password_dialog_set_show_password (dialog, FALSE);
nma_vpn_password_dialog_set_show_password_secondary (dialog, FALSE);
@@ -582,10 +583,80 @@ auth_dialog_spawn (const char *con_id,
/*****************************************************************************/
+static gboolean
+ensure_killed (gpointer data)
+{
+ pid_t pid = GPOINTER_TO_INT (data);
+
+ kill (pid, SIGKILL);
+ waitpid (pid, NULL, 0);
+ return FALSE;
+}
+
+static void
+dialog_response_destroy (GtkDialog *dialog, int response_id, gpointer user_data)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ g_object_unref (dialog);
+}
+
static void
free_vpn_secrets_info (SecretsRequest *req)
{
- request_data_free (((VpnSecretsInfo *) req)->req_data);
+
+ RequestData *req_data;
+ guint i;
+
+ req_data = ((VpnSecretsInfo *) req)->req_data;
+
+ if (!req_data)
+ return;
+
+ g_free (req_data->uuid);
+ g_free (req_data->id);
+ g_free (req_data->service_type);
+
+ nm_clear_g_source (&req_data->watch_id);
+
+ nm_clear_g_source (&req_data->channel_eventid);
+ if (req_data->channel)
+ g_io_channel_unref (req_data->channel);
+
+ if (req_data->pid) {
+ if (kill (req_data->pid, SIGTERM) == 0)
+ g_timeout_add_seconds (2, ensure_killed, GINT_TO_POINTER (req_data->pid));
+ else {
+ kill (req_data->pid, SIGKILL);
+ waitpid (req_data->pid, NULL, 0);
+ }
+ }
+
+ if (req_data->child_response)
+ g_string_free (req_data->child_response, TRUE);
+
+ g_variant_builder_clear (&req_data->secrets_builder);
+
+ if (req_data->eui_secrets) {
+ for (i = 0; req_data->eui_secrets[i].name; i++) {
+ g_free (req_data->eui_secrets[i].name);
+ g_free (req_data->eui_secrets[i].label);
+ g_free (req_data->eui_secrets[i].value);
+ }
+ g_free (req_data->eui_secrets);
+ }
+
+ if (req_data->dialog) {
+ g_signal_handlers_disconnect_by_func (req_data->dialog,
+ external_ui_dialog_response,
+ req);
+ g_signal_connect (req_data->dialog,
+ "response",
+ G_CALLBACK (dialog_response_destroy),
+ NULL);
+ req_data->dialog = NULL;
+ }
+
+ g_slice_free (RequestData, req_data);
}
gboolean
@@ -675,63 +746,3 @@ applet_vpn_request_get_secrets (SecretsRequest *req, GError **error)
/* Dump parts of the connection to the child */
return TRUE;
}
-
-/*****************************************************************************/
-
-static gboolean
-ensure_killed (gpointer data)
-{
- pid_t pid = GPOINTER_TO_INT (data);
-
- if (kill (pid, 0) == 0)
- kill (pid, SIGKILL);
- /* ensure the child is reaped */
- waitpid (pid, NULL, 0);
- return FALSE;
-}
-
-static void
-request_data_free (RequestData *req_data)
-{
- guint i;
-
- if (!req_data)
- return;
-
- g_free (req_data->uuid);
- g_free (req_data->id);
- g_free (req_data->service_type);
-
- nm_clear_g_source (&req_data->watch_id);
-
- nm_clear_g_source (&req_data->channel_eventid);
- if (req_data->channel)
- g_io_channel_unref (req_data->channel);
-
- if (req_data->pid) {
- g_spawn_close_pid (req_data->pid);
- if (kill (req_data->pid, SIGTERM) == 0)
- g_timeout_add_seconds (2, ensure_killed, GINT_TO_POINTER (req_data->pid));
- else {
- kill (req_data->pid, SIGKILL);
- /* ensure the child is reaped */
- waitpid (req_data->pid, NULL, 0);
- }
- }
-
- if (req_data->child_response)
- g_string_free (req_data->child_response, TRUE);
-
- g_variant_builder_clear (&req_data->secrets_builder);
-
- if (req_data->eui_secrets) {
- for (i = 0; req_data->eui_secrets[i].name; i++) {
- g_free (req_data->eui_secrets[i].name);
- g_free (req_data->eui_secrets[i].label);
- g_free (req_data->eui_secrets[i].value);
- }
- g_free (req_data->eui_secrets);
- }
-
- g_slice_free (RequestData, req_data);
-}