f2b5427
From 6c096a5966abb942a6c8f8c9b665c211efa48853 Mon Sep 17 00:00:00 2001
e3debef
From: Michael Stahl <mstahl@redhat.com>
e3debef
Date: Sat, 25 Apr 2015 21:25:00 +0200
f2b5427
Subject: [PATCH] rhbz#1205072: sw: resource mangement SNAFU caused by SwPaM
f2b5427
 copy ctor
e3debef
e3debef
SwPaM copy ctor has the surprising habit of linking the new one into the
e3debef
old one's Ring.  If you copy a shell cursor, *this* epic fail happens:
e3debef
e3debef
==948== Thread 6 SelectionManager:
e3debef
==948== Invalid free() / delete / delete[] / realloc()
e3debef
==948==    at 0x4A07CE9: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
e3debef
==948==    by 0x222F542B: SwPaM::operator delete(void*, unsigned long) (in /libreoffice-4-3/instdir/program/libswlo.so)
e3debef
==948==    by 0x2239E20E: SwPaM::~SwPaM() (pam.cxx:422)
e3debef
==948==    by 0x22368630: CheckRange(SwCursor*) (crsrsh.cxx:111)
e3debef
==948==    by 0x2236DECC: SwCrsrShell::UpdateCrsr(unsigned short, bool) (crsrsh.cxx:1397)
e3debef
==948==    by 0x22369113: SwCrsrShell::EndAction(bool) (crsrsh.cxx:290)
e3debef
==948==    by 0x2268971F: SwEditShell::EndAllAction() (edws.cxx:87)
e3debef
==948==    by 0x2262BEF3: SwBaseLink::DataChanged(rtl::OUString const&, com::sun::star::uno::Any const&) (swbaslnk.cxx:274)
e3debef
==948==    by 0x2262C78E: SwBaseLink::SwapIn(bool, bool) (swbaslnk.cxx:411)
e3debef
==948==    by 0x227102EC: SwGrfNode::SwapIn(bool) (ndgrf.cxx:539)
e3debef
==948==    by 0x227121BC: SwGrfNode::MakeCopy(SwDoc*, SwNodeIndex const&) const (ndgrf.cxx:999)
e3debef
==948==    by 0x22610E4D: SwNodes::_CopyNodes(SwNodeRange const&, SwNodeIndex const&, bool, bool) const (nodes.cxx:1862)
e3debef
==948==    by 0x225B98E0: SwDoc::CopyWithFlyInFly(SwNodeRange const&, int, SwNodeIndex const&, SwPaM const*, bool, bool, bool) const (ndcopy.cxx:1336)
e3debef
==948==    by 0x224AC1FF: SwDoc::CopyLayoutFmt(SwFrmFmt const&, SwFmtAnchor const&, bool, bool) (doclay.cxx:446)
e3debef
==948==    by 0x2294D2D4: SwTxtFlyCnt::CopyFlyFmt(SwDoc*) (atrflyin.cxx:130)
e3debef
==948==    by 0x229A5B96: MakeTxtAttr(SwDoc&, SfxPoolItem&, int, int, CopyOrNew_t, SwTxtNode*) (thints.cxx:1060)
e3debef
==948==    by 0x229A64E6: SwTxtNode::InsertItem(SfxPoolItem&, int, int, unsigned short) (thints.cxx:1224)
e3debef
==948==    by 0x2298E536: SwTxtNode::CopyText(SwTxtNode*, SwIndex const&, SwIndex const&, int, bool) (ndtxt.cxx:1773)
e3debef
==948==    by 0x2298DC08: SwTxtNode::CopyText(SwTxtNode*, SwIndex const&, int, bool) (ndtxt.cxx:1555)
e3debef
==948==    by 0x225B4C9D: SwTxtNode::MakeCopy(SwDoc*, SwNodeIndex const&) const (ndcopy.cxx:286)
e3debef
==948==    by 0x22610E4D: SwNodes::_CopyNodes(SwNodeRange const&, SwNodeIndex const&, bool, bool) const (nodes.cxx:1862)
e3debef
==948==    by 0x223EF3C2: SwNodes::_Copy(SwNodeRange const&, SwNodeIndex const&, bool) const (ndarr.hxx:182)
e3debef
==948==    by 0x225B5D8D: SwTableNode::MakeCopy(SwDoc*, SwNodeIndex const&) const (ndcopy.cxx:475)
e3debef
==948==    by 0x22610ACA: SwNodes::_CopyNodes(SwNodeRange const&, SwNodeIndex const&, bool, bool) const (nodes.cxx:1790)
e3debef
==948==    by 0x223EF3C2: SwNodes::_Copy(SwNodeRange const&, SwNodeIndex const&, bool) const (ndarr.hxx:182)
e3debef
==948==    by 0x225CA663: SwSectionNode::MakeCopy(SwDoc*, SwNodeIndex const&) const (ndsect.cxx:1270)
e3debef
==948==    by 0x22610BFC: SwNodes::_CopyNodes(SwNodeRange const&, SwNodeIndex const&, bool, bool) const (nodes.cxx:1817)
e3debef
==948==    by 0x223EF3C2: SwNodes::_Copy(SwNodeRange const&, SwNodeIndex const&, bool) const (ndarr.hxx:182)
e3debef
==948==    by 0x225CA663: SwSectionNode::MakeCopy(SwDoc*, SwNodeIndex const&) const (ndsect.cxx:1270)
e3debef
==948==    by 0x22610BFC: SwNodes::_CopyNodes(SwNodeRange const&, SwNodeIndex const&, bool, bool) const (nodes.cxx:1817)
e3debef
==948==    by 0x223EF3C2: SwNodes::_Copy(SwNodeRange const&, SwNodeIndex const&, bool) const (ndarr.hxx:182)
e3debef
==948==    by 0x225CA663: SwSectionNode::MakeCopy(SwDoc*, SwNodeIndex const&) const (ndsect.cxx:1270)
e3debef
==948==    by 0x22610BFC: SwNodes::_CopyNodes(SwNodeRange const&, SwNodeIndex const&, bool, bool) const (nodes.cxx:1817)
e3debef
==948==    by 0x225B98E0: SwDoc::CopyWithFlyInFly(SwNodeRange const&, int, SwNodeIndex const&, SwPaM const*, bool, bool, bool) const (ndcopy.cxx:1336)
e3debef
==948==    by 0x225B8F15: SwDoc::CopyImpl(SwPaM&, SwPosition&, bool, bool, SwPaM*) const (ndcopy.cxx:1239)
e3debef
==948==    by 0x225B6EE0: SwDoc::CopyRange(SwPaM&, SwPosition&, bool) const (ndcopy.cxx:707)
e3debef
==948==    by 0x22667E69: SwEditShell::_CopySelToDoc(SwDoc*, SwNodeIndex*) (edglss.cxx:244)
e3debef
==948==    by 0x226C8400: SwFEShell::Copy(SwDoc*, rtl::OUString const*) (fecopy.cxx:214)
e3debef
==948==    by 0x22DBF72B: (anonymous namespace)::lclOverWriteDoc(SwWrtShell&, SwDoc&) (swdtflvr.cxx:373)
e3debef
==948==    by 0x22DBFBC6: SwTransferable::GetData(com::sun::star::datatransfer::DataFlavor const&, rtl::OUString const&) (swdtflvr.cxx:439)
e3debef
==948==    by 0x7CB36C7: TransferableHelper::getTransferData2(com::sun::star::datatransfer::DataFlavor const&, rtl::OUString const&) (transfer.cxx:332)
e3debef
==948==    by 0x7CB34B5: TransferableHelper::getTransferData(com::sun::star::datatransfer::DataFlavor const&) (transfer.cxx:306)
e3debef
==948==    by 0x17A7E949: x11::SelectionManager::convertData(com::sun::star::uno::Reference<com::sun::star::datatransfer::XTransferable> const&, unsigned long, unsigned long, int&, com::sun::star::uno::Sequence<signed char>&) (X11_selection.cxx:655)
e3debef
==948==    by 0x17A823CA: x11::SelectionManager::sendData(x11::SelectionAdaptor*, unsigned long, unsigned long, unsigned long, unsigned long) (X11_selection.cxx:1503)
e3debef
==948==    by 0x17A82E03: x11::SelectionManager::handleSelectionRequest(XSelectionRequestEvent&) (X11_selection.cxx:1729)
e3debef
==948==    by 0x17A8A08A: x11::SelectionManager::handleXEvent(_XEvent&) (X11_selection.cxx:3574)
e3debef
==948==  Address 0x21e31a60 is on thread 6's stack
e3debef
==948==  in frame #40, created by SwEditShell::_CopySelToDoc(SwDoc*, SwNodeIndex*) (edglss.cxx:158)
e3debef
e3debef
(regression from 49505336a629a75f4fb48bbe0c532b402e857ed4)
e3debef
e3debef
(cherry picked from commit c55599fd0e7198773087c6433031f7119aaaca36)
e3debef
e3debef
Conflicts:
e3debef
	sw/source/core/edit/edglss.cxx
