Fix refcount issue in stylesheet tracking
Resolves: https://issues.redhat.com/browse/RHEL-69401
This commit is contained in:
parent
df3939b79d
commit
2a9fc66fe4
115
0001-st-theme-Reuse-stylesheets-if-possible.patch
Normal file
115
0001-st-theme-Reuse-stylesheets-if-possible.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From 11a28c3df5cd0afb254d5f1f68dcb923b97d09ae Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 29 Jan 2025 02:46:44 +0100
|
||||
Subject: [PATCH] st/theme: Reuse stylesheets if possible
|
||||
|
||||
The following happens when processing an `@import()` rule:
|
||||
|
||||
1. `_st_theme_resolve_url()` to resolve file
|
||||
2. `insert_stylesheet()` to track file/sheet
|
||||
a. take ownership of file/sheet (ref)
|
||||
b. use file as key in `stylesheets_by_file` hash table
|
||||
c. use file as value in `files_by_stylesheet` hash table
|
||||
3. release reference to file
|
||||
|
||||
This leads to a refcount error when importing a file that
|
||||
was already parsed before:
|
||||
|
||||
1. file start with refcount 1
|
||||
2. `insert_stylesheet()`
|
||||
a. increases refcount to 2
|
||||
b. inserting into `stylesheets_by_file` *decreases* the
|
||||
passed-in key if the key already exists
|
||||
c. `files_by_stylesheet` now tracks a file with recount 1
|
||||
3. releases the last reference to file
|
||||
|
||||
The file object tracked in `files_by_stylesheet` is now invalid,
|
||||
and accessing it results in a crash.
|
||||
|
||||
Avoid this issue by reusing existing stylesheets, so we don't insert
|
||||
a stylesheet that's already tracked.
|
||||
|
||||
As a side-effect, this also saves us from re-parsing the same file
|
||||
unnecessarily.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7306
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3619>
|
||||
---
|
||||
src/st/st-theme.c | 32 ++++++++++++++++++++++++++------
|
||||
1 file changed, 26 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/st/st-theme.c b/src/st/st-theme.c
|
||||
index 20d42fd334..5db35645bf 100644
|
||||
--- a/src/st/st-theme.c
|
||||
+++ b/src/st/st-theme.c
|
||||
@@ -250,6 +250,27 @@ insert_stylesheet (StTheme *theme,
|
||||
g_hash_table_insert (theme->files_by_stylesheet, stylesheet, file);
|
||||
}
|
||||
|
||||
+static CRStyleSheet *
|
||||
+resolve_stylesheet (StTheme *theme,
|
||||
+ GFile *file,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ CRStyleSheet *sheet;
|
||||
+
|
||||
+ sheet = g_hash_table_lookup (theme->stylesheets_by_file, file);
|
||||
+ if (sheet)
|
||||
+ {
|
||||
+ cr_stylesheet_ref (sheet);
|
||||
+ return sheet;
|
||||
+ }
|
||||
+
|
||||
+ sheet = parse_stylesheet (file, error);
|
||||
+ if (sheet)
|
||||
+ insert_stylesheet (theme, file, sheet);
|
||||
+
|
||||
+ return sheet;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* st_theme_load_stylesheet:
|
||||
* @theme: a #StTheme
|
||||
@@ -267,13 +288,12 @@ st_theme_load_stylesheet (StTheme *theme,
|
||||
{
|
||||
CRStyleSheet *stylesheet;
|
||||
|
||||
- stylesheet = parse_stylesheet (file, error);
|
||||
+ stylesheet = resolve_stylesheet (theme, file, error);
|
||||
if (!stylesheet)
|
||||
return FALSE;
|
||||
|
||||
stylesheet->app_data = GUINT_TO_POINTER (TRUE);
|
||||
|
||||
- insert_stylesheet (theme, file, stylesheet);
|
||||
cr_stylesheet_ref (stylesheet);
|
||||
theme->custom_stylesheets = g_slist_prepend (theme->custom_stylesheets, stylesheet);
|
||||
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
|
||||
@@ -890,6 +910,7 @@ add_matched_properties (StTheme *a_this,
|
||||
|
||||
if (import_rule->sheet == NULL)
|
||||
{
|
||||
+ CRStyleSheet *sheet = NULL;
|
||||
GFile *file = NULL;
|
||||
|
||||
if (import_rule->url->stryng && import_rule->url->stryng->str)
|
||||
@@ -897,13 +918,12 @@ add_matched_properties (StTheme *a_this,
|
||||
file = _st_theme_resolve_url (a_this,
|
||||
a_nodesheet,
|
||||
import_rule->url->stryng->str);
|
||||
- import_rule->sheet = parse_stylesheet (file, NULL);
|
||||
+ sheet = resolve_stylesheet (a_this, file, NULL);
|
||||
}
|
||||
|
||||
- if (import_rule->sheet)
|
||||
+ if (sheet)
|
||||
{
|
||||
- insert_stylesheet (a_this, file, import_rule->sheet);
|
||||
- /* refcount of stylesheets starts off at zero, so we don't need to unref! */
|
||||
+ import_rule->sheet = sheet;
|
||||
}
|
||||
else
|
||||
{
|
||||
--
|
||||
2.49.0
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
Name: gnome-shell
|
||||
Version: 40.10
|
||||
Release: 24%{?dist}
|
||||
Release: 25%{?dist}
|
||||
Summary: Window management and application launching for GNOME
|
||||
|
||||
License: GPLv2+
|
||||
@ -72,6 +72,7 @@ Patch61: screencast-bus-name.patch
|
||||
Patch62: fix-inhibit-shortcut-permission.patch
|
||||
Patch63: 0001-shell-window-tracker-Help-mutter-finding-app-info-s-.patch
|
||||
Patch64: 0001-dnd-Don-t-leak-a-signal-connection.patch
|
||||
Patch65: 0001-st-theme-Reuse-stylesheets-if-possible.patch
|
||||
|
||||
%define eds_version 3.33.1
|
||||
%define gnome_desktop_version 3.35.91
|
||||
@ -301,6 +302,10 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Mon May 05 2025 Florian Müllner <fmuellner@redhat.com> - 40.10-25
|
||||
- Fix refount issue in stylesheet tracking
|
||||
Resolves: RHEL-69401
|
||||
|
||||
* Thu Feb 13 2025 Florian Müllner <fmuellner@redhat.com> - 40.10-24
|
||||
- Fix session button visibility after auth failure
|
||||
Resolves: RHEL-4116
|
||||
|
Loading…
Reference in New Issue
Block a user