[libreoffice] Resolves: rhbz#908674 crash on start

sbergmann sbergmann at fedoraproject.org
Fri Feb 15 11:45:41 UTC 2013


commit 8cccc3ed75db8e0e9707b22cbdff1eb0d1cf4da4
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Feb 15 12:43:02 2013 +0100

    Resolves: rhbz#908674 crash on start

 ...674-Adapt-rtl-Allocator-construct-to-C-11.patch |  164 ++++++++++++++++++++
 libreoffice.spec                                   |    5 +-
 2 files changed, 168 insertions(+), 1 deletions(-)
---
diff --git a/0001-rhbz-908674-Adapt-rtl-Allocator-construct-to-C-11.patch b/0001-rhbz-908674-Adapt-rtl-Allocator-construct-to-C-11.patch
new file mode 100644
index 0000000..105d715
--- /dev/null
+++ b/0001-rhbz-908674-Adapt-rtl-Allocator-construct-to-C-11.patch
@@ -0,0 +1,164 @@
+From d5e77fcf7f525e6de83495876e2a1aa1fb133d96 Mon Sep 17 00:00:00 2001
+From: Stephan Bergmann <sbergman at redhat.com>
+Date: Thu, 14 Feb 2013 15:21:46 +0100
+Subject: [PATCH] rhbz#908674: Adapt rtl::Allocator::construct to C++11
+
+...otherwise, at least with some --with-system-boost versions and C++11
+compilers, like with Fedora's boost-1.50.0-4.fc18.x86_64 and
+gcc-c++-4.7.2-8.fc18.x86_64, using this to copy-construct an instance of
+boost::unordered::detail::ptr_node<std::pair<rtl::OUString,Bootstrap_Impl*>> in
+the call to p_bootstrap_map->insert(...) in rtl_bootstrap_args_open
+(sal/rtl/source/bootstrap.cxx) would memcopy the ptr_node and fail to call
+rtl_uString_acquire, leading to memory corruption later on when
+rtl_uString_release is called one time too often.
+
+It is not entirely clear to me whether this is a shortcoming of the given Boost
+version, but this patch solves the problem and brings rtl::Allocator::construct
+in line with the (changed) Allocator requirements of C++11 anyway.
+
+The problem potentially lurks with every use of rtl::Allocator, but only showed
+now begining with LO 4.0 where e5111574fd904b38a3980ca4ea3d21cfcb22dea6 "Revert
+'sb140: sb140: #i116981# clean up memory upon exit'" re-introduced code into
+rtl_bootstrap_args_open that inserts into a boost::unordered_map that uses
+rtl::Allocator.
+
+(cherry picked from commit c91d353872b7d4e1a39192bff1444b46cab6e5eb)
+Conflicts:
+	config_host/config_global.h.in
+...solved by resorting to the old -DHAVE_CXX11_PERFECT_FORWARDING logic spread
+across various solenv/.../*.mk instead.
+
+Change-Id: I3be22f59a8eb49d31458480c27f3ce15803c7fd4
+---
+ config_host.mk.in                      |  1 +
+ configure.ac                           | 26 ++++++++++++++++++++++++++
+ sal/inc/rtl/allocator.hxx              |  8 ++++++++
+ solenv/gbuild/platform/com_GCC_defs.mk |  6 ++++++
+ solenv/gbuild/platform/com_MSC_defs.mk |  6 ++++++
+ solenv/inc/settings.mk                 |  4 ++++
+ 6 files changed, 51 insertions(+)
+
+diff --git a/config_host.mk.in b/config_host.mk.in
+index 73aecf8..0af569c 100644
+--- a/config_host.mk.in
++++ b/config_host.mk.in
+@@ -217,6 +217,7 @@ export GUIBASE_FOR_BUILD=@GUIBASE_FOR_BUILD@
+ export GUI_FOR_BUILD=@GUI_FOR_BUILD@
+ export HARDLINKDELIVER=@HARDLINKDELIVER@
+ export HAVE_CXX0X=@HAVE_CXX0X@
++export HAVE_CXX11_PERFECT_FORWARDING=@HAVE_CXX11_PERFECT_FORWARDING@
+ export HAVE_GCC_AVX=@HAVE_GCC_AVX@
+ export HAVE_GCC_BUILTIN_ATOMIC=@HAVE_GCC_BUILTIN_ATOMIC@
+ export HAVE_GCC_GGDB2=@HAVE_GCC_GGDB2@
+diff --git a/configure.ac b/configure.ac
+index ce85229..703bb13 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -5464,6 +5464,32 @@ AC_SUBST(HAVE_GCC_AVX)
+ AC_SUBST(HAVE_GCC_BUILTIN_ATOMIC)
+ 
+ dnl ===================================================================
++dnl Check for C++11 perfect forwarding support
++dnl ===================================================================
++HAVE_CXX11_PERFECT_FORWARDING=
++AC_MSG_CHECKING([whether $CXX supports C++11 perfect forwarding])
++save_CXXFLAGS=$CXXFLAGS
++if test "$HAVE_CXX0X" = TRUE; then
++    CXXFLAGS="$CXXFLAGS -std=gnu++0x"
++fi
++AC_LANG_PUSH([C++])
++AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
++        #include <utility>
++        template<typename T, typename... Args> T * f(Args &&... v) {
++            return new T(std::forward<Args>(v)...);
++        }
++    ]], [[
++        f<int>(0);
++    ]])], [perfect_forwarding=yes], [perfect_forwarding=no])
++AC_LANG_POP([C++])
++CXXFLAGS=$save_CXXFLAGS
++AC_MSG_RESULT([$perfect_forwarding])
++if test "$perfect_forwarding" = yes; then
++    HAVE_CXX11_PERFECT_FORWARDING=TRUE
++fi
++AC_SUBST([HAVE_CXX11_PERFECT_FORWARDING])
++
++dnl ===================================================================
+ dnl system stl sanity tests
+ dnl ===================================================================
+ HAVE_GCC_VISIBILITY_BROKEN=
+diff --git a/sal/inc/rtl/allocator.hxx b/sal/inc/rtl/allocator.hxx
+index 4900d97..979c743 100644
+--- a/sal/inc/rtl/allocator.hxx
++++ b/sal/inc/rtl/allocator.hxx
+@@ -125,10 +125,18 @@ public:
+     }
+ 
+     //-----------------------------------------
++#if defined HAVE_CXX11_PERFECT_FORWARDING
++    template< typename... Args >
++    void construct (pointer p, Args &&... value)
++    {
++        new ((void*)p)T(std::forward< Args >(value)...);
++    }
++#else
+     void construct (pointer p, const T& value)
+     {
+         new ((void*)p)T(value);
+     }
++#endif
+ 
+     //-----------------------------------------
+     void destroy (pointer p)
+diff --git a/solenv/gbuild/platform/com_GCC_defs.mk b/solenv/gbuild/platform/com_GCC_defs.mk
+index 437cdd3..1f50a97 100644
+--- a/solenv/gbuild/platform/com_GCC_defs.mk
++++ b/solenv/gbuild/platform/com_GCC_defs.mk
+@@ -58,6 +58,12 @@ gb_COMPILERDEFS := \
+ 	-D$(COM) \
+ 	-DCPPU_ENV=$(gb_CPPU_ENV) \
+ 
++ifeq ($(HAVE_CXX11_PERFECT_FORWARDING),TRUE)
++gb_COMPILERDEFS += \
++    -DHAVE_CXX11_PERFECT_FORWARDING \
++
++endif
++
+ ifeq ($(HAVE_GCC_BUILTIN_ATOMIC),TRUE)
+ gb_COMPILERDEFS += \
+     -DHAVE_GCC_BUILTIN_ATOMIC \
+diff --git a/solenv/gbuild/platform/com_MSC_defs.mk b/solenv/gbuild/platform/com_MSC_defs.mk
+index a81b5df..626274b 100644
+--- a/solenv/gbuild/platform/com_MSC_defs.mk
++++ b/solenv/gbuild/platform/com_MSC_defs.mk
+@@ -60,6 +60,12 @@ gb_COMPILERDEFS := \
+ 	-DCPPU_ENV=$(gb_CPPU_ENV) \
+ 	-DM1500 \
+ 
++ifeq ($(HAVE_CXX11_PERFECT_FORWARDING),TRUE)
++gb_COMPILERDEFS += \
++    -DHAVE_CXX11_PERFECT_FORWARDING \
++
++endif
++
+ gb_RCDEFS := \
+ 	 -DWINVER=0x0400 \
+ 	 -DWIN32 \
+diff --git a/solenv/inc/settings.mk b/solenv/inc/settings.mk
+index dbb513d..c1b6a78 100644
+--- a/solenv/inc/settings.mk
++++ b/solenv/inc/settings.mk
+@@ -813,6 +813,10 @@ CDEFS+=$(CDEFS_PRESET)
+ CDEFS+=-DTIMELOG
+ .ENDIF
+ 
++.IF "$(HAVE_CXX11_PERFECT_FORWARDING)" == "TRUE"
++CDEFS += -DHAVE_CXX11_PERFECT_FORWARDING
++.ENDIF
++
+ CDEFSCXX=
+ CDEFSOBJ=
+ #CDEFSMT=-DMULTITHREAD
+-- 
+1.8.1.2
+
diff --git a/libreoffice.spec b/libreoffice.spec
index e95e4e2..917e23c 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -238,6 +238,7 @@ Patch11: libreoffice-rhel6langs.patch
 Patch12: 0001-temporarily-disable-failing-test.patch
 Patch13: 0001-rhbz-760765-copy-custom-styles-on-copy-paste.patch
 Patch14: 0001-fix-parser-errors-in-help-translations.patch
+Patch15: 0001-rhbz-908674-Adapt-rtl-Allocator-construct-to-C-11.patch
 
 %define instdir %{_libdir}
 %define baseinstdir %{instdir}/libreoffice
@@ -972,6 +973,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc
 %patch12 -p1 -b .temporarily-disable-failing-test.patch
 %patch13 -p1 -b .rhbz-760765-copy-custom-styles-on-copy-paste.patch
 %patch14 -p1 -b .fix-parser-errors-in-help-translations.patch
+%patch15 -p1 -b .rhbz-908674-Adapt-rtl-Allocator-construct-to-C-11.patch
 
 # TODO: check this
 # these are horribly incomplete--empty translations and copied english
@@ -2035,8 +2037,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
 %endif
 
 %changelog
-* Wed Feb 06 2013 David Tardon <dtardon at redhat.com> - 1:4.0.0.3-4.UNBUILT
+* Wed Feb 06 2013 David Tardon <dtardon at redhat.com> - 1:4.0.0.3-4
 - Resolves: fdo#60491 missing libemboleobj.so
+- Resolves: rhbz#908674 crash on start
 
 * Sat Feb 09 2013 Denis Arnaud <denis.arnaud_fedora at m4x.org> - 1:4.0.0.3-3
 - Rebuild for Boost-1.53.0


More information about the scm-commits mailing list