e3debef
e3debef
Reviewed-on: https://gerrit.libreoffice.org/15533
e3debef
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
e3debef
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
e3debef
(cherry picked from commit 8f570028b0871dbaaaa99722cca76c0d1179e06c)
e3debef
e3debef
Conflicts:
e3debef
	sw/source/core/edit/edglss.cxx
e3debef
e3debef
Change-Id: I3d0a288a83b4719dda7977b4898dea656ea67388
e3debef
---
f2b5427
 sw/source/core/edit/eddel.cxx  | 6 ++++--
e3debef
 sw/source/core/edit/edglss.cxx | 5 ++++-
f2b5427
 2 files changed, 8 insertions(+), 3 deletions(-)
e3debef
e3debef
diff --git a/sw/source/core/edit/eddel.cxx b/sw/source/core/edit/eddel.cxx
f2b5427
index 7802643..88eca5f 100644
e3debef
--- a/sw/source/core/edit/eddel.cxx
e3debef
+++ b/sw/source/core/edit/eddel.cxx
f2b5427
@@ -33,6 +33,8 @@
f2b5427
 #include <comcore.hrc>
f2b5427
 #include <list>
f2b5427
 
f2b5427
+#include <boost/scoped_ptr.hpp>
f2b5427
+
f2b5427
 void SwEditShell::DeleteSel( SwPaM& rPam, bool* pUndo )
f2b5427
 {
f2b5427
     bool bSelectAll = StartsWithTable() && ExtendedSelectedAll(/*bFootnotes =*/ false);
f2b5427
@@ -89,12 +91,12 @@ void SwEditShell::DeleteSel( SwPaM& rPam, bool* pUndo )
f2b5427
     }
f2b5427
     else
f2b5427
     {
f2b5427
-        std::unique_ptr<SwPaM> pNewPam;
f2b5427
+        boost::scoped_ptr<SwPaM> pNewPam;
f2b5427
         SwPaM * pPam = &rPam;
e3debef
         if (bSelectAll)
e3debef
         {
e3debef
             assert(dynamic_cast<SwShellCrsr*>(&rPam)); // must be corrected pam
e3debef
-            pNewPam.reset(new SwPaM(rPam));
e3debef
+            pNewPam.reset(new SwPaM(*rPam.GetMark(), *rPam.GetPoint()));
e3debef
             // Selection starts at the first para of the first cell, but we
e3debef
             // want to delete the table node before the first cell as well.
e3debef
             pNewPam->Start()->nNode = pNewPam->Start()->nNode.GetNode().FindTableNode()->GetIndex();
e3debef
diff --git a/sw/source/core/edit/edglss.cxx b/sw/source/core/edit/edglss.cxx
f2b5427
index 7a17737..230fc83 100644
e3debef
--- a/sw/source/core/edit/edglss.cxx
e3debef
+++ b/sw/source/core/edit/edglss.cxx
e3debef
@@ -235,12 +235,15 @@ bool SwEditShell::_CopySelToDoc( SwDoc* pInsDoc, SwNodeIndex* pSttNd )
e3debef
                 // Make a copy, so that in case we need to adjust the selection
e3debef
                 // for the purpose of copying, our shell cursor is not touched.
e3debef
                 // (Otherwise we would have to restore it.)
e3debef
-                SwPaM aPaM(*PCURCRSR);
e3debef
+                SwPaM aPaM(*PCURCRSR->GetMark(), *PCURCRSR->GetPoint());
e3debef
                 if (bSelectAll)
e3debef
+                {
e3debef
                     // Selection starts at the first para of the first cell,
e3debef
                     // but we want to copy the table and the start node before
e3debef
                     // the first cell as well.
e3debef
                     aPaM.Start()->nNode = aPaM.Start()->nNode.GetNode().FindTableNode()->GetIndex();
f2b5427
+                    aPaM.Start()->nContent.Assign(0, 0);
e3debef
+                }
e3debef
                 bRet = GetDoc()->CopyRange( aPaM, aPos, false ) || bRet;
e3debef
             }
e3debef
 
e3debef
-- 
f2b5427
2.5.0
e3debef