[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