Package: evolution-data-server
Version: 3.16.5-1wri1
Severity: grave
Tags: patch
Justification: renders package unusable

Dear Maintainer,

The attached patch fixes a problem that occurs when libglib2.0-0 is upgraded
from 2.44.1 to the current 2.46.0. After the upgrade, Evolution can no longer
contact any Exchange server via evolution-ews, and mh-mail directories cannot
be found because the configuration reverts to default.

The problem also appears to exist in EDS 3.17.90.

The problem occurs because e-source-camel.c used various hacks that depend on
pre-2.45.7 gobject code. Those hacks no longer work, ultimately causing various
evolution config entries to revert to default and ignore all attempts to
correct the issue.

The patch has already been submitted upstream, but you may wish to add it now
to fix the problem until the upstream patch reaches the Debian source, since
evolution is essentially broken without the patch.

*Note*: the 1wri1 versions listed below include the patch as a local
modification.  Actual version without the patch would be the same but without
the 'wri1' local increment.



-- System Information:
Debian Release: stretch/sid
  APT prefers unstable
  APT policy: (990, 'unstable'), (500, 'stable-updates'), (500, 'testing'),
(500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.1.0-2-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages evolution-data-server depends on:
ii  evolution-data-server-common  3.16.5-1wri1
ii  gnome-keyring                 3.16.0-4
ii  libc6                         2.19-22
ii  libcamel-1.2-52               3.16.5-1wri1
ii  libdb5.3                      5.3.28-11
ii  libebackend-1.2-10            3.16.5-1wri1
ii  libebook-1.2-16               3.16.5-1wri1
ii  libebook-contacts-1.2-1       3.16.5-1wri1
ii  libecal-1.2-18                3.16.5-1wri1
ii  libedata-book-1.2-25          3.16.5-1wri1
ii  libedata-cal-1.2-27           3.16.5-1wri1
ii  libedataserver-1.2-20         3.16.5-1wri1
ii  libgcr-base-3-1               3.16.0-1
ii  libgcr-ui-3-1                 3.16.0-1
ii  libgdata22                    0.17.3-1
ii  libglib2.0-0                  2.46.0-2
ii  libgoa-1.0-0b                 3.16.4-1
ii  libgtk-3-0                    3.16.6-1
ii  libgweather-3-6               3.18.0-1
ii  libical1a                     1.0.1-0.1
ii  libldap-2.4-2                 2.4.42+dfsg-2
ii  libpango-1.0-0                1.38.0-3
ii  libsecret-1-0                 0.18.3-1
ii  libsoup2.4-1                  2.52.0-1
ii  libxml2                       2.9.2+zdfsg1-4

evolution-data-server recommends no packages.

Versions of packages evolution-data-server suggests:
ii  evolution                  3.16.5-1
pn  evolution-data-server-dbg  <none>
diff --git a/libedataserver/e-source-camel.c b/libedataserver/e-source-camel.c
index b46f133..000e6b7 100644
--- a/libedataserver/e-source-camel.c
+++ b/libedataserver/e-source-camel.c
@@ -126,12 +126,7 @@ G_DEFINE_ABSTRACT_TYPE (
 	e_source_camel,
 	E_TYPE_SOURCE_EXTENSION)
 
-/* XXX A function like this belongs in GObject.  I may yet propose it,
- *     GParamSpecClass still has some reserved slots.  This fiddles with
- *     GParamSpec fields that are supposed to be private to GObject, but
- *     I have no other choice.
- *
- * XXX Historical note, originally I tried (ab)using override properties
+/* XXX Historical note, originally I tried (ab)using override properties
  *     in ESourceCamel, which redirected to the equivalent CamelSettings
  *     property.  Seemed to work at first, and I was proud of my clever
  *     hack, but it turns out g_object_class_list_properties() excludes
@@ -141,53 +136,157 @@ static GParamSpec *
 param_spec_clone (GParamSpec *pspec)
 {
 	GParamSpec *clone;
-	GTypeQuery query;
-
-	/* Query the instance size. */
-	g_type_query (G_PARAM_SPEC_TYPE (pspec), &query);
-
-	/* Start with a memcpy()'d buffer. */
-	clone = g_slice_alloc0 (query.instance_size);
-	memcpy (clone, pspec, query.instance_size);
-
-	/* This sort of mimics g_param_spec_init(). */
-
-#define PARAM_FLOATING_FLAG 0x2  /* from gparam.c */
-	g_datalist_set_flags (&clone->qdata, PARAM_FLOATING_FLAG);
-	clone->ref_count = 1;
-
-	/* Clear the owner_type. */
-	clone->owner_type = G_TYPE_INVALID;
-
-	/* Clear the param_id. */
-	clone->param_id = 0;
-
-	/* This sort of mimics g_param_spec_internal(). */
-
-	/* Param name should already be canonicalized and interned. */
-
-	/* Always copy the nickname. */
-	clone->flags &= ~G_PARAM_STATIC_NICK;
-	clone->_nick = g_strdup (g_param_spec_get_nick (pspec));
-
-	/* Always copy the blurb. */
-	clone->flags &= ~G_PARAM_STATIC_BLURB;
-	clone->_blurb = g_strdup (g_param_spec_get_blurb (pspec));
-
-	/* Handle special cases. */
-
-	if (G_IS_PARAM_SPEC_STRING (clone)) {
-		GParamSpecString *clone_s;
-
-		clone_s = (GParamSpecString *) clone;
-		clone_s->default_value = g_strdup (clone_s->default_value);
+	GParamFlags flags;
+	const gchar *name, *nick, *blurb;
+
+	name = g_param_spec_get_name (pspec);
+	nick = g_param_spec_get_nick (pspec);
+	blurb = g_param_spec_get_blurb (pspec);
+	flags = (pspec->flags & ~(G_PARAM_STATIC_STRINGS));
+
+	if (G_IS_PARAM_SPEC_BOOLEAN (pspec)) {
+		GParamSpecBoolean *pspec_boolean = G_PARAM_SPEC_BOOLEAN (pspec);
+
+		clone = g_param_spec_boolean (name, nick, blurb,
+			pspec_boolean->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_CHAR (pspec)) {
+		GParamSpecChar *pspec_char = G_PARAM_SPEC_CHAR (pspec);
+
+		clone = g_param_spec_char (name, nick, blurb,
+			pspec_char->minimum,
+			pspec_char->maximum,
+			pspec_char->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_UCHAR (pspec)) {
+		GParamSpecUChar *pspec_uchar = G_PARAM_SPEC_UCHAR (pspec);
+
+		clone = g_param_spec_uchar (name, nick, blurb,
+			pspec_uchar->minimum,
+			pspec_uchar->maximum,
+			pspec_uchar->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_INT (pspec)) {
+		GParamSpecInt *pspec_int = G_PARAM_SPEC_INT (pspec);
+
+		clone = g_param_spec_int (name, nick, blurb,
+			pspec_int->minimum,
+			pspec_int->maximum,
+			pspec_int->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_UINT (pspec)) {
+		GParamSpecUInt *pspec_uint = G_PARAM_SPEC_UINT (pspec);
+
+		clone = g_param_spec_uint (name, nick, blurb,
+			pspec_uint->minimum,
+			pspec_uint->maximum,
+			pspec_uint->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_LONG (pspec)) {
+		GParamSpecLong *pspec_long = G_PARAM_SPEC_LONG (pspec);
+
+		clone = g_param_spec_long (name, nick, blurb,
+			pspec_long->minimum,
+			pspec_long->maximum,
+			pspec_long->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_ULONG (pspec)) {
+		GParamSpecULong *pspec_ulong = G_PARAM_SPEC_ULONG (pspec);
+
+		clone = g_param_spec_ulong (name, nick, blurb,
+			pspec_ulong->minimum,
+			pspec_ulong->maximum,
+			pspec_ulong->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_INT64 (pspec)) {
+		GParamSpecInt64 *pspec_int64 = G_PARAM_SPEC_INT64 (pspec);
+
+		clone = g_param_spec_int64 (name, nick, blurb,
+			pspec_int64->minimum,
+			pspec_int64->maximum,
+			pspec_int64->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_UINT64 (pspec)) {
+		GParamSpecUInt64 *pspec_uint64 = G_PARAM_SPEC_UINT64 (pspec);
+
+		clone = g_param_spec_uint64 (name, nick, blurb,
+			pspec_uint64->minimum,
+			pspec_uint64->maximum,
+			pspec_uint64->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_FLOAT (pspec)) {
+		GParamSpecFloat *pspec_float = G_PARAM_SPEC_FLOAT (pspec);
+
+		clone = g_param_spec_float (name, nick, blurb,
+			pspec_float->minimum,
+			pspec_float->maximum,
+			pspec_float->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) {
+		GParamSpecDouble *pspec_double = G_PARAM_SPEC_DOUBLE (pspec);
+
+		clone = g_param_spec_double (name, nick, blurb,
+			pspec_double->minimum,
+			pspec_double->maximum,
+			pspec_double->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_ENUM (pspec)) {
+		GParamSpecEnum *pspec_enum = G_PARAM_SPEC_ENUM (pspec);
+
+		clone = g_param_spec_enum (name, nick, blurb,
+			pspec->value_type,
+			pspec_enum->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_FLAGS (pspec)) {
+		GParamSpecFlags *pspec_flags = G_PARAM_SPEC_FLAGS (pspec);
+
+		clone = g_param_spec_flags (name, nick, blurb,
+			pspec->value_type,
+			pspec_flags->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_STRING (pspec)) {
+		GParamSpecString *pspec_string = G_PARAM_SPEC_STRING (pspec);
+
+		clone = g_param_spec_string (name, nick, blurb,
+			pspec_string->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_PARAM (pspec)) {
+		clone = g_param_spec_param (name, nick, blurb,
+			pspec->value_type,
+			flags);
+	} else if (G_IS_PARAM_SPEC_BOXED (pspec)) {
+		clone = g_param_spec_boxed (name, nick, blurb,
+			pspec->value_type,
+			flags);
+	} else if (G_IS_PARAM_SPEC_POINTER (pspec)) {
+		clone = g_param_spec_pointer (name, nick, blurb, flags);
+	} else if (G_IS_PARAM_SPEC_OBJECT (pspec)) {
+		clone = g_param_spec_object (name, nick, blurb,
+			pspec->value_type,
+			flags);
+	} else if (G_IS_PARAM_SPEC_UNICHAR (pspec)) {
+		GParamSpecUnichar *pspec_unichar = G_PARAM_SPEC_UNICHAR (pspec);
+
+		clone = g_param_spec_unichar (name, nick, blurb,
+			pspec_unichar->default_value,
+			flags);
+	} else if (G_IS_PARAM_SPEC_GTYPE (pspec)) {
+		GParamSpecGType *pspec_gtype = G_PARAM_SPEC_GTYPE (pspec);
+
+		clone = g_param_spec_gtype (name, nick, blurb,
+			pspec_gtype->is_a_type,
+			flags);
+	} else if (G_IS_PARAM_SPEC_VARIANT (pspec)) {
+		GParamSpecVariant *pspec_variant = G_PARAM_SPEC_VARIANT (pspec);
+
+		clone = g_param_spec_variant (name, nick, blurb,
+			pspec_variant->type,
+			pspec_variant->default_value,
+			flags);
+	} else {
+		g_warn_if_reached ();
 	}
 
-	/* Some types we don't handle but shouldn't need to. */
-	g_warn_if_fail (!G_IS_PARAM_SPEC_VALUE_ARRAY (clone));
-	g_warn_if_fail (!G_IS_PARAM_SPEC_OVERRIDE (clone));
-	g_warn_if_fail (!G_IS_PARAM_SPEC_VARIANT (clone));
-
 	return clone;
 }
 

Reply via email to