[PATCH 6/9] l2tp: Fix clearing of credentials and use error int in callback
Jussi Laakkonen <[email protected]> Mon, 26 Jan 2026 15:43:45 +0200
| Newsgroups | dev.linux.lists.connman |
|---|---|
| Message-ID | <[email protected]> |
Use the error code parsed by VPN agent for the agent callback. When the
agent returns with timeout or no message error call l2tp_connect_done()
immediately with the error code. This avoids getting credentials being
unnecessarily reset.
Use ECONNREFUSED as an error in case l2tp_notify() gets connection
error.
---
vpn/plugins/l2tp.c | 32 ++++++++++++++------------------
1 file changed, 14 insertions(+), 18 deletions(-)
diff --git a/vpn/plugins/l2tp.c b/vpn/plugins/l2tp.c
index ee40dd72..c3b01493 100644
--- a/vpn/plugins/l2tp.c
+++ b/vpn/plugins/l2tp.c
@@ -219,7 +219,7 @@ static int l2tp_notify(DBusMessage *msg, struct vpn_provider *provider)
}
if (strcmp(reason, "connect")) {
- l2tp_connect_done(data, EIO);
+ l2tp_connect_done(data, ECONNREFUSED);
/*
* Stop the task to avoid potential looping of this state when
@@ -228,7 +228,7 @@ static int l2tp_notify(DBusMessage *msg, struct vpn_provider *provider)
if (data && data->task)
connman_task_stop(data->task);
- return VPN_STATE_DISCONNECT;
+ return VPN_STATE_FAILURE;
}
dbus_message_iter_recurse(&iter, &dict);
@@ -547,7 +547,6 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
{
struct request_input_reply *l2tp_reply = user_data;
struct l2tp_private_data *data;
- const char *error = NULL;
char *username = NULL, *password = NULL;
char *key;
DBusMessageIter iter, dict;
@@ -555,8 +554,10 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
DBG("provider %p", l2tp_reply->provider);
- if (!reply)
+ if (!reply) {
+ err = ENOMSG;
goto done;
+ }
data = l2tp_reply->user_data;
@@ -567,7 +568,6 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
/* Ensure cb is called only once */
data->cb = NULL;
data->user_data = NULL;
- error = dbus_message_get_error_name(reply);
goto done;
}
@@ -616,7 +616,7 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
}
done:
- l2tp_reply->callback(l2tp_reply->provider, username, password, error,
+ l2tp_reply->callback(l2tp_reply->provider, username, password, err,
l2tp_reply->user_data);
g_free(username);
@@ -625,13 +625,9 @@ done:
g_free(l2tp_reply);
}
-typedef void (* request_cb_t)(struct vpn_provider *provider,
- const char *username, const char *password,
- const char *error, void *user_data);
-
static int request_input(struct vpn_provider *provider,
- request_cb_t callback, const char *dbus_sender,
- void *user_data)
+ vpn_provider_password_cb_t callback,
+ const char *dbus_sender, void *user_data)
{
DBusMessage *message;
const char *path, *agent_sender, *agent_path;
@@ -776,15 +772,15 @@ done:
static void request_input_cb(struct vpn_provider *provider,
const char *username,
const char *password,
- const char *error, void *user_data)
+ int error, void *user_data)
{
struct l2tp_private_data *data = user_data;
- if (!username || !*username || !password || !*password)
- DBG("Requesting username %s or password failed, error %s",
- username, error);
- else if (error)
- DBG("error %s", error);
+ if (error || (!username || !*username || !password || !*password)) {
+ DBG("Requesting credentials failed: %s", strerror(error));
+ l2tp_connect_done(data, error);
+ return;
+ }
vpn_provider_set_string(provider, "L2TP.User", username);
vpn_provider_set_string_hide_value(provider, "L2TP.Password",
--
2.47.3