2016-07-27 20:44:29 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#ifndef mozilla_mscom_COMPtrHolder_h
|
|
|
|
#define mozilla_mscom_COMPtrHolder_h
|
|
|
|
|
Bug 1609996 - Reorder some includes affected by the previous patches. r=froydnj
This was done by:
This was done by applying:
```
diff --git a/python/mozbuild/mozbuild/code-analysis/mach_commands.py b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
index 789affde7bbf..fe33c4c7d4d1 100644
--- a/python/mozbuild/mozbuild/code-analysis/mach_commands.py
+++ b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
@@ -2007,7 +2007,7 @@ class StaticAnalysis(MachCommandBase):
from subprocess import Popen, PIPE, check_output, CalledProcessError
diff_process = Popen(self._get_clang_format_diff_command(commit), stdout=PIPE)
- args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format]
+ args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format, '-sort-includes']
if not output_file:
args.append("-i")
```
Then running `./mach clang-format -c <commit-hash>`
Then undoing that patch.
Then running check_spidermonkey_style.py --fixup
Then running `./mach clang-format`
I had to fix four things:
* I needed to move <utility> back down in GuardObjects.h because I was hitting
obscure problems with our system include wrappers like this:
0:03.94 /usr/include/stdlib.h:550:14: error: exception specification in declaration does not match previous declaration
0:03.94 extern void *realloc (void *__ptr, size_t __size)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/malloc_decls.h:53:1: note: previous declaration is here
0:03.94 MALLOC_DECL(realloc, void*, void*, size_t)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozilla/mozalloc.h:22:32: note: expanded from macro 'MALLOC_DECL'
0:03.94 MOZ_MEMORY_API return_type name##_impl(__VA_ARGS__);
0:03.94 ^
0:03.94 <scratch space>:178:1: note: expanded from here
0:03.94 realloc_impl
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozmemory_wrap.h:142:41: note: expanded from macro 'realloc_impl'
0:03.94 #define realloc_impl mozmem_malloc_impl(realloc)
Which I really didn't feel like digging into.
* I had to restore the order of TrustOverrideUtils.h and related files in nss
because the .inc files depend on TrustOverrideUtils.h being included earlier.
* I had to add a missing include to RollingNumber.h
* Also had to partially restore include order in JsepSessionImpl.cpp to avoid
some -WError issues due to some static inline functions being defined in a
header but not used in the rest of the compilation unit.
Differential Revision: https://phabricator.services.mozilla.com/D60327
--HG--
extra : moz-landing-system : lando
2020-01-20 19:19:48 +03:00
|
|
|
#include <utility>
|
|
|
|
|
2017-07-19 21:07:45 +03:00
|
|
|
#include "mozilla/Assertions.h"
|
2016-07-27 20:44:29 +03:00
|
|
|
#include "mozilla/Attributes.h"
|
2017-07-19 21:07:45 +03:00
|
|
|
#include "mozilla/DebugOnly.h"
|
2016-07-27 20:44:29 +03:00
|
|
|
#include "mozilla/mscom/ProxyStream.h"
|
|
|
|
#include "mozilla/mscom/Ptr.h"
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2017-07-19 21:07:45 +03:00
|
|
|
# include "mozilla/SandboxSettings.h"
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2017-08-10 00:07:11 +03:00
|
|
|
#include "nsExceptionHandler.h"
|
2016-07-27 20:44:29 +03:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace mscom {
|
|
|
|
|
|
|
|
template <typename Interface, const IID& _IID>
|
|
|
|
class COMPtrHolder {
|
|
|
|
public:
|
|
|
|
typedef ProxyUniquePtr<Interface> COMPtrType;
|
|
|
|
typedef COMPtrHolder<Interface, _IID> ThisType;
|
2017-09-30 00:41:28 +03:00
|
|
|
typedef typename detail::EnvironmentSelector<Interface>::Type EnvType;
|
2016-07-27 20:44:29 +03:00
|
|
|
|
|
|
|
COMPtrHolder() {}
|
|
|
|
|
|
|
|
MOZ_IMPLICIT COMPtrHolder(decltype(nullptr)) {}
|
|
|
|
|
|
|
|
explicit COMPtrHolder(COMPtrType&& aPtr)
|
2018-06-01 19:30:30 +03:00
|
|
|
: mPtr(std::forward<COMPtrType>(aPtr)) {}
|
2016-07-27 20:44:29 +03:00
|
|
|
|
2017-09-30 00:41:28 +03:00
|
|
|
COMPtrHolder(COMPtrType&& aPtr, const ActivationContext& aActCtx)
|
2018-06-01 19:30:30 +03:00
|
|
|
: mPtr(std::forward<COMPtrType>(aPtr)), mActCtx(aActCtx) {}
|
2017-09-30 00:41:28 +03:00
|
|
|
|
2016-07-27 20:44:29 +03:00
|
|
|
Interface* Get() const { return mPtr.get(); }
|
|
|
|
|
|
|
|
MOZ_MUST_USE Interface* Release() { return mPtr.release(); }
|
|
|
|
|
2018-06-01 19:30:30 +03:00
|
|
|
void Set(COMPtrType&& aPtr) { mPtr = std::forward<COMPtrType>(aPtr); }
|
2016-07-27 20:44:29 +03:00
|
|
|
|
2017-09-30 00:41:28 +03:00
|
|
|
void SetActCtx(const ActivationContext& aActCtx) { mActCtx = aActCtx; }
|
|
|
|
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2017-07-19 21:07:45 +03:00
|
|
|
// This method is const because we need to call it during IPC write, where
|
|
|
|
// we are passed as a const argument. At higher sandboxing levels we need to
|
|
|
|
// save this artifact from the serialization process for later deletion.
|
2017-08-17 01:31:07 +03:00
|
|
|
void PreserveStream(PreservedStreamPtr aPtr) const {
|
2017-07-19 21:07:45 +03:00
|
|
|
MOZ_ASSERT(!mMarshaledStream);
|
2018-05-30 22:15:35 +03:00
|
|
|
mMarshaledStream = std::move(aPtr);
|
2017-07-19 21:07:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
PreservedStreamPtr GetPreservedStream() {
|
2018-05-30 22:15:35 +03:00
|
|
|
return std::move(mMarshaledStream);
|
2017-07-19 21:07:45 +03:00
|
|
|
}
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2017-07-19 21:07:45 +03:00
|
|
|
|
2016-07-27 20:44:29 +03:00
|
|
|
COMPtrHolder(const COMPtrHolder& aOther) = delete;
|
|
|
|
|
|
|
|
COMPtrHolder(COMPtrHolder&& aOther)
|
2018-05-30 22:15:35 +03:00
|
|
|
: mPtr(std::move(aOther.mPtr))
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2018-05-30 22:15:35 +03:00
|
|
|
,
|
|
|
|
mMarshaledStream(std::move(aOther.mMarshaledStream))
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2016-07-27 20:44:29 +03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// COMPtrHolder is eventually added as a member of a struct that is declared
|
|
|
|
// in IPDL. The generated C++ code for that IPDL struct includes copy
|
|
|
|
// constructors and assignment operators that assume that all members are
|
|
|
|
// copyable. I don't think that those copy constructors and operator= are
|
|
|
|
// actually used by any generated code, but they are made available. Since no
|
|
|
|
// move semantics are available, this terrible hack makes COMPtrHolder build
|
|
|
|
// when used as a member of an IPDL struct.
|
|
|
|
ThisType& operator=(const ThisType& aOther) {
|
2018-05-30 22:15:35 +03:00
|
|
|
Set(std::move(aOther.mPtr));
|
2017-08-17 01:31:07 +03:00
|
|
|
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2018-05-30 22:15:35 +03:00
|
|
|
mMarshaledStream = std::move(aOther.mMarshaledStream);
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2017-08-17 01:31:07 +03:00
|
|
|
|
2016-07-27 20:44:29 +03:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
ThisType& operator=(ThisType&& aOther) {
|
2018-05-30 22:15:35 +03:00
|
|
|
Set(std::move(aOther.mPtr));
|
2017-08-17 01:31:07 +03:00
|
|
|
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2018-05-30 22:15:35 +03:00
|
|
|
mMarshaledStream = std::move(aOther.mMarshaledStream);
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2017-08-17 01:31:07 +03:00
|
|
|
|
2016-07-27 20:44:29 +03:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator==(const ThisType& aOther) const { return mPtr == aOther.mPtr; }
|
|
|
|
|
|
|
|
bool IsNull() const { return !mPtr; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
// This is mutable to facilitate the above operator= hack
|
2017-09-30 00:41:28 +03:00
|
|
|
mutable COMPtrType mPtr;
|
|
|
|
ActivationContext mActCtx;
|
2017-07-19 21:07:45 +03:00
|
|
|
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2017-07-19 21:07:45 +03:00
|
|
|
// This is mutable so that we may optionally store a reference to a marshaled
|
|
|
|
// stream to be cleaned up later via PreserveStream().
|
|
|
|
mutable PreservedStreamPtr mMarshaledStream;
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2016-07-27 20:44:29 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace mscom
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
namespace IPC {
|
|
|
|
|
|
|
|
template <typename Interface, const IID& _IID>
|
|
|
|
struct ParamTraits<mozilla::mscom::COMPtrHolder<Interface, _IID>> {
|
|
|
|
typedef mozilla::mscom::COMPtrHolder<Interface, _IID> paramType;
|
|
|
|
|
|
|
|
static void Write(Message* aMsg, const paramType& aParam) {
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2017-08-17 01:31:07 +03:00
|
|
|
static const bool sIsStreamPreservationNeeded =
|
|
|
|
XRE_IsParentProcess() &&
|
|
|
|
mozilla::GetEffectiveContentSandboxLevel() >= 3;
|
|
|
|
#else
|
|
|
|
const bool sIsStreamPreservationNeeded = false;
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2017-08-17 01:31:07 +03:00
|
|
|
|
2018-07-04 00:04:26 +03:00
|
|
|
typename paramType::EnvType env;
|
2017-09-30 00:41:28 +03:00
|
|
|
|
2017-08-17 01:31:07 +03:00
|
|
|
mozilla::mscom::ProxyStreamFlags flags =
|
|
|
|
sIsStreamPreservationNeeded
|
|
|
|
? mozilla::mscom::ProxyStreamFlags::ePreservable
|
|
|
|
: mozilla::mscom::ProxyStreamFlags::eDefault;
|
|
|
|
|
2017-09-30 00:41:28 +03:00
|
|
|
mozilla::mscom::ProxyStream proxyStream(_IID, aParam.Get(), &env, flags);
|
2016-07-27 20:44:29 +03:00
|
|
|
int bufLen;
|
|
|
|
const BYTE* buf = proxyStream.GetBuffer(bufLen);
|
2016-08-18 18:48:48 +03:00
|
|
|
MOZ_ASSERT(buf || !bufLen);
|
2016-07-27 20:44:29 +03:00
|
|
|
aMsg->WriteInt(bufLen);
|
2017-03-15 03:42:24 +03:00
|
|
|
if (bufLen) {
|
|
|
|
aMsg->WriteBytes(reinterpret_cast<const char*>(buf), bufLen);
|
|
|
|
}
|
2017-07-19 21:07:45 +03:00
|
|
|
|
2019-03-19 01:31:59 +03:00
|
|
|
#if defined(MOZ_SANDBOX)
|
2017-08-17 01:31:07 +03:00
|
|
|
if (sIsStreamPreservationNeeded) {
|
|
|
|
/**
|
|
|
|
* When we're sending a ProxyStream from parent to content and the
|
|
|
|
* content sandboxing level is >= 3, content is unable to communicate
|
|
|
|
* its releasing of its reference to the proxied object. We preserve the
|
|
|
|
* marshaled proxy data here and later manually release it on content's
|
|
|
|
* behalf.
|
|
|
|
*/
|
|
|
|
aParam.PreserveStream(proxyStream.GetPreservedStream());
|
2017-07-19 21:07:45 +03:00
|
|
|
}
|
2019-03-19 01:31:59 +03:00
|
|
|
#endif // defined(MOZ_SANDBOX)
|
2016-07-27 20:44:29 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static bool Read(const Message* aMsg, PickleIterator* aIter,
|
|
|
|
paramType* aResult) {
|
|
|
|
int length;
|
|
|
|
if (!aMsg->ReadLength(aIter, &length)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
mozilla::UniquePtr<BYTE[]> buf;
|
|
|
|
if (length) {
|
|
|
|
buf = mozilla::MakeUnique<BYTE[]>(length);
|
|
|
|
if (!aMsg->ReadBytesInto(aIter, buf.get(), length)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-31 16:04:58 +03:00
|
|
|
typename paramType::EnvType env;
|
2017-09-30 00:41:28 +03:00
|
|
|
|
|
|
|
mozilla::mscom::ProxyStream proxyStream(_IID, buf.get(), length, &env);
|
2016-07-27 20:44:29 +03:00
|
|
|
if (!proxyStream.IsValid()) {
|
Bug 1348273 - Convert crash annotations into a machine-readable list of constants; r=ted.mielczarek,njn,dholbert,mak,cpearce,mcmanus,froydnj,Dexter,jrmuizel,jchen,jimm,bz,surkov
This introduces the machinery needed to generate crash annotations from a YAML
file. The relevant C++ functions are updated to take a typed enum. JavaScript
calls are unaffected but they will throw if the string argument does not
correspond to one of the known entries in the C++ enum. The existing whitelists
and blacklists of annotations are also generated from the YAML file and all
duplicate code related to them has been consolidated. Once written out to the
.extra file the annotations are converted in string form and are no different
than the existing ones.
All existing annotations have been included in the list (and some obsolete ones
have been removed) and all call sites have been updated including tests where
appropriate.
--HG--
extra : source : 4f6c43f2830701ec5552e08e3f1b06fe6d045860
2018-07-05 16:42:11 +03:00
|
|
|
CrashReporter::AnnotateCrashReport(
|
|
|
|
CrashReporter::Annotation::ProxyStreamValid,
|
|
|
|
NS_LITERAL_CSTRING("false"));
|
2016-07-27 20:44:29 +03:00
|
|
|
return false;
|
|
|
|
}
|
2017-03-15 03:42:24 +03:00
|
|
|
|
|
|
|
typename paramType::COMPtrType ptr;
|
2017-07-13 00:00:27 +03:00
|
|
|
if (!proxyStream.GetInterface(mozilla::mscom::getter_AddRefs(ptr))) {
|
2016-07-27 20:44:29 +03:00
|
|
|
return false;
|
|
|
|
}
|
2017-03-15 03:42:24 +03:00
|
|
|
|
2018-05-30 22:15:35 +03:00
|
|
|
aResult->Set(std::move(ptr));
|
2016-07-27 20:44:29 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace IPC
|
|
|
|
|
|
|
|
#endif // mozilla_mscom_COMPtrHolder_h
|