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:
Koop Mast 2018-01-26 21:26:57 +00:00
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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View 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)
{

View 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);