summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wagner <wagi@monom.org>2022-09-07 20:52:20 +0200
committerDaniel Wagner <wagi@monom.org>2022-09-07 20:56:36 +0200
commite6523511d736667e45877d588a64988e818a06fe (patch)
tree2ddb6a15769be52c380bc8bf51d1aa43981399ad
parentabbb9eaafa99544c605dde92542d5561f639ed78 (diff)
downloadconnman-e6523511d736667e45877d588a64988e818a06fe.tar.gz
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")
-rw-r--r--src/wispr.c10
1 files 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;