From e6523511d736667e45877d588a64988e818a06fe Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 7 Sep 2022 20:52:20 +0200 Subject: wispr: Fix context refcounting in wispr_portal_request_portal() The wispr_portal_request_portal() function is expected to read until there is no data. Hence, the wp_context refcount is supposed to be hold on while reading. Furthermore, we should not return early when we read the X-ConnMan-Status header. Instead we are supposed to go through the normal return path so that we cleanup any added routing entries. Thus, we also don't need to update the refcount in this code path as we handle it at the main return path. Fixes: 416bfaff9888 ("wispr: Update portal context references") --- src/wispr.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wispr.c b/src/wispr.c index 9b27af5f..a7562e84 100644 --- a/src/wispr.c +++ b/src/wispr.c @@ -537,7 +537,8 @@ static bool wispr_route_request(const char *address, int ai_family, static void wispr_portal_request_portal( struct connman_wispr_portal_context *wp_context) { - DBG(""); + DBG("wp_context %p %s", wp_context, + __connman_ipconfig_type2string(wp_context->type)); wispr_portal_context_ref(wp_context); wp_context->request_id = g_web_request_get(wp_context->web, @@ -753,7 +754,7 @@ static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) if (length > 0) { g_web_parser_feed_data(wp_context->wispr_parser, chunk, length); - wispr_portal_context_unref(wp_context); + /* read more data */ return true; } @@ -783,8 +784,6 @@ static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) if (g_web_result_get_header(result, "X-ConnMan-Status", &str)) { portal_manage_status(result, wp_context); - wispr_portal_context_unref(wp_context); - return false; } else { wispr_portal_context_ref(wp_context); __connman_agent_request_browser(wp_context->service, @@ -996,7 +995,8 @@ int __connman_wispr_start(struct connman_service *service, struct connman_wispr_portal *wispr_portal = NULL; int index, err; - DBG("service %p", service); + DBG("service %p %s", service, + __connman_ipconfig_type2string(type)); if (!wispr_portal_hash) return -EINVAL; -- cgit v1.2.1