diff --git a/community/connman/APKBUILD b/community/connman/APKBUILD
index ba9eeac61b524659da75d334c9f2a5bf21b8fe6d..afb34c5ac7132bb42e39cafccc172c2dd4b429b6 100644
--- a/community/connman/APKBUILD
+++ b/community/connman/APKBUILD
@@ -1,8 +1,8 @@
 # Maintainer: Clayton Craft <clayton@craftyguy.net>
 # Contributor: Valery Kartel <valery.kartel@gmail.com>
 pkgname=connman
-pkgver=1.38
-pkgrel=4
+pkgver=1.39
+pkgrel=0
 pkgdesc="Daemon for managing internet connections"
 url="https://01.org/connman"
 arch="all"
@@ -13,10 +13,11 @@ subpackages="$pkgname-dev $pkgname-doc $pkgname-openrc"
 source="https://www.kernel.org/pub/linux/network/connman/connman-$pkgver.tar.xz
 	libresolv.patch
 	connman.initd
-	CVE-2021-26676.patch
 	"
 
 # secfixes:
+#   1.39-r0:
+#     - CVE-2021-26675
 #   1.38-r4:
 #     - CVE-2021-26676
 
@@ -51,7 +52,6 @@ package() {
 	install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
 }
 
-sha512sums="9c8f77c4dd62763ccb9ea5cc5d285a8a1c51bb09a82eafc73246231557a4f627ae1e5e4a9df5e104457390ebba643349d7d67800a4ee4c17c6dceff192afe8d4  connman-1.38.tar.xz
+sha512sums="5bec2830971e34966a7a3a40c505b8a14cf6fa639262d4f1eaeb38f5e602d7a234f7d4f2c4919517b0832664382389e20a59fdb027753cd20059a23589de1764  connman-1.39.tar.xz
 122b48fc9e25354e25ba3a3e0864bdd84da84457fed94aeea726bcb189b2f05f2cc361ae15f44af5c49bcee572e91e4c0488ef3b0bc79d20f6efe15853fb6b3a  libresolv.patch
