[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