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.
This commit is contained in:
Руслан Ижбулатов 2020-06-04 18:06:36 +00:00
parent c93318953e
commit 8651bee90f

View File

@ -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;