-b0676714b3952f38d50f3707c3ec72269902dd07f3cefc412c2720d91d02c9537f2823eb4ed5359650eaa64b9132cddba3abc15fd68542ff0870de653e023ed8  connman.initd
-a988206f4619d3b7dc83e910a00739059a2231fd26c7af114857f448d5d9279306ac074fc5d80dba35d5fa476d4f8e63de945b9f5dce33fa0c5c3d7e6d687684  CVE-2021-26676.patch"
+b0676714b3952f38d50f3707c3ec72269902dd07f3cefc412c2720d91d02c9537f2823eb4ed5359650eaa64b9132cddba3abc15fd68542ff0870de653e023ed8  connman.initd"
diff --git a/community/connman/CVE-2021-26676.patch b/community/connman/CVE-2021-26676.patch
deleted file mode 100644
index e992d1691f32100c978a561b18752e050a798d48..0000000000000000000000000000000000000000
--- a/community/connman/CVE-2021-26676.patch
+++ /dev/null
@@ -1,251 +0,0 @@
-From a74524b3e3fad81b0fd1084ffdf9f2ea469cd9b1 Mon Sep 17 00:00:00 2001
-From: Colin Wee <cwee@tesla.com>
-Date: Thu, 28 Jan 2021 19:41:09 +0100
-Subject: gdhcp: Avoid leaking stack data via unitiialized variable
-
-Fixes: CVE-2021-26676
----
- gdhcp/client.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/gdhcp/client.c b/gdhcp/client.c
-index 6a5613e7..c7b85e58 100644
---- a/gdhcp/client.c
-+++ b/gdhcp/client.c
-@@ -2270,7 +2270,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- {
- 	GDHCPClient *dhcp_client = user_data;
- 	struct sockaddr_in dst_addr = { 0 };
--	struct dhcp_packet packet;
-+	struct dhcp_packet packet = { 0 };
- 	struct dhcpv6_packet *packet6 = NULL;
- 	uint8_t *message_type = NULL, *client_id = NULL, *option,
- 		*server_id = NULL;
--- 
-cgit 1.2.3-1.el7
-
-From 58d397ba74873384aee449690a9070bacd5676fa Mon Sep 17 00:00:00 2001
-From: Colin Wee <cwee@tesla.com>
-Date: Thu, 28 Jan 2021 19:39:14 +0100
-Subject: gdhcp: Avoid reading invalid data in dhcp_get_option
-
----
- gdhcp/client.c | 20 +++++++++++---------
- gdhcp/common.c | 24 +++++++++++++++++++-----
- gdhcp/common.h |  2 +-
- gdhcp/server.c | 12 +++++++-----
- 4 files changed, 38 insertions(+), 20 deletions(-)
-
-diff --git a/gdhcp/client.c b/gdhcp/client.c
-index 09dfe5ec..6a5613e7 100644
---- a/gdhcp/client.c
-+++ b/gdhcp/client.c
-@@ -1629,12 +1629,12 @@ static void start_request(GDHCPClient *dhcp_client)
- 							NULL);
- }
- 
--static uint32_t get_lease(struct dhcp_packet *packet)
-+static uint32_t get_lease(struct dhcp_packet *packet, uint16_t packet_len)
- {
- 	uint8_t *option;
- 	uint32_t lease_seconds;
- 
--	option = dhcp_get_option(packet, DHCP_LEASE_TIME);
-+	option = dhcp_get_option(packet, packet_len, DHCP_LEASE_TIME);
- 	if (!option)
- 		return 3600;
- 
-@@ -2226,7 +2226,8 @@ static void get_dhcpv6_request(GDHCPClient *dhcp_client,
- 	}
- }
- 
--static void get_request(GDHCPClient *dhcp_client, struct dhcp_packet *packet)
-+static void get_request(GDHCPClient *dhcp_client, struct dhcp_packet *packet,
-+		uint16_t packet_len)
- {
- 	GDHCPOptionType type;
- 	GList *list, *value_list;
-@@ -2237,7 +2238,7 @@ static void get_request(GDHCPClient *dhcp_client, struct dhcp_packet *packet)
- 	for (list = dhcp_client->request_list; list; list = list->next) {
- 		code = (uint8_t) GPOINTER_TO_INT(list->data);
- 
--		option = dhcp_get_option(packet, code);
-+		option = dhcp_get_option(packet, packet_len, code);
- 		if (!option) {
- 			g_hash_table_remove(dhcp_client->code_value_hash,
- 						GINT_TO_POINTER((int) code));
-@@ -2297,6 +2298,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 		re = dhcp_recv_l2_packet(&packet,
- 					dhcp_client->listener_sockfd,
- 					&dst_addr);
-+		pkt_len = (uint16_t)(unsigned int)re;
- 		xid = packet.xid;
- 	} else if (dhcp_client->listen_mode == L3) {
- 		if (dhcp_client->type == G_DHCP_IPV6) {
-@@ -2361,7 +2363,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 			dhcp_client->status_code = status;
- 		}
- 	} else {
--		message_type = dhcp_get_option(&packet, DHCP_MESSAGE_TYPE);
-+		message_type = dhcp_get_option(&packet, pkt_len, DHCP_MESSAGE_TYPE);
- 		if (!message_type)
- 			return TRUE;
- 	}
-@@ -2378,7 +2380,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 		dhcp_client->timeout = 0;
- 		dhcp_client->retry_times = 0;
- 
--		option = dhcp_get_option(&packet, DHCP_SERVER_ID);
-+		option = dhcp_get_option(&packet, pkt_len, DHCP_SERVER_ID);
- 		dhcp_client->server_ip = get_be32(option);
- 		dhcp_client->requested_ip = ntohl(packet.yiaddr);
- 
-@@ -2428,9 +2430,9 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 
- 			remove_timeouts(dhcp_client);
- 
--			dhcp_client->lease_seconds = get_lease(&packet);
-+			dhcp_client->lease_seconds = get_lease(&packet, pkt_len);
- 
--			get_request(dhcp_client, &packet);
-+			get_request(dhcp_client, &packet, pkt_len);
- 
- 			switch_listening_mode(dhcp_client, L_NONE);
- 
-@@ -2438,7 +2440,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 			dhcp_client->assigned_ip = get_ip(packet.yiaddr);
- 
- 			if (dhcp_client->state == REBOOTING) {
--				option = dhcp_get_option(&packet,
-+				option = dhcp_get_option(&packet, pkt_len,
- 							DHCP_SERVER_ID);
- 				dhcp_client->server_ip = get_be32(option);
- 			}
-diff --git a/gdhcp/common.c b/gdhcp/common.c
-index 1d667d17..c8916aa8 100644
---- a/gdhcp/common.c
-+++ b/gdhcp/common.c
-@@ -73,18 +73,21 @@ GDHCPOptionType dhcp_get_code_type(uint8_t code)
- 	return OPTION_UNKNOWN;
- }
- 
--uint8_t *dhcp_get_option(struct dhcp_packet *packet, int code)
-+uint8_t *dhcp_get_option(struct dhcp_packet *packet, uint16_t packet_len, int code)
- {
- 	int len, rem;
--	uint8_t *optionptr;
-+	uint8_t *optionptr, *options_end;
-+	size_t options_len;
- 	uint8_t overload = 0;
- 
- 	/* option bytes: [code][len][data1][data2]..[dataLEN] */
- 	optionptr = packet->options;
- 	rem = sizeof(packet->options);
-+	options_len = packet_len - (sizeof(*packet) - sizeof(packet->options));
-+	options_end = optionptr + options_len - 1;
- 
- 	while (1) {
--		if (rem <= 0)
-+		if ((rem <= 0) && (optionptr + OPT_CODE > options_end))
- 			/* Bad packet, malformed option field */
- 			return NULL;
- 
-@@ -115,14 +118,25 @@ uint8_t *dhcp_get_option(struct dhcp_packet *packet, int code)
- 			break;
- 		}
- 
-+		if (optionptr + OPT_LEN > options_end) {
-+			/* bad packet, would read length field from OOB */
-+			return NULL;
-+		}
-+
- 		len = 2 + optionptr[OPT_LEN];
- 
- 		rem -= len;
- 		if (rem < 0)
- 			continue; /* complain and return NULL */
- 
--		if (optionptr[OPT_CODE] == code)
--			return optionptr + OPT_DATA;
-+		if (optionptr[OPT_CODE] == code) {
-+			if (optionptr + len > options_end) {
-+				/* bad packet, option length points OOB */
-+				return NULL;
-+			} else {
-+				return optionptr + OPT_DATA;
-+			}
-+		}
- 
- 		if (optionptr[OPT_CODE] == DHCP_OPTION_OVERLOAD)
- 			overload |= optionptr[OPT_DATA];
-diff --git a/gdhcp/common.h b/gdhcp/common.h
-index 9660231c..8f63fd75 100644
---- a/gdhcp/common.h
-+++ b/gdhcp/common.h
-@@ -179,7 +179,7 @@ struct in6_pktinfo {
- };
- #endif
- 
--uint8_t *dhcp_get_option(struct dhcp_packet *packet, int code);
-+uint8_t *dhcp_get_option(struct dhcp_packet *packet, uint16_t packet_len, int code);
- uint8_t *dhcpv6_get_option(struct dhcpv6_packet *packet, uint16_t pkt_len,
- 			int code, uint16_t *option_len, int *option_count);
- uint8_t *dhcpv6_get_sub_option(unsigned char *option, uint16_t max_len,
-diff --git a/gdhcp/server.c b/gdhcp/server.c
-index 85405f19..52ea2a55 100644
---- a/gdhcp/server.c
-+++ b/gdhcp/server.c
-@@ -413,7 +413,7 @@ error:
- }
- 
- 
--static uint8_t check_packet_type(struct dhcp_packet *packet)
-+static uint8_t check_packet_type(struct dhcp_packet *packet, uint16_t packet_len)
- {
- 	uint8_t *type;
- 
-@@ -423,7 +423,7 @@ static uint8_t check_packet_type(struct dhcp_packet *packet)
- 	if (packet->op != BOOTREQUEST)
- 		return 0;
- 
--	type = dhcp_get_option(packet, DHCP_MESSAGE_TYPE);
-+	type = dhcp_get_option(packet, packet_len, DHCP_MESSAGE_TYPE);
- 
- 	if (!type)
- 		return 0;
-@@ -651,6 +651,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 	struct dhcp_lease *lease;
- 	uint32_t requested_nip = 0;
- 	uint8_t type, *server_id_option, *request_ip_option;
-+	uint16_t packet_len;
- 	int re;
- 
- 	if (condition & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
-@@ -661,12 +662,13 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 	re = dhcp_recv_l3_packet(&packet, dhcp_server->listener_sockfd);
- 	if (re < 0)
- 		return TRUE;
-+	packet_len = (uint16_t)(unsigned int)re;
- 
--	type = check_packet_type(&packet);
-+	type = check_packet_type(&packet, packet_len);
- 	if (type == 0)
- 		return TRUE;
- 
--	server_id_option = dhcp_get_option(&packet, DHCP_SERVER_ID);
-+	server_id_option = dhcp_get_option(&packet, packet_len, DHCP_SERVER_ID);
- 	if (server_id_option) {
- 		uint32_t server_nid =
- 			get_unaligned((const uint32_t *) server_id_option);
-@@ -675,7 +677,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
- 			return TRUE;
- 	}
- 
--	request_ip_option = dhcp_get_option(&packet, DHCP_REQUESTED_IP);
-+	request_ip_option = dhcp_get_option(&packet, packet_len, DHCP_REQUESTED_IP);
- 	if (request_ip_option)
- 		requested_nip = get_be32(request_ip_option);
- 
--- 
-cgit 1.2.3-1.el7
-