Version in base suite: 3.56.1-2 Base version: evolution-data-server_3.56.1-2 Target version: evolution-data-server_3.56.2-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/e/evolution-data-server/evolution-data-server_3.56.1-2.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/e/evolution-data-server/evolution-data-server_3.56.2-0+deb13u1.dsc CMakeLists.txt | 2 NEWS | 8 + debian/changelog | 8 + debian/gbp.conf | 4 debian/patches/I-605-Camel-MH-account-busy-loops-when-reading-directory-.patch | 32 +++++ debian/patches/series | 1 src/camel/camel-data-wrapper.c | 4 src/libedataserver/e-webdav-discover.c | 58 +++++++++- src/modules/gnome-online-accounts/module-gnome-online-accounts.c | 31 ++++- 9 files changed, 138 insertions(+), 10 deletions(-) diff -Nru evolution-data-server-3.56.1/CMakeLists.txt evolution-data-server-3.56.2/CMakeLists.txt --- evolution-data-server-3.56.1/CMakeLists.txt 2025-04-11 06:11:13.000000000 +0000 +++ evolution-data-server-3.56.2/CMakeLists.txt 2025-05-23 18:23:03.000000000 +0000 @@ -4,7 +4,7 @@ cmake_policy(VERSION 3.15) project(evolution-data-server - VERSION 3.56.1 + VERSION 3.56.2 LANGUAGES C CXX) set(PROJECT_BUGREPORT "https://gitlab.gnome.org/GNOME/evolution-data-server/issues/") diff -Nru evolution-data-server-3.56.1/NEWS evolution-data-server-3.56.2/NEWS --- evolution-data-server-3.56.1/NEWS 2025-04-11 06:11:13.000000000 +0000 +++ evolution-data-server-3.56.2/NEWS 2025-05-23 18:23:03.000000000 +0000 @@ -1,3 +1,11 @@ +Evolution-Data-Server 3.56.2 2025-05-23 +--------------------------------------- + +Bug Fixes: + I#592 - Handle changed server pool in WebDAV collection sources ][ + I#593 - CamelDataWrapper: Correct return value of size calculate functions (dagosuhn) + I#597 - GOA EWS: Fallback to likely EWS host URL when autodicovery fails + Evolution-Data-Server 3.56.1 2025-04-11 --------------------------------------- diff -Nru evolution-data-server-3.56.1/debian/changelog evolution-data-server-3.56.2/debian/changelog --- evolution-data-server-3.56.1/debian/changelog 2025-04-11 12:05:24.000000000 +0000 +++ evolution-data-server-3.56.2/debian/changelog 2025-11-05 23:01:25.000000000 +0000 @@ -1,3 +1,11 @@ +evolution-data-server (3.56.2-0+deb13u1) trixie; urgency=medium + + * New upstream bugfix release + * Cherry-pick patch to fix busy loop when using the MH format mail archive + (Closes: #1111605) + + -- Jeremy Bícha Wed, 05 Nov 2025 18:01:25 -0500 + evolution-data-server (3.56.1-2) unstable; urgency=medium [ Jeremy Bícha diff -Nru evolution-data-server-3.56.1/debian/gbp.conf evolution-data-server-3.56.2/debian/gbp.conf --- evolution-data-server-3.56.1/debian/gbp.conf 2025-04-11 12:05:24.000000000 +0000 +++ evolution-data-server-3.56.2/debian/gbp.conf 2025-11-05 23:01:25.000000000 +0000 @@ -1,7 +1,7 @@ [DEFAULT] pristine-tar = True -debian-branch = debian/latest -upstream-branch = upstream/latest +debian-branch = debian/trixie +upstream-branch = upstream/3.56.x [buildpackage] sign-tags = True diff -Nru evolution-data-server-3.56.1/debian/patches/I-605-Camel-MH-account-busy-loops-when-reading-directory-.patch evolution-data-server-3.56.2/debian/patches/I-605-Camel-MH-account-busy-loops-when-reading-directory-.patch --- evolution-data-server-3.56.1/debian/patches/I-605-Camel-MH-account-busy-loops-when-reading-directory-.patch 1970-01-01 00:00:00.000000000 +0000 +++ evolution-data-server-3.56.2/debian/patches/I-605-Camel-MH-account-busy-loops-when-reading-directory-.patch 2025-11-05 23:01:25.000000000 +0000 @@ -0,0 +1,32 @@ +From: Milan Crha +Date: Mon, 18 Aug 2025 16:00:12 +0200 +Subject: I#605 - Camel: MH account busy-loops when reading directory content + +Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/605 + +(cherry picked from commit 9a212fd7f8a91332b87869ac93e6ccd93133308d) + +Origin: upstream, after 3.57.2 +--- + src/camel/camel-folder-summary.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/camel/camel-folder-summary.c b/src/camel/camel-folder-summary.c +index 6cb4e50..79aba88 100644 +--- a/src/camel/camel-folder-summary.c ++++ b/src/camel/camel-folder-summary.c +@@ -2661,10 +2661,10 @@ camel_folder_summary_clear (CamelFolderSummary *summary, + g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), FALSE); + + camel_folder_summary_lock (summary); +- if (camel_folder_summary_count (summary) == 0) { +- camel_folder_summary_unlock (summary); +- return TRUE; +- } ++ ++ /* Do not check the camel_folder_summary_count() or similar here, the clear() ++ can be called before the summary is loaded, thus the shortcut could mean ++ the messages are still left in the DB file. */ + + g_hash_table_remove_all (summary->priv->uids); + remove_all_loaded (summary); diff -Nru evolution-data-server-3.56.1/debian/patches/series evolution-data-server-3.56.2/debian/patches/series --- evolution-data-server-3.56.1/debian/patches/series 2025-04-11 12:05:24.000000000 +0000 +++ evolution-data-server-3.56.2/debian/patches/series 2025-11-05 23:01:25.000000000 +0000 @@ -1,3 +1,4 @@ 01-noinst-libedbus-private.patch ubuntu_gettext_domain.patch docs-Update-URL-to-libsoup-docs.patch +I-605-Camel-MH-account-busy-loops-when-reading-directory-.patch diff -Nru evolution-data-server-3.56.1/src/camel/camel-data-wrapper.c evolution-data-server-3.56.2/src/camel/camel-data-wrapper.c --- evolution-data-server-3.56.1/src/camel/camel-data-wrapper.c 2025-04-11 06:11:13.000000000 +0000 +++ evolution-data-server-3.56.2/src/camel/camel-data-wrapper.c 2025-05-23 18:23:03.000000000 +0000 @@ -1609,7 +1609,7 @@ stream = camel_stream_null_new (); - if (camel_data_wrapper_write_to_stream_sync (data_wrapper, stream, cancellable, error)) + if (camel_data_wrapper_write_to_stream_sync (data_wrapper, stream, cancellable, error) >= 0) bytes_written = camel_stream_null_get_bytes_written (CAMEL_STREAM_NULL (stream)); g_object_unref (stream); @@ -1644,7 +1644,7 @@ stream = camel_stream_null_new (); - if (camel_data_wrapper_decode_to_stream_sync (data_wrapper, stream, cancellable, error)) + if (camel_data_wrapper_decode_to_stream_sync (data_wrapper, stream, cancellable, error) >= 0) bytes_written = camel_stream_null_get_bytes_written (CAMEL_STREAM_NULL (stream)); g_object_unref (stream); diff -Nru evolution-data-server-3.56.1/src/libedataserver/e-webdav-discover.c evolution-data-server-3.56.2/src/libedataserver/e-webdav-discover.c --- evolution-data-server-3.56.1/src/libedataserver/e-webdav-discover.c 2025-04-11 06:11:13.000000000 +0000 +++ evolution-data-server-3.56.2/src/libedataserver/e-webdav-discover.c 2025-05-23 18:23:03.000000000 +0000 @@ -43,6 +43,58 @@ G_DEFINE_BOXED_TYPE (EWebDAVDiscoveredSource, e_webdav_discovered_source, e_webdav_discovered_source_copy, e_webdav_discovered_source_free) +/* some server, like iCloud, can return different server pools for different entry points, + which look like "https://p66-caldav.icloud.com/...." which are technically different + URL-s, but pointing to the same collection, thus skip the pool part and compare only + the ".icloud.com/...." in the processed URL-s. */ +static const gchar * +webdav_discover_skip_first_host_part (const gchar *href) +{ + const gchar *ptr, *dash, *dot; + + ptr = strstr (href, "://"); + if (!ptr) + return href; + + ptr += 3; + dash = strchr (ptr, '/'); + ptr = strchr (ptr, '.'); + + /* the first dot is before the next forward slash */ + if (!ptr || ptr > dash) + return href; + + dot = strchr (ptr + 1, '.'); + /* the second dot is before the next forward slash */ + if (!dot || dot > dash) + return href; + + /* leaving the 'ptr' as ".icloud.com/....." */ + return ptr; +} + +static guint +webdav_discover_href_hash (gconstpointer ptr) +{ + const gchar *href = ptr; + + href = webdav_discover_skip_first_host_part (href); + + return g_str_hash (href); +} + +static gboolean +webdav_discover_href_equal (gconstpointer ptr1, + gconstpointer ptr2) +{ + const gchar *href1 = ptr1, *href2 = ptr2; + + href1 = webdav_discover_skip_first_host_part (href1); + href2 = webdav_discover_skip_first_host_part (href2); + + return g_str_equal (href1, href2); +} + static gboolean e_webdav_discovery_already_discovered (const gchar *href, const GSList *discovered_sources, @@ -929,7 +981,11 @@ gboolean fatal_error; GError *local_error = NULL; - wdd.covered_hrefs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + /* play with the server pools only for icloud.com servers */ + if (g_uri_get_host (guri) && e_util_host_is_in_domain (g_uri_get_host (guri), "icloud.com")) + wdd.covered_hrefs = g_hash_table_new_full (webdav_discover_href_hash, webdav_discover_href_equal, g_free, NULL); + else + wdd.covered_hrefs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); wdd.addressbooks = NULL; wdd.calendars = NULL; wdd.only_supports = only_supports; diff -Nru evolution-data-server-3.56.1/src/modules/gnome-online-accounts/module-gnome-online-accounts.c evolution-data-server-3.56.2/src/modules/gnome-online-accounts/module-gnome-online-accounts.c --- evolution-data-server-3.56.1/src/modules/gnome-online-accounts/module-gnome-online-accounts.c 2025-04-11 06:11:13.000000000 +0000 +++ evolution-data-server-3.56.2/src/modules/gnome-online-accounts/module-gnome-online-accounts.c 2025-05-23 18:23:03.000000000 +0000 @@ -262,6 +262,7 @@ const gchar *extension_name; gchar *as_url = NULL; gchar *oab_url = NULL; + gchar *fallback_host_url = NULL; GError *error = NULL; g_return_if_fail (GOA_IS_OBJECT (source_object)); @@ -272,8 +273,21 @@ if (!goa_ews_autodiscover_finish (goa_object, result, &as_url, &oab_url, &error) || !as_url) { g_message ("Failed to autodiscover EWS data: %s", error ? error->message : "Unknown error"); g_clear_error (&error); - g_object_unref (source); - return; + as_url = NULL; + oab_url = NULL; + } + + if (!as_url) { + GoaExchange *goa_exchange; + gchar *host; + + goa_exchange = goa_object_get_exchange (goa_object); + host = goa_exchange_dup_host (goa_exchange); + g_clear_object (&goa_exchange); + + fallback_host_url = g_strconcat ("https://", host, "/EWS/Exchange.asmx", NULL); + + g_free (host); } /* XXX We don't have direct access to CamelEwsSettings from here @@ -288,17 +302,25 @@ GoaAccount *goa_account; CamelSettings *settings; GUri *suri; + const gchar *host_url; gchar *user, *email; + if (!as_url) { + g_object_get (source_extension, "hosturl", &as_url, NULL); + if (as_url && !*as_url) + g_clear_pointer (&as_url, g_free); + } + + host_url = as_url ? as_url : fallback_host_url; goa_account = goa_object_peek_account (goa_object); user = goa_account_dup_identity (goa_account); email = goa_account_dup_presentation_identity (goa_account); - suri = g_uri_parse (as_url, SOUP_HTTP_URI_FLAGS | G_URI_FLAGS_PARSE_RELAXED, NULL); + suri = g_uri_parse (host_url, SOUP_HTTP_URI_FLAGS | G_URI_FLAGS_PARSE_RELAXED, NULL); g_object_set ( source_extension, - "hosturl", as_url, + "hosturl", host_url, "oaburl", oab_url, "email", email, NULL); @@ -323,6 +345,7 @@ } g_object_unref (source); + g_free (fallback_host_url); g_free (as_url); g_free (oab_url); }