Date: Fri, 20 Oct 2006 15:28:43 +0200 From: "Marcin Wisnicki" <mwisnicki+freebsd@gmail.com> To: "FreeBSD gnats submit" <FreeBSD-gnats-submit@FreeBSD.org> Subject: ports/104617: [PATCH] gnome-settings-deamon crashes on startup because of a bug in gstreamer Message-ID: <1161350923.16340@ghost.pnet.one.pl> Resent-Message-ID: <200610201330.k9KDUJ4X036157@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 104617 >Category: ports >Synopsis: [PATCH] gnome-settings-deamon crashes on startup because of a bug in gstreamer >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Oct 20 13:30:18 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Marcin Wisnicki >Release: FreeBSD 6.2-PRERELEASE i386 >Organization: >Environment: System: FreeBSD 6.2-PRERELEASE #3: Wed Sep 27 01:35:57 CEST 2006 root@ghost.pnet.one.pl:/home/obj/usr/src/sys/SERWER gnome-control-center-2.16.1 gnome2-2.16.1_2 gstreamer-0.10.10 >Description: gnome-settings daemon fails to start because of the bug in gstreamer. This bug was fixed in cvs, attached patch was extracted from Ubuntu, please put it in multimedia/gstreamer/files and bump portrevision of that port. With that patch I can successfully start gnome. More details details in ubuntu bug report: https://launchpad.net/distros/ubuntu/+source/control-center/+bug/59217 and in gnome bugzilla: http://bugzilla.gnome.org/show_bug.cgi?id=355499 >How-To-Repeat: login or start /usr/local/libexec/gnome-settings-daemon >Fix: --- patch-01_fix_gst_init_race_issue begins here --- 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); } } --- patch-01_fix_gst_init_race_issue ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1161350923.16340>