From 96833621879eadc385c37f6d47a3d52c2082a8ef Mon Sep 17 00:00:00 2001
From: mezz <mezz@FreeBSD.org>
Date: Sat, 21 Oct 2006 21:58:22 +0000
Subject: Fix the ensure_current_registry_forking() fails if zombie already
 killed by signal handler. Patch was took from Ubuntu. Bump the PORTREVISION.

	https://launchpad.net/distros/ubuntu/+source/control-center/+bug/59217
	http://bugzilla.gnome.org/show_bug.cgi?id=355499

PR:		ports/104617
Submitted by:	Marcin Wisnicki <mwisnicki+freebsd@gmail.com>
Approved by:	portmgr (marcus)
---
 multimedia/gstreamer/Makefile                      |  2 +
 .../files/patch-01_fix_gst_init_race_issue         | 97 ++++++++++++++++++++++
 2 files changed, 99 insertions(+)
 create mode 100644 multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue

(limited to 'multimedia/gstreamer')

diff --git a/multimedia/gstreamer/Makefile b/multimedia/gstreamer/Makefile
index 0ced9734ba4..7e6b20781d1 100644
--- a/multimedia/gstreamer/Makefile
+++ b/multimedia/gstreamer/Makefile
@@ -4,9 +4,11 @@
 #
 # $FreeBSD$
 #    $MCom: ports/multimedia/gstreamer/Makefile,v 1.52 2006/09/14 20:51:42 ahze Exp $
+#
 
 PORTNAME=	gstreamer
 PORTVERSION=	0.10.10
+PORTREVISION=	1
 CATEGORIES=	multimedia
 MASTER_SITES=	http://gstreamer.freedesktop.org/src/gstreamer/ \
 		${MASTER_SITE_LOCAL}
diff --git a/multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue b/multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue
new file mode 100644
index 00000000000..b3533c909a3
--- /dev/null
+++ b/multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue
@@ -0,0 +1,97 @@
+diff -Nur gst/gst.c gst/gst.c
+--- gst/gst.c	2006-09-14 16:02:23.000000000 +0200
++++ gst/gst.c	2006-10-05 21:46:11.000000000 +0200
+@@ -683,10 +683,16 @@
+ {
+ #ifdef HAVE_FORK
+   pid_t pid;
++  int pfd[2];
+ 
+   /* We fork here, and let the child read and possibly rebuild the registry.
+    * After that, the parent will re-read the freshly generated registry. */
+   GST_DEBUG ("forking");
++
++  if (pipe (pfd) == -1) {
++    return FALSE;
++  }
++
+   pid = fork ();
+   if (pid == -1) {
+     GST_ERROR ("Failed to fork()");
+@@ -695,8 +701,11 @@
+ 
+   if (pid == 0) {
+     gboolean res;
++    gchar res_byte;
+ 
+-    /* this is the child */
++    /* this is the child. Close the read pipe */
++    close (pfd[0]);
++    
+     GST_DEBUG ("child reading registry cache");
+     res = scan_and_update_registry (default_registry, registry_file, TRUE);
+     _gst_registry_remove_cache_plugins (default_registry);
+@@ -708,38 +717,42 @@
+     /* make valgrind happy (yes, you can call it insane) */
+     g_free ((char *) registry_file);
+ 
+-    _exit ((res) ? EXIT_SUCCESS : EXIT_FAILURE);
++    /* write a result byte to the pipe */
++    res_byte = res ? '1' : '0';
++    write (pfd[1], &res_byte, 1);
++    _exit (0);
+   } else {
+-    /* parent */
+-    int status;
+-    pid_t ret;
++    int ret;
++    gchar res_byte;
++    
++    /* parent. Close write pipe */
++    close (pfd[1]);
++    
++    /* Wait for result from the pipe */
++    GST_DEBUG ("Waiting for data from child");
++    ret = read (pfd[0], &res_byte, 1);
+ 
+-    GST_DEBUG ("parent waiting on child");
+-    ret = waitpid (pid, &status, 0);
+-    GST_DEBUG ("parent done waiting on child");
+     if (ret == -1) {
+-      GST_ERROR ("error during waitpid: %s", g_strerror (errno));
++      close (pfd[0]);
+       return FALSE;
+     }
++    close (pfd[0]);
+ 
+-    if (!WIFEXITED (status)) {
+-      if (WIFSIGNALED (status)) {
+-        GST_ERROR ("child did not exit normally, terminated by signal %d",
+-            WTERMSIG (status));
+-      } else {
+-        GST_ERROR ("child did not exit normally, status: %d", status);
+-      }
++     /* Wait to ensure the child is reaped, but ignore the result */
++    GST_DEBUG ("parent waiting on child");
++    waitpid (pid, NULL, 0);
++    GST_DEBUG ("parent done waiting on child");
++
++    if (ret == 0) {
++      GST_ERROR ("child did not exit normally, terminated by signal");
+       return FALSE;
+     }
+ 
+-    GST_DEBUG ("child exited normally with return value %d",
+-        WEXITSTATUS (status));
+-
+-    if (WEXITSTATUS (status) == EXIT_SUCCESS) {
+-      GST_DEBUG ("parent reading registry cache");
++    if (res_byte == '1') {
++      GST_DEBUG ("Child succeeded. Parent reading registry cache");
+       gst_registry_xml_read_cache (default_registry, registry_file);
+     } else {
+-      GST_DEBUG ("parent re-scanning registry");
++      GST_DEBUG ("Child failed. Parent re-scanning registry, ignoring errors.");
+       scan_and_update_registry (default_registry, registry_file, FALSE);
+     }
+   }
-- 
cgit