From c11e60f11f34b12bf73a08a96634202a8d3aef0c Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Tue, 31 May 2016 23:45:53 +0200 Subject: 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. --- 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 +- 5 files changed, 12 insertions(+), 10 deletions(-) (limited to 'extensions') diff --git a/extensions/source/ole/oleobjw.cxx b/extensions/source/ole/oleobjw.cxx index b2fde4a3a406..2a2b7eb256f1 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::get()); + ret.setValue(static_cast(&pVariant), cppu::UnoType::get()); } } diff --git a/extensions/source/ole/servprov.cxx b/extensions/source/ole/servprov.cxx index 6d3d5fa38f30..95b3badf5ae2 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::get().getTypeClass()) + if (oleAny.getValueTypeClass() == cppu::UnoType::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::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::get()); + ret.setValue(static_cast(&pVariant), cppu::UnoType::get()); } else throw IllegalArgumentException(); } else if (sourceModelType == OLE) { - if (modelDepObject.getValueType() != cppu::UnoType::get()) + if (modelDepObject.getValueType() != cppu::UnoType::get()) { throw IllegalArgumentException(); } @@ -397,7 +397,7 @@ Any SAL_CALL OleConverter_Impl2::createBridge(const Any& modelDepObject, } else { - ret.setValue((void*) &pVariant, cppu::UnoType::get()); + ret.setValue(static_cast(&pVariant), cppu::UnoType::get()); } } else if (destModelType == UNO) diff --git a/extensions/source/ole/unoconversionutilities.hxx b/extensions/source/ole/unoconversionutilities.hxx index bdf61db5456e..e1459b855172 100644 --- a/extensions/source/ole/unoconversionutilities.hxx +++ b/extensions/source/ole/unoconversionutilities.hxx @@ -244,8 +244,10 @@ bool convertSelfToCom( T& unoInterface, VARIANT * pVar) Sequence 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::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 a67cdbb1766e..8070b085a608 100644 --- a/extensions/test/ole/OleClient/funcs.cxx +++ b/extensions/test/ole/OleClient/funcs.cxx @@ -92,7 +92,7 @@ Reference 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*)arId, 16), OLE, UNO ); diff --git a/extensions/test/ole/OleConverterVar1/convTest.cxx b/extensions/test/ole/OleConverterVar1/convTest.cxx index 112f8dee4b10..1c7538cb0752 100644 --- a/extensions/test/ole/OleConverterVar1/convTest.cxx +++ b/extensions/test/ole/OleConverterVar1/convTest.cxx @@ -129,7 +129,7 @@ HRESULT doTest() rtl_getGlobalProcessId( arId); Any target= xSuppl->createBridge( any, Sequence( (sal_Int8*)arId, 16), UNO, OLE); CComDispatchDriver oletest; - if (target.getValueTypeClass() == cppu::UnoType::get().getTypeClass()) + if (target.getValueTypeClass() == cppu::UnoType::get().getTypeClass()) { VARIANT* pVariant = *(VARIANT**)target.getValue(); -- cgit