summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2016-05-31 23:45:53 +0200
committerChristian Lohmaier <lohmaier+LibreOffice@googlemail.com>2016-06-01 07:33:16 +0000
commit31f45d4c1709645ac42ff0ff7d068f681f37f675 (patch)
treeb9c7d6d4e624b97ef7a14b7fbdd5c9fbe56882ae
parent4c6f0378a4512c16e43161436b9fe97d802f4516 (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.cxx2
-rw-r--r--extensions/source/ole/oleobjw.cxx2
-rw-r--r--extensions/source/ole/servprov.cxx10
-rw-r--r--extensions/source/ole/unoconversionutilities.hxx6
-rw-r--r--extensions/test/ole/OleClient/funcs.cxx2
-rw-r--r--extensions/test/ole/OleConverterVar1/convTest.cxx2
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();