diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/glib2/PKGBUILD | 20 | ||||
-rw-r--r-- | core/glib2/gvariant-fix-annotation.patch | 25 | ||||
-rw-r--r-- | core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch | 132 |
3 files changed, 173 insertions, 4 deletions
diff --git a/core/glib2/PKGBUILD b/core/glib2/PKGBUILD index d277d9892..50260971f 100644 --- a/core/glib2/PKGBUILD +++ b/core/glib2/PKGBUILD @@ -1,21 +1,33 @@ -# $Id: PKGBUILD 183313 2013-04-21 22:06:25Z heftig $ +# $Id: PKGBUILD 183737 2013-04-27 14:20:45Z jgc $ # Maintainer: Jan de Groot <jgc@archlinux.org> pkgbase=glib2 pkgname=(glib2 glib2-docs) pkgver=2.36.1 -pkgrel=1 +pkgrel=3 pkgdesc="Common C routines used by GTK+ and other libs" url="http://www.gtk.org/" arch=(i686 x86_64) makedepends=('pkg-config' 'python2' 'libxslt' 'docbook-xml' 'pcre' 'libffi' 'elfutils') source=(http://ftp.gnome.org/pub/GNOME/sources/glib/${pkgver%.*}/glib-$pkgver.tar.xz - revert-warn-glib-compile-schemas.patch) + revert-warn-glib-compile-schemas.patch + gvariant-fix-annotation.patch + partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch) sha256sums=('7de37586794e92c024feebe5d306bf5f245fef4803c3666af1ae8dac6ee10b24' - '049240975cd2f1c88fbe7deb28af14d4ec7d2640495f7ca8980d873bb710cc97') + '049240975cd2f1c88fbe7deb28af14d4ec7d2640495f7ca8980d873bb710cc97' + 'ebbb0581322b1fc546f93f9d77f39f37584004086d2f6f2637a8bb7894e36b2b' + '5928ac4fd114cda846fe38a3b8bedc5b038dbf9e47f76029af7d75e5dc8ae5be') build() { cd glib-$pkgver + + # fix FS#34630 https://bugs.archlinux.org/task/34630 + export CFLAGS+=" -Wall" + + # Upstream fixes from 2.36 branch + patch -Np1 -i ../gvariant-fix-annotation.patch + patch -Np1 -i ../partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch + patch -Rp1 -i ../revert-warn-glib-compile-schemas.patch PYTHON=/usr/bin/python2 ./configure --prefix=/usr --libdir=/usr/lib \ --sysconfdir=/etc \ diff --git a/core/glib2/gvariant-fix-annotation.patch b/core/glib2/gvariant-fix-annotation.patch new file mode 100644 index 000000000..ee10312c8 --- /dev/null +++ b/core/glib2/gvariant-fix-annotation.patch @@ -0,0 +1,25 @@ +From 7304bbd5d8ad56dcf3ee9fadf74f6104c49d4df7 Mon Sep 17 00:00:00 2001 +From: Giovanni Campagna <gcampagna@src.gnome.org> +Date: Fri, 12 Apr 2013 15:25:15 +0000 +Subject: GVariant: fix transfer annotation + +g_variant_new_from_bytes() returns a floating reference, so it +must be annotated (transfer none) + +https://bugzilla.gnome.org/show_bug.cgi?id=697887 +--- +diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c +index b96bc90..f823e01 100644 +--- a/glib/gvariant-core.c ++++ b/glib/gvariant-core.c +@@ -498,7 +498,7 @@ g_variant_alloc (const GVariantType *type, + * + * A reference is taken on @bytes. + * +- * Returns: a new #GVariant with a floating reference ++ * Returns: (transfer none): a new #GVariant with a floating reference + * + * Since: 2.36 + */ +-- +cgit v0.9.1 diff --git a/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch b/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch new file mode 100644 index 000000000..f623c1b21 --- /dev/null +++ b/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch @@ -0,0 +1,132 @@ +From f3b1054b0ebb4912f700e08da0c3d35c30113e79 Mon Sep 17 00:00:00 2001 +From: Ryan Lortie <desrt@desrt.ca> +Date: Tue, 23 Apr 2013 17:26:48 +0000 +Subject: Partially revert "Merge waitpid() from g_spawn_sync into gmain()" + +This partially reverts commit ce0022933c255313e010b27f977f4ae02aad1e7e. + +It used to be safe to use g_spawn_sync() from processes that had their +own SIGCHLD handler because it simply called wait(). When it was +changed to depend on the GLib child watching infrastructure this meant +that GLib had to own the SIGCHLD handler. + +This caused hangs in at least Pidgin. + +The patch contained two other improvements to the child watch code which +we want to keep, so only revert the changes to gspawn itself. + +https://bugzilla.gnome.org/show_bug.cgi?id=698081 +--- +diff --git a/glib/gspawn.c b/glib/gspawn.c +index 381ed5c..01cedf6 100644 +--- a/glib/gspawn.c ++++ b/glib/gspawn.c +@@ -47,7 +47,6 @@ + + #include "genviron.h" + #include "gmem.h" +-#include "gmain.h" + #include "gshell.h" + #include "gstring.h" + #include "gstrfuncs.h" +@@ -207,21 +206,6 @@ read_data (GString *str, + } + } + +-typedef struct { +- GMainLoop *loop; +- gint *status_p; +-} SyncWaitpidData; +- +-static void +-on_sync_waitpid (GPid pid, +- gint status, +- gpointer user_data) +-{ +- SyncWaitpidData *data = user_data; +- *(data->status_p) = status; +- g_main_loop_quit (data->loop); +-} +- + /** + * g_spawn_sync: + * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's +@@ -277,7 +261,6 @@ g_spawn_sync (const gchar *working_directory, + GString *errstr = NULL; + gboolean failed; + gint status; +- SyncWaitpidData waitpid_data; + + g_return_val_if_fail (argv != NULL, FALSE); + g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); +@@ -410,32 +393,45 @@ g_spawn_sync (const gchar *working_directory, + close_and_invalidate (&outpipe); + if (errpipe >= 0) + close_and_invalidate (&errpipe); +- +- /* Now create a temporary main context and loop, with just one +- * waitpid source. We used to invoke waitpid() directly here, but +- * this way we unify with the worker thread in gmain.c. ++ ++ /* Wait for child to exit, even if we have ++ * an error pending. + */ +- { +- GMainContext *context; +- GMainLoop *loop; +- GSource *source; +- +- context = g_main_context_new (); +- loop = g_main_loop_new (context, TRUE); ++ again: ++ ++ ret = waitpid (pid, &status, 0); + +- waitpid_data.loop = loop; +- waitpid_data.status_p = &status; +- +- source = g_child_watch_source_new (pid); +- g_source_set_callback (source, (GSourceFunc)on_sync_waitpid, &waitpid_data, NULL); +- g_source_attach (source, context); +- g_source_unref (source); +- +- g_main_loop_run (loop); ++ if (ret < 0) ++ { ++ if (errno == EINTR) ++ goto again; ++ else if (errno == ECHILD) ++ { ++ if (exit_status) ++ { ++ g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_spawn_sync either directly or indirectly."); ++ } ++ else ++ { ++ /* We don't need the exit status. */ ++ } ++ } ++ else ++ { ++ if (!failed) /* avoid error pileups */ ++ { ++ int errsv = errno; + +- g_main_context_unref (context); +- g_main_loop_unref (loop); +- } ++ failed = TRUE; ++ ++ g_set_error (error, ++ G_SPAWN_ERROR, ++ G_SPAWN_ERROR_READ, ++ _("Unexpected error in waitpid() (%s)"), ++ g_strerror (errsv)); ++ } ++ } ++ } + + if (failed) + { +-- +cgit v0.9.1 |