Date: Thursday, December 21, 2017 @ 17:41:31 Author: heftig Revision: 313492
1.8.10-3 Modified: network-manager-applet/trunk/0001-shared-compat-Fix-memory-handling-of-nm_setting_vpn_.patch network-manager-applet/trunk/PKGBUILD -----------------------------------------------------------------+ 0001-shared-compat-Fix-memory-handling-of-nm_setting_vpn_.patch | 63 +++++----- PKGBUILD | 4 2 files changed, 36 insertions(+), 31 deletions(-) Modified: 0001-shared-compat-Fix-memory-handling-of-nm_setting_vpn_.patch =================================================================== --- 0001-shared-compat-Fix-memory-handling-of-nm_setting_vpn_.patch 2017-12-21 17:39:49 UTC (rev 313491) +++ 0001-shared-compat-Fix-memory-handling-of-nm_setting_vpn_.patch 2017-12-21 17:41:31 UTC (rev 313492) @@ -1,37 +1,35 @@ -From 6c546a4fe86f3066545b7a8bb2900c19a66f9a2f Mon Sep 17 00:00:00 2001 -Message-Id: <6c546a4fe86f3066545b7a8bb2900c19a66f9a2f.1513772933.git.jan.steff...@gmail.com> +From 8147a06b45ef4fc6983454b63fe81a460f761593 Mon Sep 17 00:00:00 2001 +Message-Id: <8147a06b45ef4fc6983454b63fe81a460f761593.1513877605.git.jan.steff...@gmail.com> From: "Jan Alexander Steffens (heftig)" <[email protected]> -Date: Wed, 20 Dec 2017 13:23:12 +0100 -Subject: [PATCH] shared/compat: Fix memory handling of - nm_setting_vpn_get_*_keys +Date: Thu, 21 Dec 2017 18:22:55 +0100 +Subject: [PATCH] shared/compat: fix memory handling of + nm_setting_vpn_get_*_keys (v2) The compat implementations return a (transfer none) strv instead of a (transfer container) one. This has caused double frees in nm-applet: https://bugs.archlinux.org/task/56772 -Don't copy the keys and don't free the container later. +We still need to copy the keys because nm_setting_vpn_foreach_* provides +us with copies that are freed after the iteration. + +Fix this by handing out a duplicate of the array. Also simplify the +function a bit by caching the entire GPtrArray object and not just the +array itself. + +Fixes: 272439cb2077a889485dd195bb6b99ca91d3e3bf --- - shared/nm-utils/nm-compat.c | 10 +--------- - 1 file changed, 1 insertion(+), 9 deletions(-) + shared/nm-utils/nm-compat.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/shared/nm-utils/nm-compat.c b/shared/nm-utils/nm-compat.c -index 22ab675de8373639..22c31489dd222cd3 100644 +index 22ab675de8373639..2b747c700478a205 100644 --- a/shared/nm-utils/nm-compat.c +++ b/shared/nm-utils/nm-compat.c -@@ -30,39 +30,31 @@ _get_keys_cb (const char *key, const char *val, gpointer user_data) - { - GPtrArray *a = user_data; - -- g_ptr_array_add (a, g_strdup (key)); -+ g_ptr_array_add (a, key); - } - - static const char ** - _get_keys (NMSettingVpn *setting, +@@ -38,34 +38,32 @@ _get_keys (NMSettingVpn *setting, gboolean is_secrets, guint *out_length) { - guint len; +- guint len; const char **keys = NULL; gs_unref_ptrarray GPtrArray *a = NULL; @@ -42,23 +40,30 @@ nm_setting_vpn_foreach_secret (setting, _get_keys_cb, a); else nm_setting_vpn_foreach_data_item (setting, _get_keys_cb, a); - len = a->len; +- len = a->len; if (a->len) { g_ptr_array_sort (a, nm_strcmp_p); g_ptr_array_add (a, NULL); - keys = (const char **) g_ptr_array_free (g_steal_pointer (&a), FALSE); -- -- /* we need to cache the keys *somewhere*. */ -- g_object_set_qdata_full (G_OBJECT (setting), -- is_secrets -- ? NM_CACHED_QUARK ("libnm._nm_setting_vpn_get_secret_keys") -- : NM_CACHED_QUARK ("libnm._nm_setting_vpn_get_data_keys"), +- keys = (const char **) g_ptr_array_free (g_steal_pointer (&a), FALSE); ++ keys = g_memdup (a->pdata, sizeof (gpointer) * a->len); + + /* we need to cache the keys *somewhere*. */ + g_object_set_qdata_full (G_OBJECT (setting), + is_secrets + ? NM_CACHED_QUARK ("libnm._nm_setting_vpn_get_secret_keys") + : NM_CACHED_QUARK ("libnm._nm_setting_vpn_get_data_keys"), - keys, - (GDestroyNotify) g_strfreev); ++ g_ptr_array_ref (a), ++ (GDestroyNotify) g_ptr_array_unref); } - NM_SET_OUT (out_length, len); +- NM_SET_OUT (out_length, len); ++ NM_SET_OUT (out_length, a->len); + return keys; + } + -- 2.15.1 Modified: PKGBUILD =================================================================== --- PKGBUILD 2017-12-21 17:39:49 UTC (rev 313491) +++ PKGBUILD 2017-12-21 17:41:31 UTC (rev 313492) @@ -11,7 +11,7 @@ pkgdesc="Applet for managing network connections" url="https://wiki.gnome.org/Projects/NetworkManager/" pkgver=1.8.10 -pkgrel=2 +pkgrel=3 arch=(x86_64) license=(GPL2 LGPL2.1) depends=(libnm-glib libgudev gtk3 mobile-broadband-provider-info iso-codes gcr) @@ -21,7 +21,7 @@ source=("git+https://git.gnome.org/browse/network-manager-applet#commit=$_commit" 0001-shared-compat-Fix-memory-handling-of-nm_setting_vpn_.patch) sha256sums=('SKIP' - '117e7fab1a930f64bd8ce4c94de2f954a28315b2763bd4c8e1c583b32bd6feaf') + 'df8f420b116155e7fd81e9d7a13e27bc3026e63cb859a0bb533b0bc74b8c614c') pkgver() { cd $pkgbase
