aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKoop Mast <kwm@FreeBSD.org>2018-01-26 21:26:57 +0000
committerKoop Mast <kwm@FreeBSD.org>2018-01-26 21:26:57 +0000
commitcb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61 (patch)
tree4c1062036c0d4e53d4d7816d73faebd87824d46b
parent9f4546a03cc0fe28290a2a9c23229fa3755bee49 (diff)
downloadports-cb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61.tar.gz
ports-cb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61.zip
Notes
-rw-r--r--devel/glib20/Makefile5
-rw-r--r--devel/glib20/distinfo6
-rw-r--r--devel/glib20/files/patch-bug73942459
-rw-r--r--devel/glib20/files/patch-bug77851555
-rw-r--r--devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c45
-rw-r--r--devel/glib20/files/patch-gio_kqueue_kqueue-helper.c81
6 files changed, 131 insertions, 120 deletions
diff --git a/devel/glib20/Makefile b/devel/glib20/Makefile
index 8e91ca53f497..ac114efc8a19 100644
--- a/devel/glib20/Makefile
+++ b/devel/glib20/Makefile
@@ -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
diff --git a/devel/glib20/distinfo b/devel/glib20/distinfo
index 297d802897e7..2a2432db2305 100644
--- a/devel/glib20/distinfo
+++ b/devel/glib20/distinfo
@@ -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
diff --git a/devel/glib20/files/patch-bug739424 b/devel/glib20/files/patch-bug739424
deleted file mode 100644
index c5b8d82925b1..000000000000
--- a/devel/glib20/files/patch-bug739424
+++ /dev/null
@@ -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
-
diff --git a/devel/glib20/files/patch-bug778515 b/devel/glib20/files/patch-bug778515
deleted file mode 100644
index 3224f8836c48..000000000000
--- a/devel/glib20/files/patch-bug778515
+++ /dev/null
@@ -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
-
diff --git a/devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c b/devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c
new file mode 100644
index 000000000000..7d6cf68eaf88
--- /dev/null
+++ b/devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c
@@ -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)
+ {
diff --git a/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c b/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
new file mode 100644
index 000000000000..bc1493820930
--- /dev/null
+++ b/devel/glib20/files/patch-gio_kqueue_kqueue-helper.c
@@ -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);