diff options
author | Koop Mast <kwm@FreeBSD.org> | 2018-01-26 21:26:57 +0000 |
---|---|---|
committer | Koop Mast <kwm@FreeBSD.org> | 2018-01-26 21:26:57 +0000 |
commit | cb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61 (patch) | |
tree | 4c1062036c0d4e53d4d7816d73faebd87824d46b | |
parent | 9f4546a03cc0fe28290a2a9c23229fa3755bee49 (diff) | |
download | ports-cb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61.tar.gz ports-cb48ab9bf7e8cfa0c6979755e0df8e7adab4cb61.zip |
Notes
-rw-r--r-- | devel/glib20/Makefile | 5 | ||||
-rw-r--r-- | devel/glib20/distinfo | 6 | ||||
-rw-r--r-- | devel/glib20/files/patch-bug739424 | 59 | ||||
-rw-r--r-- | devel/glib20/files/patch-bug778515 | 55 | ||||
-rw-r--r-- | devel/glib20/files/patch-gio_kqueue_gkqueuefilemonitor.c | 45 | ||||
-rw-r--r-- | devel/glib20/files/patch-gio_kqueue_kqueue-helper.c | 81 |
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); |