[libguestfs] Add upstream patch to fix segfault in OCaml bindings.

Richard W.M. Jones rjones at fedoraproject.org
Tue Jul 26 18:05:56 UTC 2011


commit aa3b139e751349542d190607ea707897ede1f1a6
Author: Richard W.M. Jones <rjones at redhat.com>
Date:   Tue Jul 26 19:05:40 2011 +0100

    Add upstream patch to fix segfault in OCaml bindings.

 0001-ocaml-Fix-locking-in-event-callbacks.patch |   79 +++++++++++++++++++++++
 libguestfs.spec                                 |    9 ++-
 2 files changed, 86 insertions(+), 2 deletions(-)
---
diff --git a/0001-ocaml-Fix-locking-in-event-callbacks.patch b/0001-ocaml-Fix-locking-in-event-callbacks.patch
new file mode 100644
index 0000000..4ae9311
--- /dev/null
+++ b/0001-ocaml-Fix-locking-in-event-callbacks.patch
@@ -0,0 +1,79 @@
+From 2b8b3f9794ceb43eabd3083e225c669896d8b186 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Tue, 26 Jul 2011 18:57:19 +0100
+Subject: [PATCH] ocaml: Fix locking in event callbacks.
+
+We weren't acquiring the GC lock around some allocations, resulting in
+segfaults when an event callback ran at the same time as a main thread
+allocation or garbage collection.
+
+In particular this fixes a noticable crash in guestfs-browser.
+---
+ ocaml/guestfs_c.c |   36 +++++++++++++++++++++++++++---------
+ 1 files changed, 27 insertions(+), 9 deletions(-)
+
+diff --git a/ocaml/guestfs_c.c b/ocaml/guestfs_c.c
+index 3f862ea..96e8a35 100644
+--- a/ocaml/guestfs_c.c
++++ b/ocaml/guestfs_c.c
+@@ -327,13 +327,13 @@ event_bitmask_to_event (uint64_t event)
+ }
+ 
+ static void
+-event_callback_wrapper (guestfs_h *g,
+-                        void *data,
+-                        uint64_t event,
+-                        int event_handle,
+-                        int flags,
+-                        const char *buf, size_t buf_len,
+-                        const uint64_t *array, size_t array_len)
++event_callback_wrapper_locked (guestfs_h *g,
++                               void *data,
++                               uint64_t event,
++                               int event_handle,
++                               int flags,
++                               const char *buf, size_t buf_len,
++                               const uint64_t *array, size_t array_len)
+ {
+   CAMLparam0 ();
+   CAMLlocal5 (gv, evv, ehv, bufv, arrayv);
+@@ -360,9 +360,7 @@ event_callback_wrapper (guestfs_h *g,
+ 
+   value args[5] = { gv, evv, ehv, bufv, arrayv };
+ 
+-  caml_leave_blocking_section ();
+   rv = caml_callbackN_exn (*(value*)data, 5, args);
+-  caml_enter_blocking_section ();
+ 
+   /* Callbacks shouldn't throw exceptions.  There's not much we can do
+    * except to print it.
+@@ -375,6 +373,26 @@ event_callback_wrapper (guestfs_h *g,
+   CAMLreturn0;
+ }
+ 
++static void
++event_callback_wrapper (guestfs_h *g,
++                        void *data,
++                        uint64_t event,
++                        int event_handle,
++                        int flags,
++                        const char *buf, size_t buf_len,
++                        const uint64_t *array, size_t array_len)
++{
++  /* Ensure we are holding the GC lock before any GC operations are
++   * possible. (RHBZ#725824)
++   */
++  caml_leave_blocking_section ();
++
++  event_callback_wrapper_locked (g, data, event, event_handle, flags,
++                                 buf, buf_len, array, array_len);
++
++  caml_enter_blocking_section ();
++}
++
+ value
+ ocaml_guestfs_last_errno (value gv)
+ {
+-- 
+1.7.5.2
+
diff --git a/libguestfs.spec b/libguestfs.spec
index 3eb8917..cf512ba 100644
--- a/libguestfs.spec
+++ b/libguestfs.spec
@@ -30,7 +30,7 @@ Summary:       Access and modify virtual machine disk images
 Name:          libguestfs
 Epoch:         1
 Version:       1.12.1
-Release:       3%{?dist}
+Release:       4%{?dist}
 License:       LGPLv2+
 Group:         Development/Libraries
 URL:           http://libguestfs.org/
@@ -48,6 +48,9 @@ Patch2:        libguestfs-1.12.0-configure-force-machine-accel-tcg.patch
 # option so that this patch would not be needed.
 Patch3:        0001-Fix-qemu-machine-option-for-latest-qemu-thanks-Marku.patch
 
+# Upstream patch to fix segfault in OCaml bindings.
+Patch4:        0001-ocaml-Fix-locking-in-event-callbacks.patch
+
 # Basic build requirements:
 BuildRequires: /usr/bin/pod2man
 BuildRequires: /usr/bin/pod2text
@@ -501,6 +504,7 @@ for %{name}.
 %patch0 -p1
 %patch2 -p1
 %patch3 -p1
+%patch4 -p1
 
 mkdir -p daemon/m4
 
@@ -866,10 +870,11 @@ rm -rf $RPM_BUILD_ROOT
 
 
 %changelog
-* Tue Jul 26 2011 Richard W.M. Jones <rjones at redhat.com> - 1:1.12.1-3
+* Tue Jul 26 2011 Richard W.M. Jones <rjones at redhat.com> - 1:1.12.1-4
 - New upstream stable branch version 1.12.1.
 - Remove 5 x upstream patches.
 - Add non-upstream patch to deal with broken qemu -machine option.
+- Add upstream patch to fix segfault in OCaml bindings.
 
 * Tue Jul 26 2011 Richard W.M. Jones <rjones at redhat.com> - 1:1.12.0-11
 - Bump and rebuild.


More information about the scm-commits mailing list