Bug#964851: gnome-shell: calendar-server leaks memory, accumulating GBs in a few days
Heewa Barfchin
heewa.b at gmail.com
Sat Jul 11 06:03:44 BST 2020
Package: gnome-shell
Version: 3.36.3-1
Severity: important
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu groovy ubuntu-patch
Dear Maintainer,
I've noticed gnome-shell-calendar-server process increasing in memory
usage to the point of 10s of GBs, repeatedly, over the course of a day
or two. So I dove into the code, profiled with valgrind, and identified
a few possible memory leaks. I made some fixes (and after a few round
trips), was able to verify that the process no longer grows in memory
usage, even after a few days.
I submitted a Merge Request to Gnome
(https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1335),
which they don't need, as they chose to backport a larger set of changes
that also address the leaks. However, since those changes will take a
while to be released and make it downstream, I thought I'd submit my
fix for now.
For reference, the Ubuntu bug is tracked here:
https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1885346
Thanks for considering the patch.
-- System Information:
Debian Release: bullseye/sid
APT prefers focal-updates
APT policy: (500, 'focal-updates'), (500, 'focal-security'), (500, 'focal-proposed'), (500, 'focal'), (100, 'focal-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 5.4.0-40-generic (SMP w/4 CPU cores)
Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages gnome-settings-daemon depends on:
ii gnome-settings-daemon-common 3.36.1-0ubuntu1
ii gsettings-desktop-schemas 3.36.0-1ubuntu1
ii libaccountsservice0 0.6.55-0ubuntu12~20.04.1
ii libasound2 1.2.2-2.1ubuntu1
ii libc6 2.31-0ubuntu9
ii libcairo2 1.16.0-4ubuntu1
ii libcanberra-gtk3-0 0.30-7ubuntu1
ii libcanberra0 0.30-7ubuntu1
ii libcolord2 1.4.4-2
ii libcups2 2.3.1-9ubuntu1.1
ii libfontconfig1 2.13.1-2ubuntu3
ii libgcr-base-3-1 3.36.0-2build1
ii libgdk-pixbuf2.0-0 2.40.0+dfsg-3
ii libgeoclue-2-0 2.5.6-0ubuntu1
ii libgeocode-glib0 3.26.2-2
ii libglib2.0-0 2.64.2-1~fakesync1
ii libgnome-desktop-3-19 3.36.2-0ubuntu2
ii libgtk-3-0 3.24.20-0ubuntu1
ii libgudev-1.0-0 1:233-1
ii libgweather-3-16 3.36.0-1
ii liblcms2-2 2.9-4
ii libmm-glib0 1.12.8-1
ii libnm0 1.22.10-1ubuntu2.1
ii libnotify4 0.7.9-1ubuntu2
ii libnspr4 2:4.25-1
ii libnss3 2:3.49.1-1ubuntu1.1
ii libpam-systemd [logind] 245.4-4ubuntu3.1
ii libpango-1.0-0 1.44.7-2ubuntu4
ii libpangocairo-1.0-0 1.44.7-2ubuntu4
ii libpolkit-gobject-1-0 0.105-26ubuntu1
ii libpulse-mainloop-glib0 1:13.99.1-1ubuntu3.3
ii libpulse0 1:13.99.1-1ubuntu3.3
ii libupower-glib3 0.99.11-1build2
ii libwacom2 1.3-2ubuntu1
ii libwayland-client0 1.18.0-1
ii libx11-6 2:1.6.9-2ubuntu1
ii libxext6 2:1.3.4-0ubuntu1
ii libxi6 2:1.7.10-0ubuntu1
ii x11-xserver-utils 7.7+8
Versions of packages gnome-settings-daemon recommends:
ii iio-sensor-proxy 2.8-1
ii pulseaudio 1:13.99.1-1ubuntu3.3
Versions of packages gnome-settings-daemon suggests:
pn usbguard <none>
Versions of packages libgjs0g depends on:
ii libc6 2.31-0ubuntu9
ii libcairo-gobject2 1.16.0-4ubuntu1
ii libcairo2 1.16.0-4ubuntu1
ii libffi7 3.3-4
ii libgcc-s1 10-20200411-0ubuntu1
ii libgirepository-1.0-1 1.64.1-1~ubuntu20.04.1
ii libglib2.0-0 2.64.2-1~fakesync1
ii libmozjs-68-0 68.6.0-1ubuntu1
ii libreadline8 8.0-4
ii libstdc++6 10-20200411-0ubuntu1
ii libx11-6 2:1.6.9-2ubuntu1
Versions of packages gnome-shell is related to:
ii libegl-mesa0 [libegl-vendor] 20.0.8-0ubuntu1~20.04.1
ii libgl1-mesa-dri 20.0.8-0ubuntu1~20.04.1
ii libglx-mesa0 [libglx-vendor] 20.0.8-0ubuntu1~20.04.1
-------------- next part --------------
diff -Nru gnome-shell-3.36.3/debian/control gnome-shell-3.36.3/debian/control
--- gnome-shell-3.36.3/debian/control 2020-06-05 14:20:50.000000000 -0400
+++ gnome-shell-3.36.3/debian/control 2020-07-11 00:44:51.000000000 -0400
@@ -5,8 +5,7 @@
Source: gnome-shell
Section: gnome
Priority: optional
-Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
-XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers at lists.alioth.debian.org>
+Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers at lists.alioth.debian.org>
Uploaders: Iain Lane <laney at debian.org>, Jeremy Bicha <jbicha at debian.org>
Build-Depends: appstream,
asciidoc-base,
diff -Nru gnome-shell-3.36.3/debian/control.in gnome-shell-3.36.3/debian/control.in
--- gnome-shell-3.36.3/debian/control.in 2020-06-05 14:20:50.000000000 -0400
+++ gnome-shell-3.36.3/debian/control.in 2020-07-11 00:44:51.000000000 -0400
@@ -1,8 +1,7 @@
Source: gnome-shell
Section: gnome
Priority: optional
-Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
-XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers at lists.alioth.debian.org>
+Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers at lists.alioth.debian.org>
Uploaders: @GNOME_TEAM@
Build-Depends: appstream,
asciidoc-base,
diff -Nru gnome-shell-3.36.3/debian/patches/fix-memleaks-in-calendar-server.patch gnome-shell-3.36.3/debian/patches/fix-memleaks-in-calendar-server.patch
--- gnome-shell-3.36.3/debian/patches/fix-memleaks-in-calendar-server.patch 1969-12-31 19:00:00.000000000 -0500
+++ gnome-shell-3.36.3/debian/patches/fix-memleaks-in-calendar-server.patch 2020-07-11 00:44:34.000000000 -0400
@@ -0,0 +1,93 @@
+Description: Fix a few memory leaks in calendar-server
+
+* Free allocation of calendar appointments (not just their contents)
+* Properly pass GVariantBuilders to variant funcs
+* Use NULLs where builders aren't populated, to avoid allocations
+* Use stack allocated builders to further reduce allocs
+
+Note for package maintainers: the leaks this patch fixes have been
+addressed in Gnome's repo via a much larger backported changeset that I
+was unable to build & verify on my own. Once they release those changes,
+this patch will no longer be necessary.
+
+Fixes #1885346
+
+Author: Heewa Barfchin <heewa.b at gmail.com>
+Origin: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1335/diffs?commit_id=6ea617895e91f929d693a546c462fa12e030fa0d
+Bug: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1885346
+Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1335
+Last-Update: 2020-07-10
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: gnome-shell-3.36.3/src/calendar-server/gnome-shell-calendar-server.c
+===================================================================
+--- gnome-shell-3.36.3.orig/src/calendar-server/gnome-shell-calendar-server.c
++++ gnome-shell-3.36.3/src/calendar-server/gnome-shell-calendar-server.c
+@@ -404,6 +404,8 @@ calendar_appointment_free (CalendarAppoi
+
+ appointment->start_time = 0;
+ appointment->is_all_day = FALSE;
++
++ g_free (appointment);
+ }
+
+ static void
+@@ -857,18 +859,16 @@ handle_method_call (GDBusConnection
+ window_changed = FALSE;
+ if (!(app->until == until && app->since == since))
+ {
+- GVariantBuilder *builder;
+- GVariantBuilder *invalidated_builder;
++ GVariantBuilder builder;
+
+ app->until = until;
+ app->since = since;
+ window_changed = TRUE;
+
+- builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
+- invalidated_builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
+- g_variant_builder_add (builder, "{sv}",
++ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
++ g_variant_builder_add (&builder, "{sv}",
+ "Until", g_variant_new_int64 (app->until));
+- g_variant_builder_add (builder, "{sv}",
++ g_variant_builder_add (&builder, "{sv}",
+ "Since", g_variant_new_int64 (app->since));
+ g_dbus_connection_emit_signal (app->connection,
+ NULL, /* destination_bus_name */
+@@ -877,8 +877,8 @@ handle_method_call (GDBusConnection
+ "PropertiesChanged",
+ g_variant_new ("(sa{sv}as)",
+ "org.gnome.Shell.CalendarServer",
+- builder,
+- invalidated_builder),
++ &builder,
++ NULL),
+ NULL); /* GError** */
+ }
+
+@@ -895,7 +895,6 @@ handle_method_call (GDBusConnection
+ g_hash_table_iter_init (&hash_iter, app->appointments);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &a))
+ {
+- GVariantBuilder extras_builder;
+ GSList *l;
+
+ for (l = a->occurrences; l; l = l->next)
+@@ -919,7 +918,6 @@ handle_method_call (GDBusConnection
+ a->uid,
+ o->rid ? o->rid : "");
+
+- g_variant_builder_init (&extras_builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_add (&builder,
+ "(sssbxxa{sv})",
+ id,
+@@ -928,7 +926,7 @@ handle_method_call (GDBusConnection
+ (gboolean) a->is_all_day,
+ (gint64) start_time,
+ (gint64) end_time,
+- extras_builder);
++ NULL);
+ g_free (id);
+ }
+ }
diff -Nru gnome-shell-3.36.3/debian/patches/series gnome-shell-3.36.3/debian/patches/series
--- gnome-shell-3.36.3/debian/patches/series 2020-06-05 14:20:50.000000000 -0400
+++ gnome-shell-3.36.3/debian/patches/series 2020-07-11 00:43:35.000000000 -0400
@@ -16,3 +16,4 @@
ubuntu/resolve_alternate_theme_path.patch
ubuntu/secure_mode_extension.patch
ubuntu/keep-ubuntu-logo-bright-lp1867133-v1.patch
+fix-memleaks-in-calendar-server.patch
More information about the pkg-gnome-maintainers
mailing list