[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