Skip to content

Commit

Permalink
Merge branch 'jb52114' into 'master'
Browse files Browse the repository at this point in the history
[vpn] Ignore too early VPN added signals in user change. Fixes JB#52114

See merge request mer-core/connman!300
  • Loading branch information
LaakkonenJussi committed Nov 25, 2020
2 parents f310403 + 1243b5e commit b9e8c6a
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 12 deletions.
2 changes: 2 additions & 0 deletions connman/include/storage.h
Expand Up @@ -24,6 +24,7 @@

#include <sys/types.h>
#include <glib.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
Expand All @@ -41,6 +42,7 @@ const char *connman_storage_dir_for(const char *service_id);
void connman_storage_update_finalize_cb(
void (*cb) (uid_t uid, void *user_data),
void *user_data);
bool connman_storage_user_change_in_progress();

#ifdef __cplusplus
}
Expand Down
12 changes: 12 additions & 0 deletions connman/plugins/vpn.c
Expand Up @@ -1674,6 +1674,16 @@ static gboolean connection_added(DBusConnection *conn, DBusMessage *message,
return TRUE;
}

/*
* If storage has not completed the user change paths may not be set
* yet and loading of a VPN service results in treating it as a new
* service, ignoring values in settings file.
*/
if (connman_storage_user_change_in_progress()) {
connman_info("user change in progress, ignore add signal");
return TRUE;
}

DBG("");

if (!dbus_message_iter_init(message, &iter))
Expand Down Expand Up @@ -2022,6 +2032,8 @@ static void vpn_service_state_changed(struct connman_service *service,

static void vpn_finalize(uid_t uid, void *user_data)
{
DBG("");

if (get_connections(user_data) != -EINPROGRESS)
connman_warn("cannot retrieve VPN connections");
}
Expand Down
12 changes: 8 additions & 4 deletions connman/src/storage.c
Expand Up @@ -2245,9 +2245,6 @@ static void change_user_reply(DBusPendingCall *call, void *user_data)

storage_change_uid(data->uid);

if (cbs && cbs->finalize)
cbs->finalize(data->uid, cbs->finalize_user_data);

if (data->pending) {
if (!g_dbus_send_reply(connection, data->pending,
DBUS_TYPE_INVALID))
Expand Down Expand Up @@ -2287,6 +2284,9 @@ static void change_user_reply(DBusPendingCall *call, void *user_data)
strerror(-err));

out:
if (cbs && cbs->finalize)
cbs->finalize(data->uid, cbs->finalize_user_data);

if (data->result_cb)
data->result_cb(data->uid, err, data->user_cb_data);

Expand Down Expand Up @@ -2687,7 +2687,6 @@ static const GDBusMethodTable storage_methods[] = {
{ },
};


static const GDBusMethodTable storage_methods_vpn[] = {
{ GDBUS_ASYNC_METHOD(VPN_STORAGE_CHANGE_USER,
GDBUS_ARGS({ "uid", "u" }),
Expand Down Expand Up @@ -2761,6 +2760,11 @@ void connman_storage_update_finalize_cb(
cbs->finalize_user_data = user_data;
}

bool connman_storage_user_change_in_progress()
{
return vpn_change_call ? true : false;
}

int __connman_storage_init(const char *dir, mode_t dir_mode, mode_t file_mode)
{
const char *root = dir ? dir : DEFAULT_STORAGE_ROOT;
Expand Down
17 changes: 9 additions & 8 deletions connman/vpn/vpn-provider.c
Expand Up @@ -3554,12 +3554,9 @@ static gboolean connman_property_changed(DBusConnection *conn,
void *user_data)
{
DBusMessageIter iter, value;

const char *key;
const char *str;

const char *signature = DBUS_TYPE_STRING_AS_STRING
DBUS_TYPE_VARIANT_AS_STRING;
const char *signature = DBUS_TYPE_STRING_AS_STRING
DBUS_TYPE_VARIANT_AS_STRING;

if (!dbus_message_has_signature(message, signature)) {
connman_error("vpn connman property signature \"%s\" "
Expand All @@ -3578,12 +3575,16 @@ static gboolean connman_property_changed(DBusConnection *conn,

DBG("key %s", key);

if (g_ascii_strcasecmp(key, "State") == 0 &&
dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_STRING) {
if (g_str_equal(key, "State")) {
const char *str;

if (dbus_message_iter_get_arg_type(&value) != DBUS_TYPE_STRING)
return TRUE;

dbus_message_iter_get_basic(&value, &str);
set_state(str);
}

return TRUE;
}

Expand Down

0 comments on commit b9e8c6a

Please sign in to comment.