mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 17:59:20 -04:00
Update glib to 2.50.3.
Also redo the kqueue patches. Now we patch files only once, and add some bits that got lost somewhere (which is probably my fault). Which where causing crashes when for example nautilus or thundar where monitoring directories and files where added/removed. PR: 199872
This commit is contained in:
parent
9f4546a03c
commit
cb48ab9bf7
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=460052
6 changed files with 131 additions and 120 deletions
|
@ -2,8 +2,7 @@
|
|||
# $FreeBSD$
|
||||
|
||||
PORTNAME= glib
|
||||
PORTVERSION= 2.50.2
|
||||
PORTREVISION= 7
|
||||
PORTVERSION= 2.50.3
|
||||
PORTEPOCH= 1
|
||||
CATEGORIES= devel
|
||||
MASTER_SITES= GNOME
|
||||
|
@ -39,7 +38,7 @@ INSTALL_TARGET= install-strip
|
|||
|
||||
SHEBANG_FILES= */*.pl
|
||||
|
||||
LIBVERSION= 0.5000.2
|
||||
LIBVERSION= 0.5000.3
|
||||
PLIST_SUB+= LIBVERSION=${LIBVERSION}
|
||||
|
||||
glib_MAN= gtester.1 gtester-report.1 glib-gettextize.1
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
TIMESTAMP = 1491129093
|
||||
SHA256 (gnome2/glib-2.50.2.tar.xz) = be68737c1f268c05493e503b3b654d2b7f43d7d0b8c5556f7e4651b870acfbf5
|
||||
SIZE (gnome2/glib-2.50.2.tar.xz) = 7582312
|
||||
TIMESTAMP = 1516046336
|
||||
SHA256 (gnome2/glib-2.50.3.tar.xz) = 82ee94bf4c01459b6b00cb9db0545c2237921e3060c0b74cff13fbc020cfd999
|
||||
SIZE (gnome2/glib-2.50.3.tar.xz) = 7589284
|
||||
|
|
|
@ -1,59 +0,0 @@
|
|||
From 22656f16c29591207c667362e2a42fd348fe8494 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Pieuchot <mpi@openbsd.org>
|
||||
Date: Fri, 28 Apr 2017 15:06:52 +0200
|
||||
Subject: [PATCH] kqueue: fix use-after-free of ``kqueue_sub''.
|
||||
|
||||
Since ``kqueue_sub'' are not refcounted it is common to see a thread
|
||||
freeing one of them while another thread is manipulating them. This
|
||||
leads to crashs reported in:
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=739424
|
||||
|
||||
To prevent such crash, make sure the threads are holding ``hash_lock''
|
||||
when manipulating such items.
|
||||
---
|
||||
gio/kqueue/kqueue-helper.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gio/kqueue/kqueue-helper.c b/gio/kqueue/kqueue-helper.c
|
||||
index d4e66cd4d..84b9ef164 100644
|
||||
--- gio/kqueue/kqueue-helper.c
|
||||
+++ gio/kqueue/kqueue-helper.c
|
||||
@@ -291,10 +291,10 @@ process_kqueue_notifications (GIOChannel *gioc,
|
||||
|
||||
G_LOCK (hash_lock);
|
||||
sub = (kqueue_sub *) g_hash_table_lookup (subs_hash_table, GINT_TO_POINTER (n.fd));
|
||||
- G_UNLOCK (hash_lock);
|
||||
|
||||
if (sub == NULL)
|
||||
{
|
||||
+ G_UNLOCK (hash_lock);
|
||||
KH_W ("Got a notification for a deleted or non-existing subscription %d",
|
||||
n.fd);
|
||||
return TRUE;
|
||||
@@ -336,6 +336,7 @@ process_kqueue_notifications (GIOChannel *gioc,
|
||||
g_file_monitor_source_handle_event (source, mask, NULL, NULL, NULL, g_get_monotonic_time ());
|
||||
}
|
||||
|
||||
+ G_UNLOCK (hash_lock);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -451,13 +452,14 @@ _kh_start_watching (kqueue_sub *sub)
|
||||
|
||||
G_LOCK (hash_lock);
|
||||
g_hash_table_insert (subs_hash_table, GINT_TO_POINTER (sub->fd), sub);
|
||||
- G_UNLOCK (hash_lock);
|
||||
|
||||
_kqueue_thread_push_fd (sub->fd);
|
||||
|
||||
/* Bump the kqueue thread. It will pick up a new sub entry to monitor */
|
||||
if (!_ku_write (kqueue_socket_pair[0], "A", 1))
|
||||
KH_W ("Failed to bump the kqueue thread (add fd, error %d)", errno);
|
||||
+ G_UNLOCK (hash_lock);
|
||||
+
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
--
|
||||
2.12.2
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
From e305fe971e4647d971428a772b7290b9c308a96f Mon Sep 17 00:00:00 2001
|
||||
From: Steven McDonald <steven@steven-mcdonald.id.au>
|
||||
Date: Sun, 12 Feb 2017 11:02:55 +1100
|
||||
Subject: gio: Always purge kqueue subs from missing list
|
||||
|
||||
Previously, _kh_cancel_sub assumed that it only needed to call
|
||||
_km_remove if sub did not exist in subs_hash_table. This is erroneous
|
||||
because the complementary operation, _km_add_missing, can be called
|
||||
from process_kqueue_notifications, in which context sub can *only* have
|
||||
come from subs_hash_table.
|
||||
|
||||
Since _km_remove is implemented using g_slist_remove, which is
|
||||
documented to be a noop if the list does not contain the element to be
|
||||
removed, it is safe to call _km_remove unconditionally here.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=778515
|
||||
---
|
||||
gio/kqueue/kqueue-helper.c | 15 +++++----------
|
||||
1 file changed, 5 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/gio/kqueue/kqueue-helper.c b/gio/kqueue/kqueue-helper.c
|
||||
index 4671396..d4e66cd 100644
|
||||
--- gio/kqueue/kqueue-helper.c
|
||||
+++ gio/kqueue/kqueue-helper.c
|
||||
@@ -498,22 +498,17 @@ _kh_add_sub (kqueue_sub *sub)
|
||||
gboolean
|
||||
_kh_cancel_sub (kqueue_sub *sub)
|
||||
{
|
||||
- gboolean missing = FALSE;
|
||||
+ gboolean removed = FALSE;
|
||||
g_assert (kqueue_socket_pair[0] != -1);
|
||||
g_assert (sub != NULL);
|
||||
|
||||
+ _km_remove (sub);
|
||||
+
|
||||
G_LOCK (hash_lock);
|
||||
- missing = !g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
|
||||
+ removed = g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
|
||||
G_UNLOCK (hash_lock);
|
||||
|
||||
- if (missing)
|
||||
- {
|
||||
- /* If there were no fd for this subscription, file is still
|
||||
- * missing. */
|
||||
- KH_W ("Removing subscription from missing");
|
||||
- _km_remove (sub);
|
||||
- }
|
||||
- else
|
||||
+ if (removed)
|
||||
{
|
||||
/* fd will be closed in the kqueue thread */
|
||||
_kqueue_thread_remove_fd (sub->fd);
|
||||
--
|
||||
cgit v0.12
|
||||
|
45
devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c
Normal file
45
devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
https://bugzilla.gnome.org/show_bug.cgi?id=739424
|
||||
https://bug739424.bugzilla-attachments.gnome.org/attachment.cgi?id=351191
|
||||
|
||||
--- gio/kqueue/gkqueuefilemonitor.c.orig 2018-01-15 21:00:32.535064000 +0100
|
||||
+++ gio/kqueue/gkqueuefilemonitor.c 2018-01-15 21:07:20.920334000 +0100
|
||||
@@ -29,6 +29,15 @@
|
||||
#include <gio/gfile.h>
|
||||
#include <gio/giomodule.h>
|
||||
|
||||
+/*
|
||||
+ * Because ``kqueue_sub'' are not refcounted, we need
|
||||
+ * ensure no other thread is getting a reference to
|
||||
+ * the element we want to free.
|
||||
+ *
|
||||
+ * That's why _kh_cancel_sub() must be called with
|
||||
+ * this lock held to prevent a race.
|
||||
+ */
|
||||
+G_LOCK_EXTERN (hash_lock);
|
||||
|
||||
struct _GKqueueFileMonitor
|
||||
{
|
||||
@@ -80,9 +89,11 @@ g_kqueue_file_monitor_finalize (GObject *object)
|
||||
|
||||
if (kqueue_monitor->sub)
|
||||
{
|
||||
+ G_LOCK (hash_lock);
|
||||
_kh_cancel_sub (kqueue_monitor->sub);
|
||||
_kh_sub_free (kqueue_monitor->sub);
|
||||
kqueue_monitor->sub = NULL;
|
||||
+ G_UNLOCK (hash_lock);
|
||||
}
|
||||
|
||||
if (kqueue_monitor->fallback)
|
||||
@@ -181,9 +192,11 @@ g_kqueue_file_monitor_cancel (GFileMonitor *monitor)
|
||||
|
||||
if (kqueue_monitor->sub)
|
||||
{
|
||||
+ G_LOCK (hash_lock);
|
||||
_kh_cancel_sub (kqueue_monitor->sub);
|
||||
_kh_sub_free (kqueue_monitor->sub);
|
||||
kqueue_monitor->sub = NULL;
|
||||
+ G_UNLOCK (hash_lock);
|
||||
}
|
||||
else if (kqueue_monitor->fallback)
|
||||
{
|
81
devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
Normal file
81
devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
Normal file
|
@ -0,0 +1,81 @@
|
|||
This bug combines serveral patches:
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=778515
|
||||
and
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=739424
|
||||
https://bug739424.bugzilla-attachments.gnome.org/attachment.cgi?id=351191
|
||||
|
||||
--- gio/kqueue/kqueue-helper.c.orig 2018-01-15 21:22:08.234860000 +0100
|
||||
+++ gio/kqueue/kqueue-helper.c 2018-01-15 21:21:54.143656000 +0100
|
||||
@@ -43,7 +43,7 @@ static gboolean kh_debug_enabled = FALSE;
|
||||
#define KH_W if (kh_debug_enabled) g_warning
|
||||
|
||||
static GHashTable *subs_hash_table = NULL;
|
||||
-G_LOCK_DEFINE_STATIC (hash_lock);
|
||||
+G_LOCK_DEFINE (hash_lock);
|
||||
|
||||
static int kqueue_descriptor = -1;
|
||||
static int kqueue_socket_pair[] = {-1, -1};
|
||||
@@ -291,10 +291,10 @@ process_kqueue_notifications (GIOChannel *gioc,
|
||||
|
||||
G_LOCK (hash_lock);
|
||||
sub = (kqueue_sub *) g_hash_table_lookup (subs_hash_table, GINT_TO_POINTER (n.fd));
|
||||
- G_UNLOCK (hash_lock);
|
||||
|
||||
if (sub == NULL)
|
||||
{
|
||||
+ G_UNLOCK (hash_lock);
|
||||
KH_W ("Got a notification for a deleted or non-existing subscription %d",
|
||||
n.fd);
|
||||
return TRUE;
|
||||
@@ -336,6 +336,7 @@ process_kqueue_notifications (GIOChannel *gioc,
|
||||
g_file_monitor_source_handle_event (source, mask, NULL, NULL, NULL, g_get_monotonic_time ());
|
||||
}
|
||||
|
||||
+ G_UNLOCK (hash_lock);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -451,13 +452,14 @@ _kh_start_watching (kqueue_sub *sub)
|
||||
|
||||
G_LOCK (hash_lock);
|
||||
g_hash_table_insert (subs_hash_table, GINT_TO_POINTER (sub->fd), sub);
|
||||
- G_UNLOCK (hash_lock);
|
||||
|
||||
_kqueue_thread_push_fd (sub->fd);
|
||||
|
||||
/* Bump the kqueue thread. It will pick up a new sub entry to monitor */
|
||||
if (!_ku_write (kqueue_socket_pair[0], "A", 1))
|
||||
KH_W ("Failed to bump the kqueue thread (add fd, error %d)", errno);
|
||||
+ G_UNLOCK (hash_lock);
|
||||
+
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -498,22 +500,15 @@ _kh_add_sub (kqueue_sub *sub)
|
||||
gboolean
|
||||
_kh_cancel_sub (kqueue_sub *sub)
|
||||
{
|
||||
- gboolean missing = FALSE;
|
||||
+ gboolean removed = FALSE;
|
||||
g_assert (kqueue_socket_pair[0] != -1);
|
||||
g_assert (sub != NULL);
|
||||
|
||||
- G_LOCK (hash_lock);
|
||||
- missing = !g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
|
||||
- G_UNLOCK (hash_lock);
|
||||
+ _km_remove (sub);
|
||||
|
||||
- if (missing)
|
||||
- {
|
||||
- /* If there were no fd for this subscription, file is still
|
||||
- * missing. */
|
||||
- KH_W ("Removing subscription from missing");
|
||||
- _km_remove (sub);
|
||||
- }
|
||||
- else
|
||||
+ removed = g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd));
|
||||
+
|
||||
+ if (removed)
|
||||
{
|
||||
/* fd will be closed in the kqueue thread */
|
||||
_kqueue_thread_remove_fd (sub->fd);
|
Loading…
Add table
Reference in a new issue