summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-05-26 16:22:04 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-05-26 16:22:07 +0100
commitc773108d1729d00ed832d93c2246e14cb81ec12a (patch)
tree546be86d85a050aa633a01a98799391953fe9bc9
parent6cf8ed2299d4e473550c1f828ac9af596c607721 (diff)
parent80b75c38c6147eee494e8bf0d63309f4555d8d03 (diff)
downloadtelepathy-mission-control-c773108d1729d00ed832d93c2246e14cb81ec12a.tar.gz
Merge branch '54-unsafe-param-reuse' into telepathy-mission-control-5.4
Reviewed-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
-rw-r--r--src/Makefile.am1
-rw-r--r--src/mcd-account.c68
-rw-r--r--src/mcd-manager-priv.h39
-rw-r--r--src/mcd-manager.c89
4 files changed, 177 insertions, 20 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index df5b8bf4..56434a5f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -151,6 +151,7 @@ libmcd_convenience_la_SOURCES = \
mcd-master.c \
mcd-master-priv.h \
mcd-manager.c \
+ mcd-manager-priv.h \
mcd-connection.c \
mcd-connection-priv.h \
mcd-dispatcher.c \
diff --git a/src/mcd-account.c b/src/mcd-account.c
index 7cd78d99..2d2a5215 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -51,6 +51,7 @@
#include "mcd-misc.h"
#include "mcd-signals-marshal.h"
#include "mcd-manager.h"
+#include "mcd-manager-priv.h"
#include "mcd-master.h"
#include "mcd-master-priv.h"
#include "mcd-dbusprop.h"
@@ -350,13 +351,14 @@ _migrate_secrets_get_cb (McdAccount *account,
const GError *error,
gpointer user_data)
{
- const gchar *name = user_data;
+ gchar *name = user_data;
if (error != NULL || value == NULL)
return;
set_parameter (account, name, value, _migrate_secrets_set_cb,
user_data);
+ g_free (name);
}
static void
@@ -377,9 +379,10 @@ _mcd_account_migrate_secrets (McdAccount *account)
{
if (p->flags & TP_CONN_MGR_PARAM_FLAG_SECRET)
{
- get_parameter_from_file (account, p->name, _migrate_secrets_get_cb,
- p->name);
+ gchar *name = g_strdup (p->name);
+ get_parameter_from_file (account, name, _migrate_secrets_get_cb,
+ name);
}
}
}
@@ -2122,12 +2125,20 @@ mcd_account_get_parameter (McdAccount *account, const gchar *name,
typedef struct
{
McdAccount *account;
+ TpConnectionManagerProtocol *protocol;
const TpConnectionManagerParam *param;
CheckParametersCb callback;
gpointer user_data;
} CheckParameterData;
static void
+check_parameter_data_free (CheckParameterData *data)
+{
+ _mcd_manager_protocol_free (data->protocol);
+ g_slice_free (CheckParameterData, data);
+}
+
+static void
check_parameters_get_param_cb (McdAccount *account, const GValue *value,
const GError *error, gpointer user_data)
{
@@ -2137,7 +2148,7 @@ check_parameters_get_param_cb (McdAccount *account, const GValue *value,
if ((account != NULL && value == NULL) || error != NULL)
{
data->callback (data->account, FALSE, data->user_data);
- g_slice_free (CheckParameterData, data);
+ check_parameter_data_free (data);
}
else
{
@@ -2156,7 +2167,7 @@ check_parameters_get_param_cb (McdAccount *account, const GValue *value,
else
{
data->callback (data->account, TRUE, data->user_data);
- g_slice_free (CheckParameterData, data);
+ check_parameter_data_free (data);
}
}
}
@@ -2167,21 +2178,24 @@ mcd_account_check_parameters (McdAccount *account,
gpointer user_data)
{
McdAccountPrivate *priv = account->priv;
- const TpConnectionManagerParam *param;
+ TpConnectionManagerProtocol *protocol;
CheckParameterData *data;
DEBUG ("called for %s", priv->unique_name);
- param = mcd_manager_get_parameters (priv->manager, priv->protocol_name);
- if (!param)
+ protocol = _mcd_manager_dup_protocol (priv->manager, priv->protocol_name);
+
+ if (protocol == NULL)
{
if (callback != NULL)
callback (account, FALSE, user_data);
+
return;
}
data = g_slice_new0 (CheckParameterData);
data->account = account;
- data->param = param;
+ data->protocol = protocol;
+ data->param = protocol->params;
data->callback = callback;
data->user_data = user_data;
@@ -2229,6 +2243,7 @@ typedef struct
GHashTableIter iter;
gchar **unset;
gchar **unset_iter;
+ TpConnectionManagerProtocol *protocol;
const TpConnectionManagerParam *param;
const GValue *new;
guint n_params;
@@ -2253,6 +2268,8 @@ set_parameters_data_free (SetParametersData *data)
if (data->dbus_properties != NULL)
g_slist_free (data->dbus_properties);
+ _mcd_manager_protocol_free (data->protocol);
+
g_slice_free (SetParametersData, data);
}
@@ -2493,12 +2510,12 @@ _mcd_account_set_parameters (McdAccount *account, GHashTable *params,
gpointer user_data)
{
McdAccountPrivate *priv = account->priv;
- const TpConnectionManagerParam *param;
GSList *dbus_properties = NULL;
GPtrArray *not_yet = NULL;
SetParametersData *data;
GError *error = NULL;
guint unset_size;
+ TpConnectionManagerProtocol *protocol;
DEBUG ("called");
if (G_UNLIKELY (!priv->manager && !load_manager (account)))
@@ -2508,8 +2525,9 @@ _mcd_account_set_parameters (McdAccount *account, GHashTable *params,
goto error;
}
- param = mcd_manager_get_parameters (priv->manager, priv->protocol_name);
- if (G_UNLIKELY (!param))
+ protocol = _mcd_manager_dup_protocol (priv->manager, priv->protocol_name);
+
+ if (G_UNLIKELY (protocol == NULL))
{
g_set_error (&error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
"Protocol %s not found", priv->protocol_name);
@@ -2524,9 +2542,10 @@ _mcd_account_set_parameters (McdAccount *account, GHashTable *params,
data = g_slice_new0 (SetParametersData);
data->account = g_object_ref (account);
+ data->protocol = protocol;
data->params = hash_table_copy (params);
data->unset = g_strdupv ((gchar **) unset);
- data->param = param;
+ data->param = protocol->params;
data->n_params = 0;
data->dbus_properties = dbus_properties;
data->not_yet = not_yet;
@@ -3134,12 +3153,20 @@ mcd_account_get_object_path (McdAccount *account)
typedef struct
{
GHashTable *params;
+ TpConnectionManagerProtocol *protocol;
const TpConnectionManagerParam *param;
McdAccountDupParametersCb callback;
gpointer user_data;
} DupParametersData;
static void
+dup_parameters_data_free (DupParametersData *data)
+{
+ _mcd_manager_protocol_free (data->protocol);
+ g_slice_free (DupParametersData, data);
+}
+
+static void
dup_parameters_get_parameter_cb (McdAccount *account,
const GValue *value,
const GError *error,
@@ -3164,7 +3191,7 @@ dup_parameters_get_parameter_cb (McdAccount *account,
{
if (data->callback != NULL)
data->callback (account, data->params, data->user_data);
- g_slice_free (DupParametersData, data);
+ dup_parameters_data_free (data);
}
}
@@ -3185,7 +3212,7 @@ _mcd_account_dup_parameters (McdAccount *account,
{
McdAccountPrivate *priv;
DupParametersData *data;
- const TpConnectionManagerParam *param;
+ TpConnectionManagerProtocol *protocol;
g_return_if_fail (MCD_IS_ACCOUNT (account));
@@ -3198,17 +3225,18 @@ _mcd_account_dup_parameters (McdAccount *account,
return;
}
- param = mcd_manager_get_parameters (priv->manager,
- priv->protocol_name);
+ protocol = _mcd_manager_dup_protocol (priv->manager,
+ priv->protocol_name);
- if (G_UNLIKELY (!param))
+ if (G_UNLIKELY (protocol == NULL))
{
callback (account, NULL, user_data);
return;
}
data = g_slice_new0 (DupParametersData);
- data->param = param;
+ data->protocol = protocol;
+ data->param = protocol->params;
data->callback = callback;
data->user_data = user_data;
@@ -3216,7 +3244,7 @@ _mcd_account_dup_parameters (McdAccount *account,
g_free,
(GDestroyNotify) tp_g_value_slice_free);
- mcd_account_get_parameter (account, param->name,
+ mcd_account_get_parameter (account, data->param->name,
dup_parameters_get_parameter_cb, data);
}
diff --git a/src/mcd-manager-priv.h b/src/mcd-manager-priv.h
new file mode 100644
index 00000000..33d47875
--- /dev/null
+++ b/src/mcd-manager-priv.h
@@ -0,0 +1,39 @@
+/* vi: set et sw=4 ts=8 cino=t0,(0: */
+/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 8 -*- */
+/*
+ * This file is part of mission-control
+ *
+ * Copyright (C) 2007-2009 Nokia Corporation.
+ * Copyright (C) 2010 Collabora Ltd.
+ *
+ * Contact: Naba Kumar <naba.kumar@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef MCD_MANAGER_PRIV_H
+#define MCD_MANAGER_PRIV_H
+
+#include "mcd-manager.h"
+
+G_BEGIN_DECLS
+
+void _mcd_manager_protocol_free (TpConnectionManagerProtocol *proto);
+TpConnectionManagerProtocol *_mcd_manager_dup_protocol (McdManager *manager,
+ const gchar *protocol);
+
+G_END_DECLS
+#endif /* MCD_MANAGER_H */
diff --git a/src/mcd-manager.c b/src/mcd-manager.c
index 7df8ccf9..69cc284f 100644
--- a/src/mcd-manager.c
+++ b/src/mcd-manager.c
@@ -38,6 +38,7 @@
#define _POSIX_C_SOURCE 200112L /* for strtok_r() */
#include "config.h"
#include "mcd-manager.h"
+#include "mcd-manager-priv.h"
#include "mcd-misc.h"
#include <stdio.h>
@@ -473,6 +474,94 @@ mcd_manager_get_parameters (McdManager *manager, const gchar *protocol)
return NULL;
}
+/* Copied from telepathy-glib 0.11.6 for _mcd_manager_copy_protocol() */
+static void
+_tp_connection_manager_param_free_contents (TpConnectionManagerParam *param)
+{
+ g_free (param->name);
+ g_free (param->dbus_signature);
+
+ if (G_IS_VALUE (&param->default_value))
+ g_value_unset (&param->default_value);
+}
+
+/* Copied from telepathy-glib 0.11.6 for _mcd_manager_copy_protocol() */
+void
+_mcd_manager_protocol_free (TpConnectionManagerProtocol *proto)
+{
+ TpConnectionManagerParam *param;
+
+ g_free (proto->name);
+
+ for (param = proto->params; param->name != NULL; param++)
+ {
+ _tp_connection_manager_param_free_contents (param);
+ }
+
+ g_free (proto->params);
+
+ g_slice_free (TpConnectionManagerProtocol, proto);
+}
+
+/* Copied from telepathy-glib 0.11.6 for _mcd_manager_copy_protocol() */
+static void
+_tp_connection_manager_param_copy_contents (
+ const TpConnectionManagerParam *in,
+ TpConnectionManagerParam *out)
+{
+ out->name = g_strdup (in->name);
+ out->dbus_signature = g_strdup (in->dbus_signature);
+ out->flags = in->flags;
+
+ if (G_IS_VALUE (&in->default_value))
+ {
+ g_value_init (&out->default_value, G_VALUE_TYPE (&in->default_value));
+ g_value_copy (&in->default_value, &out->default_value);
+ }
+}
+
+/* Copied from telepathy-glib 0.11.6's tp_connection_manager_protocol_copy();
+ * duplicated here to avoid a newer dependency in the stable branch. */
+static TpConnectionManagerProtocol *
+_mcd_manager_copy_protocol (const TpConnectionManagerProtocol *in)
+{
+ TpConnectionManagerProtocol *out = g_slice_new0 (TpConnectionManagerProtocol);
+ TpConnectionManagerParam *param;
+ GArray *params = g_array_new (TRUE, TRUE,
+ sizeof (TpConnectionManagerParam));
+
+ out->name = g_strdup (in->name);
+
+ for (param = in->params; param->name != NULL; param++)
+ {
+ TpConnectionManagerParam copy = { 0, };
+
+ _tp_connection_manager_param_copy_contents (param, &copy);
+ g_array_append_val (params, copy);
+ }
+
+ out->params = (TpConnectionManagerParam *) g_array_free (params, FALSE);
+
+ return out;
+}
+
+TpConnectionManagerProtocol *
+_mcd_manager_dup_protocol (McdManager *manager,
+ const gchar *protocol)
+{
+ const TpConnectionManagerProtocol *p;
+ g_return_val_if_fail (MCD_IS_MANAGER (manager), NULL);
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ p = tp_connection_manager_get_protocol (manager->priv->tp_conn_mgr,
+ protocol);
+
+ if (p == NULL)
+ return NULL;
+ else
+ return _mcd_manager_copy_protocol (p);
+}
+
const TpConnectionManagerParam *
mcd_manager_get_protocol_param (McdManager *manager, const gchar *protocol,
const gchar *param)