diff options
author | Michael Stahl <mstahl@redhat.com> | 2016-05-31 23:45:53 +0200 |
---|---|---|
committer | Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> | 2016-06-01 07:33:16 +0000 |
commit | 31f45d4c1709645ac42ff0ff7d068f681f37f675 (patch) | |
tree | b9c7d6d4e624b97ef7a14b7fbdd5c9fbe56882ae | |
parent | 4c6f0378a4512c16e43161436b9fe97d802f4516 (diff) |
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 <kendy@collabora.com>
Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r-- | embedserv/source/embed/docholder.cxx | 2 | ||||
-rw-r--r-- | extensions/source/ole/oleobjw.cxx | 2 | ||||
-rw-r--r-- | extensions/source/ole/servprov.cxx | 10 | ||||
-rw-r--r-- | extensions/source/ole/unoconversionutilities.hxx | 6 | ||||
-rw-r--r-- | extensions/test/ole/OleClient/funcs.cxx | 2 | ||||
-rw-r--r-- | extensions/test/ole/OleConverterVar1/convTest.cxx | 2 |
6 files changed, 13 insertions, 11 deletions
diff --git a/embedserv/source/embed/docholder.cxx b/embedserv/source/embed/docholder.cxx index c95f46ef4d61..a0ea9919ffe7 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 40365b6d9ace..f5709e982775 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 e88a5b60aa2c..81265b5ed7d6 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 9906d54b93ae..7c4a8c3797aa 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 a67cdbb1766e..8070b085a608 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 00cbcc3e276a..d8401339c6c3 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(); |