summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-05-26 16:08:10 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-05-26 16:08:10 +0100
commitd408af59e2e5066ee87a6ef9c718500b335f704c (patch)
tree1131c8816450cc4480b6f9498f236991ede74ac3
parentfd0180aeca1b266bf4212ce63ca01c36bd151762 (diff)
downloadtelepathy-mission-control-d408af59e2e5066ee87a6ef9c718500b335f704c.tar.gz
mcd_account_check_parameters: don't assume that borrowed parameters remain valid
-rw-r--r--src/mcd-account.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/mcd-account.c b/src/mcd-account.c
index 0b2a652f..06d78cc6 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"
@@ -2124,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)
{
@@ -2139,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
{
@@ -2158,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);
}
}
}
@@ -2169,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;