Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package connman for openSUSE:Factory checked 
in at 2022-08-01 21:33:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/connman (Old)
 and      /work/SRC/openSUSE:Factory/.connman.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "connman"

Mon Aug  1 21:33:25 2022 rev:14 rq:992045 version:1.41

Changes:
--------
--- /work/SRC/openSUSE:Factory/connman/connman.changes  2022-07-14 
16:35:01.656672125 +0200
+++ /work/SRC/openSUSE:Factory/.connman.new.1533/connman.changes        
2022-08-01 21:34:44.378403655 +0200
@@ -1,0 +2,11 @@
+Mon Aug  1 13:48:53 UTC 2022 - Daniel Wagner <daniel.wag...@suse.com>
+
+- Add refcounting to wispr portal detection (bsc#1200190)
+  * add 0001-wispr-Rename-wispr_portal_list-to-wispr_portal_hash.patch
+  * add 0002-wispr-Ignore-NULL-proxy.patch
+  * add 0003-wispr-Add-reference-counter-to-portal-context.patch 
(CVE-2022-32293)
+  * add 0004-wispr-Update-portal-context-references.patch (CVE-2022-32293)
+- Fix OOB write in received_data (bsc#1200189)
+  * add 0005-gweb-Fix-OOB-write-in-received_data.patch (CVE-2022-32292)
+
+-------------------------------------------------------------------

New:
----
  0001-wispr-Rename-wispr_portal_list-to-wispr_portal_hash.patch
  0002-wispr-Ignore-NULL-proxy.patch
  0003-wispr-Add-reference-counter-to-portal-context.patch
  0004-wispr-Update-portal-context-references.patch
  0005-gweb-Fix-OOB-write-in-received_data.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ connman.spec ++++++
--- /var/tmp/diff_new_pack.FMt3UW/_old  2022-08-01 21:34:44.902405158 +0200
+++ /var/tmp/diff_new_pack.FMt3UW/_new  2022-08-01 21:34:44.906405170 +0200
@@ -35,6 +35,11 @@
 Source0:        
http://www.kernel.org/pub/linux/network/connman/connman-%{version}.tar.xz
 Source1:        
http://www.kernel.org/pub/linux/network/connman/connman-%{version}.tar.sign
 Source2:        connman.keyring
+Patch001:       0001-wispr-Rename-wispr_portal_list-to-wispr_portal_hash.patch
+Patch002:       0002-wispr-Ignore-NULL-proxy.patch
+Patch003:       0003-wispr-Add-reference-counter-to-portal-context.patch
+Patch004:       0004-wispr-Update-portal-context-references.patch
+Patch005:       0005-gweb-Fix-OOB-write-in-received_data.patch
 # PATCH-FIX-OPENSUSE -- Greate symlink to network.service
 # downstream patches
 Patch100:       0100-connman-1.35-service.patch

++++++ 0001-wispr-Rename-wispr_portal_list-to-wispr_portal_hash.patch ++++++
>From d7022ad52d8bf84f437b0b2e021d7b06064b97dd Mon Sep 17 00:00:00 2001
From: Daniel Wagner <w...@monom.org>
Date: Mon, 4 Jul 2022 08:16:58 +0200
Subject: [PATCH 1/5] wispr: Rename wispr_portal_list to wispr_portal_hash

This data structure is a hash table, so replace the '_list' with
'_hash' to reduce the possibility for confusion.

Signed-off-by: Daniel Wagner <w...@monom.org>
---
 src/wispr.c |   24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

--- a/src/wispr.c
+++ b/src/wispr.c
@@ -91,7 +91,7 @@ struct connman_wispr_portal {
 
 static bool wispr_portal_web_result(GWebResult *result, gpointer user_data);
 
-static GHashTable *wispr_portal_list = NULL;
+static GHashTable *wispr_portal_hash = NULL;
 
 static char *online_check_ipv4_url = NULL;
 static char *online_check_ipv6_url = NULL;
@@ -576,7 +576,7 @@ static void wispr_portal_browser_reply_c
        if (index < 0)
                return;
 
-       wispr_portal = g_hash_table_lookup(wispr_portal_list,
+       wispr_portal = g_hash_table_lookup(wispr_portal_hash,
                                        GINT_TO_POINTER(index));
        if (!wispr_portal)
                return;
@@ -950,21 +950,21 @@ int __connman_wispr_start(struct connman
 
        DBG("service %p", service);
 
-       if (!wispr_portal_list)
+       if (!wispr_portal_hash)
                return -EINVAL;
 
        index = __connman_service_get_index(service);
        if (index < 0)
                return -EINVAL;
 
-       wispr_portal = g_hash_table_lookup(wispr_portal_list,
+       wispr_portal = g_hash_table_lookup(wispr_portal_hash,
                                        GINT_TO_POINTER(index));
        if (!wispr_portal) {
                wispr_portal = g_try_new0(struct connman_wispr_portal, 1);
                if (!wispr_portal)
                        return -ENOMEM;
 
-               g_hash_table_replace(wispr_portal_list,
+               g_hash_table_replace(wispr_portal_hash,
                                        GINT_TO_POINTER(index), wispr_portal);
        }
 
@@ -1002,27 +1002,27 @@ void __connman_wispr_stop(struct connman
 
        DBG("service %p", service);
 
-       if (!wispr_portal_list)
+       if (!wispr_portal_hash)
                return;
 
        index = __connman_service_get_index(service);
        if (index < 0)
                return;
 
-       wispr_portal = g_hash_table_lookup(wispr_portal_list,
+       wispr_portal = g_hash_table_lookup(wispr_portal_hash,
                                        GINT_TO_POINTER(index));
        if (!wispr_portal)
                return;
 
        if (wispr_portal->ipv4_context) {
                if (service == wispr_portal->ipv4_context->service)
-                       g_hash_table_remove(wispr_portal_list,
+                       g_hash_table_remove(wispr_portal_hash,
                                        GINT_TO_POINTER(index));
        }
 
        if (wispr_portal->ipv6_context) {
                if (service == wispr_portal->ipv6_context->service)
-                       g_hash_table_remove(wispr_portal_list,
+                       g_hash_table_remove(wispr_portal_hash,
                                        GINT_TO_POINTER(index));
        }
 }
@@ -1031,7 +1031,7 @@ int __connman_wispr_init(void)
 {
        DBG("");
 
-       wispr_portal_list = g_hash_table_new_full(g_direct_hash,
+       wispr_portal_hash = g_hash_table_new_full(g_direct_hash,
                                                g_direct_equal, NULL,
                                                free_connman_wispr_portal);
 
@@ -1050,6 +1050,6 @@ void __connman_wispr_cleanup(void)
 {
        DBG("");
 
-       g_hash_table_destroy(wispr_portal_list);
-       wispr_portal_list = NULL;
+       g_hash_table_destroy(wispr_portal_hash);
+       wispr_portal_hash = NULL;
 }

++++++ 0002-wispr-Ignore-NULL-proxy.patch ++++++
>From 6d551ebed1e97f54a92412bde0555a5ffe920577 Mon Sep 17 00:00:00 2001
From: Daniel Wagner <w...@monom.org>
Date: Mon, 4 Jul 2022 10:18:50 +0200
Subject: [PATCH 2/5] wispr: Ignore NULL proxy

connmand[16822]: Failed to find URL:http://ipv6.connman.net/online/status.html
connmand[16822]: src/wispr.c:proxy_callback() proxy (null)
(connmand:16449): GLib-CRITICAL **: 10:15:43.812: g_str_has_prefix: assertion 
'str != NULL' failed
---
 src/wispr.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/src/wispr.c
+++ b/src/wispr.c
@@ -809,7 +809,7 @@ static void proxy_callback(const char *p
 
        DBG("proxy %s", proxy);
 
-       if (!wp_context)
+       if (!wp_context || !proxy)
                return;
 
        wp_context->token = 0;

++++++ 0003-wispr-Add-reference-counter-to-portal-context.patch ++++++
>From 72343929836de80727a27d6744c869dff045757c Mon Sep 17 00:00:00 2001
From: Daniel Wagner <w...@monom.org>
Date: Tue, 5 Jul 2022 08:32:12 +0200
Subject: [PATCH 3/5] wispr: Add reference counter to portal context

Track the connman_wispr_portal_context live time via a
refcounter. This only adds the infrastructure to do proper reference
counting.

Fixes: CVE-2022-32293
---
 src/wispr.c |   52 ++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 42 insertions(+), 10 deletions(-)

--- a/src/wispr.c
+++ b/src/wispr.c
@@ -56,6 +56,7 @@ struct wispr_route {
 };
 
 struct connman_wispr_portal_context {
+       int refcount;
        struct connman_service *service;
        enum connman_ipconfig_type type;
        struct connman_wispr_portal *wispr_portal;
@@ -97,6 +98,11 @@ static char *online_check_ipv4_url = NUL
 static char *online_check_ipv6_url = NULL;
 static bool enable_online_to_ready_transition = false;
 
+#define wispr_portal_context_ref(wp_context) \
+       wispr_portal_context_ref_debug(wp_context, __FILE__, __LINE__, __func__)
+#define wispr_portal_context_unref(wp_context) \
+       wispr_portal_context_unref_debug(wp_context, __FILE__, __LINE__, 
__func__)
+
 static void connman_wispr_message_init(struct connman_wispr_message *msg)
 {
        DBG("");
@@ -162,9 +168,6 @@ static void free_connman_wispr_portal_co
 {
        DBG("context %p", wp_context);
 
-       if (!wp_context)
-               return;
-
        if (wp_context->wispr_portal) {
                if (wp_context->wispr_portal->ipv4_context == wp_context)
                        wp_context->wispr_portal->ipv4_context = NULL;
@@ -201,9 +204,38 @@ static void free_connman_wispr_portal_co
        g_free(wp_context);
 }
 
+static struct connman_wispr_portal_context *
+wispr_portal_context_ref_debug(struct connman_wispr_portal_context *wp_context,
+                       const char *file, int line, const char *caller)
+{
+       DBG("%p ref %d by %s:%d:%s()", wp_context,
+               wp_context->refcount + 1, file, line, caller);
+
+       __sync_fetch_and_add(&wp_context->refcount, 1);
+
+       return wp_context;
+}
+
+static void wispr_portal_context_unref_debug(
+               struct connman_wispr_portal_context *wp_context,
+               const char *file, int line, const char *caller)
+{
+       if (!wp_context)
+               return;
+
+       DBG("%p ref %d by %s:%d:%s()", wp_context,
+               wp_context->refcount - 1, file, line, caller);
+
+       if (__sync_fetch_and_sub(&wp_context->refcount, 1) != 1)
+               return;
+
+       free_connman_wispr_portal_context(wp_context);
+}
+
 static struct connman_wispr_portal_context *create_wispr_portal_context(void)
 {
-       return g_try_new0(struct connman_wispr_portal_context, 1);
+       return wispr_portal_context_ref(
+               g_new0(struct connman_wispr_portal_context, 1));
 }
 
 static void free_connman_wispr_portal(gpointer data)
@@ -215,8 +247,8 @@ static void free_connman_wispr_portal(gp
        if (!wispr_portal)
                return;
 
-       free_connman_wispr_portal_context(wispr_portal->ipv4_context);
-       free_connman_wispr_portal_context(wispr_portal->ipv6_context);
+       wispr_portal_context_unref(wispr_portal->ipv4_context);
+       wispr_portal_context_unref(wispr_portal->ipv6_context);
 
        g_free(wispr_portal);
 }
@@ -452,7 +484,7 @@ static void portal_manage_status(GWebRes
                connman_info("Client-Timezone: %s", str);
 
        if (!enable_online_to_ready_transition)
-               free_connman_wispr_portal_context(wp_context);
+               wispr_portal_context_unref(wp_context);
 
        __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_ONLINE, type);
@@ -616,7 +648,7 @@ static void wispr_portal_request_wispr_l
                                return;
                }
 
-               free_connman_wispr_portal_context(wp_context);
+               wispr_portal_context_unref(wp_context);
                return;
        }
 
@@ -928,7 +960,7 @@ static int wispr_portal_detect(struct co
 
                if (wp_context->token == 0) {
                        err = -EINVAL;
-                       free_connman_wispr_portal_context(wp_context);
+                       wispr_portal_context_unref(wp_context);
                }
        } else if (wp_context->timeout == 0) {
                wp_context->timeout = g_idle_add(no_proxy_callback, wp_context);
@@ -977,7 +1009,7 @@ int __connman_wispr_start(struct connman
 
        /* If there is already an existing context, we wipe it */
        if (wp_context)
-               free_connman_wispr_portal_context(wp_context);
+               wispr_portal_context_unref(wp_context);
 
        wp_context = create_wispr_portal_context();
        if (!wp_context)

++++++ 0004-wispr-Update-portal-context-references.patch ++++++
>From 416bfaff988882c553c672e5bfc2d4f648d29e8a Mon Sep 17 00:00:00 2001
From: Daniel Wagner <w...@monom.org>
Date: Tue, 5 Jul 2022 09:11:09 +0200
Subject: [PATCH 4/5] wispr: Update portal context references

Maintain proper portal context references to avoid UAF.

Fixes: CVE-2022-32293
---
 src/wispr.c |   34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

--- a/src/wispr.c
+++ b/src/wispr.c
@@ -105,8 +105,6 @@ static bool enable_online_to_ready_trans
 
 static void connman_wispr_message_init(struct connman_wispr_message *msg)
 {
-       DBG("");
-
        msg->has_error = false;
        msg->current_element = NULL;
 
@@ -166,8 +164,6 @@ static void free_wispr_routes(struct con
 static void free_connman_wispr_portal_context(
                struct connman_wispr_portal_context *wp_context)
 {
-       DBG("context %p", wp_context);
-
        if (wp_context->wispr_portal) {
                if (wp_context->wispr_portal->ipv4_context == wp_context)
                        wp_context->wispr_portal->ipv4_context = NULL;
@@ -483,9 +479,6 @@ static void portal_manage_status(GWebRes
                                &str))
                connman_info("Client-Timezone: %s", str);
 
-       if (!enable_online_to_ready_transition)
-               wispr_portal_context_unref(wp_context);
-
        __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_ONLINE, type);
 
@@ -546,14 +539,17 @@ static void wispr_portal_request_portal(
 {
        DBG("");
 
+       wispr_portal_context_ref(wp_context);
        wp_context->request_id = g_web_request_get(wp_context->web,
                                        wp_context->status_url,
                                        wispr_portal_web_result,
                                        wispr_route_request,
                                        wp_context);
 
-       if (wp_context->request_id == 0)
+       if (wp_context->request_id == 0) {
                wispr_portal_error(wp_context);
+               wispr_portal_context_unref(wp_context);
+       }
 }
 
 static bool wispr_input(const guint8 **data, gsize *length,
@@ -618,13 +614,15 @@ static void wispr_portal_browser_reply_c
                return;
 
        if (!authentication_done) {
-               wispr_portal_error(wp_context);
                free_wispr_routes(wp_context);
+               wispr_portal_error(wp_context);
+               wispr_portal_context_unref(wp_context);
                return;
        }
 
        /* Restarting the test */
        __connman_service_wispr_start(service, wp_context->type);
+       wispr_portal_context_unref(wp_context);
 }
 
 static void wispr_portal_request_wispr_login(struct connman_service *service,
@@ -700,11 +698,13 @@ static bool wispr_manage_message(GWebRes
 
                wp_context->wispr_result = CONNMAN_WISPR_RESULT_LOGIN;
 
+               wispr_portal_context_ref(wp_context);
                if (__connman_agent_request_login_input(wp_context->service,
                                        wispr_portal_request_wispr_login,
-                                       wp_context) != -EINPROGRESS)
+                                       wp_context) != -EINPROGRESS) {
                        wispr_portal_error(wp_context);
-               else
+                       wispr_portal_context_unref(wp_context);
+               } else
                        return true;
 
                break;
@@ -753,6 +753,7 @@ static bool wispr_portal_web_result(GWeb
                if (length > 0) {
                        g_web_parser_feed_data(wp_context->wispr_parser,
                                                                chunk, length);
+                       wispr_portal_context_unref(wp_context);
                        return true;
                }
 
@@ -770,6 +771,7 @@ static bool wispr_portal_web_result(GWeb
 
        switch (status) {
        case 000:
+               wispr_portal_context_ref(wp_context);
                __connman_agent_request_browser(wp_context->service,
                                wispr_portal_browser_reply_cb,
                                wp_context->status_url, wp_context);
@@ -781,11 +783,14 @@ static bool wispr_portal_web_result(GWeb
                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
+               } else {
+                       wispr_portal_context_ref(wp_context);
                        __connman_agent_request_browser(wp_context->service,
                                        wispr_portal_browser_reply_cb,
                                        wp_context->redirect_url, wp_context);
+               }
 
                break;
        case 300:
@@ -798,6 +803,7 @@ static bool wispr_portal_web_result(GWeb
                        !g_web_result_get_header(result, "Location",
                                                        &redirect)) {
 
+                       wispr_portal_context_ref(wp_context);
                        __connman_agent_request_browser(wp_context->service,
                                        wispr_portal_browser_reply_cb,
                                        wp_context->status_url, wp_context);
@@ -808,6 +814,7 @@ static bool wispr_portal_web_result(GWeb
 
                wp_context->redirect_url = g_strdup(redirect);
 
+               wispr_portal_context_ref(wp_context);
                wp_context->request_id = g_web_request_get(wp_context->web,
                                redirect, wispr_portal_web_result,
                                wispr_route_request, wp_context);
@@ -820,6 +827,7 @@ static bool wispr_portal_web_result(GWeb
 
                break;
        case 505:
+               wispr_portal_context_ref(wp_context);
                __connman_agent_request_browser(wp_context->service,
                                wispr_portal_browser_reply_cb,
                                wp_context->status_url, wp_context);
@@ -832,6 +840,7 @@ static bool wispr_portal_web_result(GWeb
        wp_context->request_id = 0;
 done:
        wp_context->wispr_msg.message_type = -1;
+       wispr_portal_context_unref(wp_context);
        return false;
 }
 
@@ -866,6 +875,7 @@ static void proxy_callback(const char *p
                                        xml_wispr_parser_callback, wp_context);
 
        wispr_portal_request_portal(wp_context);
+       wispr_portal_context_unref(wp_context);
 }
 
 static gboolean no_proxy_callback(gpointer user_data)

++++++ 0005-gweb-Fix-OOB-write-in-received_data.patch ++++++
>From d1a5ede5d255bde8ef707f8441b997563b9312bd Mon Sep 17 00:00:00 2001
From: Nathan Crandall <ncrand...@tesla.com>
Date: Tue, 12 Jul 2022 08:56:34 +0200
Subject: [PATCH 5/5] gweb: Fix OOB write in received_data()

There is a mismatch of handling binary vs. C-string data with memchr
and strlen, resulting in pos, count, and bytes_read to become out of
sync and result in a heap overflow.  Instead, do not treat the buffer
as an ASCII C-string. We calculate the count based on the return value
of memchr, instead of strlen.

Fixes: CVE-2022-32292
---
 gweb/gweb.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/gweb/gweb.c
+++ b/gweb/gweb.c
@@ -918,7 +918,7 @@ static gboolean received_data(GIOChannel
                }
 
                *pos = '\0';
-               count = strlen((char *) ptr);
+               count = pos - ptr;
                if (count > 0 && ptr[count - 1] == '\r') {
                        ptr[--count] = '\0';
                        bytes_read--;

Reply via email to