From 8651bee90fbb006824a16cfee071e62c1c32878e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Thu, 4 Jun 2020 18:06:36 +0000 Subject: [PATCH] GWin32RegistryKey: Move assertions While these assertions look right at the first glance, they actually crash the program. That's because GObject insists on initializing all construct-only properties to their default values, which results in g_win32_registry_key_set_property() being called multiple times with NULL string, once for each unset property. If "path" is actually set by the caller, a subsequent call to set "path-utf16" to NULL will fail an assertion, since absolute_path is already non-NULL. With assertions moved the set-to-NULL calls bail out before an assertion is made. --- gio/gwin32registrykey.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/gio/gwin32registrykey.c b/gio/gwin32registrykey.c index 9e6dd2ba9..30343a9eb 100644 --- a/gio/gwin32registrykey.c +++ b/gio/gwin32registrykey.c @@ -2623,8 +2623,6 @@ g_win32_registry_key_set_property (GObject *object, switch (prop_id) { case PROP_PATH: - g_assert (priv->absolute_path_w == NULL); - g_assert (priv->absolute_path == NULL); path = g_value_get_string (value); if (path == NULL) @@ -2635,20 +2633,21 @@ g_win32_registry_key_set_property (GObject *object, if (path_w == NULL) break; - g_free (priv->absolute_path_w); - g_free (priv->absolute_path); + /* Construct only */ + g_assert (priv->absolute_path_w == NULL); + g_assert (priv->absolute_path == NULL); priv->absolute_path_w = path_w; priv->absolute_path = g_value_dup_string (value); break; case PROP_PATH_UTF16: - g_assert (priv->absolute_path_w == NULL); - g_assert (priv->absolute_path == NULL); path_w = (gunichar2 *) g_value_get_pointer (value); if (path_w == NULL) break; + /* Construct only */ + g_assert (priv->absolute_path_w == NULL); priv->absolute_path_w = g_wcsdup (path_w, -1); break;