embedserv/source/embed/docholder.cxx | 2 +- extensions/source/ole/oleobjw.cxx | 2 +- extensions/source/ole/servprov.cxx | 10 +++++----- extensions/source/ole/unoconversionutilities.hxx | 6 ++++-- extensions/test/ole/OleClient/funcs.cxx | 2 +- extensions/test/ole/OleConverterVar1/convTest.cxx | 2 +- 6 files changed, 13 insertions(+), 11 deletions(-)
New commits: commit 31f45d4c1709645ac42ff0ff7d068f681f37f675 Author: Michael Stahl <mst...@redhat.com> Date: Tue May 31 23:45:53 2016 +0200 tdf#99643 OLE automation bridge: fix 64-bit pointer conversions XBridgeSupplier2::createBridge() is always called in-process and should therefore expect and create Anys with native-sized encoded pointers, so use sal_uIntPtr. Change-Id: Ia757ff38568b07de8085a1a9d323d806bcca0f63 Note: Currently all calls in LO code are with source=UNO, target=OLE. (cherry picked from commit c11e60f11f34b12bf73a08a96634202a8d3aef0c) Reviewed-on: https://gerrit.libreoffice.org/25740 Reviewed-by: Jan Holesovsky <ke...@collabora.com> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/embedserv/source/embed/docholder.cxx b/embedserv/source/embed/docholder.cxx index c95f46e..a0ea991 100644 --- a/embedserv/source/embed/docholder.cxx +++ b/embedserv/source/embed/docholder.cxx @@ -1046,7 +1046,7 @@ IDispatch* DocumentHolder::GetIDispatch() bridge::ModelDependent::OLE ); if ( anyResult.getValueTypeClass() == - cppu::UnoType<sal_uInt32>::get().getTypeClass() ) + cppu::UnoType<sal_uIntPtr>::get().getTypeClass() ) { VARIANT* pVariant = *(VARIANT**)anyResult.getValue(); if ( pVariant->vt == VT_DISPATCH ) diff --git a/extensions/source/ole/oleobjw.cxx b/extensions/source/ole/oleobjw.cxx index 40365b6..f5709e9 100644 --- a/extensions/source/ole/oleobjw.cxx +++ b/extensions/source/ole/oleobjw.cxx @@ -725,7 +725,7 @@ Any SAL_CALL IUnknownWrapper_Impl::createBridge( const Any& modelDepObject, pVariant->punkVal->AddRef(); } - ret.setValue((void*)&pVariant, cppu::UnoType<sal_uInt32>::get()); + ret.setValue(static_cast<void*>(&pVariant), cppu::UnoType<sal_uIntPtr>::get()); } } diff --git a/extensions/source/ole/servprov.cxx b/extensions/source/ole/servprov.cxx index e88a5b6..81265b5 100644 --- a/extensions/source/ole/servprov.cxx +++ b/extensions/source/ole/servprov.cxx @@ -160,7 +160,7 @@ STDMETHODIMP ProviderOleWrapper_Impl::CreateInstance(IUnknown FAR* punkOuter, OLE); - if (oleAny.getValueTypeClass() == cppu::UnoType<sal_uInt32>::get().getTypeClass()) + if (oleAny.getValueTypeClass() == cppu::UnoType<sal_uIntPtr>::get().getTypeClass()) { VARIANT* pVariant = *(VARIANT**)oleAny.getValue(); @@ -291,7 +291,7 @@ STDMETHODIMP OneInstanceOleWrapper_Impl::CreateInstance(IUnknown FAR* punkOuter, OLE); - if (oleAny.getValueTypeClass() == TypeClass_UNSIGNED_LONG) + if (oleAny.getValueTypeClass() == cppu::UnoType<sal_uIntPtr>::get().getTypeClass()) { VARIANT* pVariant = *(VARIANT**)oleAny.getValue(); @@ -374,14 +374,14 @@ Any SAL_CALL OleConverter_Impl2::createBridge(const Any& modelDepObject, CoTaskMemFree(pVariant); throw IllegalArgumentException(); } - ret.setValue((void*) &pVariant, cppu::UnoType<sal_uInt32>::get()); + ret.setValue(static_cast<void*>(&pVariant), cppu::UnoType<sal_uIntPtr>::get()); } else throw IllegalArgumentException(); } else if (sourceModelType == OLE) { - if (modelDepObject.getValueType() != cppu::UnoType<sal_uInt32>::get()) + if (modelDepObject.getValueType() != cppu::UnoType<sal_uIntPtr>::get()) { throw IllegalArgumentException(); } @@ -397,7 +397,7 @@ Any SAL_CALL OleConverter_Impl2::createBridge(const Any& modelDepObject, } else { - ret.setValue((void*) &pVariant, cppu::UnoType<sal_uInt32>::get()); + ret.setValue(static_cast<void*>(&pVariant), cppu::UnoType<sal_uIntPtr>::get()); } } else if (destModelType == UNO) diff --git a/extensions/source/ole/unoconversionutilities.hxx b/extensions/source/ole/unoconversionutilities.hxx index 9906d54..7c4a8c3 100644 --- a/extensions/source/ole/unoconversionutilities.hxx +++ b/extensions/source/ole/unoconversionutilities.hxx @@ -246,8 +246,10 @@ bool convertSelfToCom( T& unoInterface, VARIANT * pVar) Sequence<sal_Int8> seqId( arId, 16); Any anySource; anySource <<= xInt; - Any anyDisp= xSupplier->createBridge( anySource, seqId, UNO, OLE); - if( anyDisp.getValueTypeClass() == TypeClass_UNSIGNED_LONG) + Any anyDisp = xSupplier->createBridge(anySource, seqId, UNO, OLE); + + // due to global-process-id check this must be in-process pointer + if (anyDisp.getValueTypeClass() == cppu::UnoType<sal_uIntPtr>::get().getTypeClass()) { VARIANT* pvariant= *(VARIANT**)anyDisp.getValue(); HRESULT hr; diff --git a/extensions/test/ole/OleClient/funcs.cxx b/extensions/test/ole/OleClient/funcs.cxx index a67cdbb..8070b08 100644 --- a/extensions/test/ole/OleClient/funcs.cxx +++ b/extensions/test/ole/OleClient/funcs.cxx @@ -92,7 +92,7 @@ Reference<XInvocation> convertComObject( IUnknown* pUnk) Any any; CComVariant var( pUnk); - any <<= ( sal_uInt32)&var; + any <<= (sal_uIntPtr) &var; sal_uInt8 arId[16]; rtl_getGlobalProcessId( arId); Any target= xSuppl->createBridge( any, Sequence<sal_Int8>( (sal_Int8*)arId, 16), OLE, UNO ); diff --git a/extensions/test/ole/OleConverterVar1/convTest.cxx b/extensions/test/ole/OleConverterVar1/convTest.cxx index 00cbcc3..d840133 100644 --- a/extensions/test/ole/OleConverterVar1/convTest.cxx +++ b/extensions/test/ole/OleConverterVar1/convTest.cxx @@ -131,7 +131,7 @@ HRESULT doTest() rtl_getGlobalProcessId( arId); Any target= xSuppl->createBridge( any, Sequence<sal_Int8>( (sal_Int8*)arId, 16), UNO, OLE); CComDispatchDriver oletest; - if (target.getValueTypeClass() == cppu::UnoType<sal_uInt32>::get().getTypeClass()) + if (target.getValueTypeClass() == cppu::UnoType<sal_uIntPtr>::get().getTypeClass()) { VARIANT* pVariant = *(VARIANT**)target.getValue(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits