sw/source/core/doc/docnew.cxx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
New commits: commit 059b53d8ae713be9c3db23481768888e74e39586 Author: Armin Le Grand <a...@apache.org> Date: Fri Jan 31 17:42:41 2014 +0000 i123914 Use an own hold on the newly created SwDoc when a call to SetTmpDocShell(NULL) is needed diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 7682e58..ab3bd93 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -1202,7 +1202,25 @@ SfxObjectShell* SwDoc::CreateCopy(bool bCallInitNew ) const pRet->Paste( *this ); // remove the temporary shell if it is there as it was done before - pRet->SetTmpDocShell( (SfxObjectShell*)NULL ); + if(pRet->GetTmpDocShell()) + { + // #123914# If we get here, SwOLENode::MakeCopy had to create a temporary + // SwDocShell to have a SvPersist as a target for the OLE data to be copied. + // It is reset by a call to SetTmpDocShell(NULL), but in this case here + // there is no other ref holder to the just cloned SwDoc. Thus - to prevent + // it's immediate deletion - it is required to hold a fercunt to it during + // the SetTmpDocShell call. This can be done with an instance of a class + // holding a SwDoc, but most simple using acquire/release on the SwDoc + // (as long as these are public, I was surprised. Also probably not + // guaranteed for the future is that the release call does not delete the + // SwDoc it gets called at, but currently works like this). + pRet->acquire(); + pRet->SetTmpDocShell((SfxObjectShell*)NULL); + pRet->release(); + } + + // remove the temporary shell if it is there as it was done before + // pRet->SetTmpDocShell( (SfxObjectShell*)NULL ); return pRetShell; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits