[PATCH 3/9] pptp: Fix clearing of credentials and use error int in callback

Jussi Laakkonen <[email protected]> Mon, 26 Jan 2026 15:43:42 +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 pptp_connect_done()
immediately with the error code. This avoids getting credentials being
unnecessarily reset.

Use ECONNREFUSED as an error in case pptp_notify() gets connection
error. Add some debug messages to be able to see what error causes
termination.
---
 vpn/plugins/pptp.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/vpn/plugins/pptp.c b/vpn/plugins/pptp.c
index 04498a53..171f66d4 100644
--- a/vpn/plugins/pptp.c
+++ b/vpn/plugins/pptp.c
@@ -110,6 +110,9 @@ static void pptp_connect_done(struct pptp_private_data *data, int err)
 	user_data = data->user_data;
 	data->cb = NULL;
 	data->user_data = NULL;
+
+	DBG("error %d", err);
+
 	cb(data->provider, user_data, err);
 }
 
@@ -183,7 +186,9 @@ static int pptp_notify(DBusMessage *msg, struct vpn_provider *provider)
 	}
 
 	if (strcmp(reason, "connect")) {
-		pptp_connect_done(data, EIO);
+		DBG("failed to connect");
+
+		pptp_connect_done(data, ECONNREFUSED);
 
 		/*
 		 * Stop the task to avoid potential looping of this state when
@@ -192,7 +197,7 @@ static int pptp_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);
@@ -354,7 +359,6 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
 {
 	struct request_input_reply *pptp_reply = user_data;
 	struct pptp_private_data *data;
-	const char *error = NULL;
 	char *username = NULL, *password = NULL;
 	char *key;
 	DBusMessageIter iter, dict;
@@ -362,8 +366,10 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
 
 	DBG("provider %p", pptp_reply->provider);
 
-	if (!reply)
+	if (!reply) {
+		err = ENOMSG;
 		goto done;
+	}
 
 	data = pptp_reply->user_data;
 
@@ -374,7 +380,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;
 	}
 
@@ -423,7 +428,7 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
 	}
 
 done:
-	pptp_reply->callback(pptp_reply->provider, username, password, error,
+	pptp_reply->callback(pptp_reply->provider, username, password, err,
 				pptp_reply->user_data);
 
 	g_free(username);
@@ -432,13 +437,9 @@ done:
 	g_free(pptp_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;
@@ -589,15 +590,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 pptp_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));
+		pptp_connect_done(data, error);
+		return;
+	}
 
 	vpn_provider_set_string(provider, "PPTP.User", username);
 	vpn_provider_set_string_hide_value(provider, "PPTP.Password",
@@ -659,6 +660,7 @@ error:
 
 static int pptp_error_code(struct vpn_provider *provider, int exit_code)
 {
+	DBG("exit code %d", exit_code);
 
 	switch (exit_code) {
 	case 1:
-- 
2.47.3