| Index: ipc/ipc_message_utils.h
|
| diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
|
| index 971370a258ae071dcc89c626102e72506b1c4b64..f652fd66caae72789b7d61c678c13d4a55a7b279 100644
|
| --- a/ipc/ipc_message_utils.h
|
| +++ b/ipc/ipc_message_utils.h
|
| @@ -76,18 +76,37 @@ struct IPC_EXPORT LogData {
|
| struct NoParams {
|
| };
|
|
|
| +// Specializations are checked by 'IPC checker' Clang plugin
|
| +// (see WriteParam() below for the list of allowed types).
|
| +template <typename... Ts>
|
| +struct CheckedTuple {
|
| + typedef base::Tuple<Ts...> Tuple;
|
| +};
|
| +
|
| template <class P>
|
| static inline void GetParamSize(base::PickleSizer* sizer, const P& p) {
|
| typedef typename SimilarTypeTraits<P>::Type Type;
|
| ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p));
|
| }
|
|
|
| +// NOT checked by 'IPC checker' Clang plugin.
|
| template <class P>
|
| -static inline void WriteParam(base::Pickle* m, const P& p) {
|
| +static inline void WriteParamUnchecked(base::Pickle* m, const P& p) {
|
| typedef typename SimilarTypeTraits<P>::Type Type;
|
| ParamTraits<Type>::Write(m, static_cast<const Type& >(p));
|
| }
|
|
|
| +// Checked by 'IPC checker' Clang plugin to enforce the following:
|
| +// 1. int / unsigned int are allowed when used as is (not through typedef)
|
| +// 2. long / unsigned long are banned
|
| +// 3. Any typedefs to the types above are banned except for int32_t/uint32_t
|
| +// and int64_t/uint64_t (typedefs to these are allowed)
|
| +// 4. All other types are allowed
|
| +template <class P>
|
| +static inline void WriteParam(base::Pickle* m, const P& p) {
|
| + WriteParamUnchecked(m, p);
|
| +}
|
| +
|
| template <class P>
|
| static inline bool WARN_UNUSED_RESULT ReadParam(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -369,7 +388,7 @@ struct ParamTraits<std::vector<P> > {
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| WriteParam(m, static_cast<int>(p.size()));
|
| for (size_t i = 0; i < p.size(); i++)
|
| - WriteParam(m, p[i]);
|
| + WriteParam<P>(m, p[i]);
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -410,7 +429,7 @@ struct ParamTraits<std::set<P> > {
|
| WriteParam(m, static_cast<int>(p.size()));
|
| typename param_type::const_iterator iter;
|
| for (iter = p.begin(); iter != p.end(); ++iter)
|
| - WriteParam(m, *iter);
|
| + WriteParam<P>(m, *iter);
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -446,8 +465,8 @@ struct ParamTraits<std::map<K, V, C, A> > {
|
| WriteParam(m, static_cast<int>(p.size()));
|
| typename param_type::const_iterator iter;
|
| for (iter = p.begin(); iter != p.end(); ++iter) {
|
| - WriteParam(m, iter->first);
|
| - WriteParam(m, iter->second);
|
| + WriteParam<K>(m, iter->first);
|
| + WriteParam<V>(m, iter->second);
|
| }
|
| }
|
| static bool Read(const base::Pickle* m,
|
| @@ -479,8 +498,8 @@ struct ParamTraits<std::pair<A, B> > {
|
| GetParamSize(sizer, p.second);
|
| }
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| - WriteParam(m, p.first);
|
| - WriteParam(m, p.second);
|
| + WriteParam<A>(m, p.first);
|
| + WriteParam<B>(m, p.second);
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -669,7 +688,7 @@ struct ParamTraits<std::tuple<A>> {
|
| GetParamSize(sizer, base::get<0>(p));
|
| }
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| - WriteParam(m, base::get<0>(p));
|
| + WriteParam<A>(m, base::get<0>(p));
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -689,8 +708,8 @@ struct ParamTraits<std::tuple<A, B>> {
|
| GetParamSize(sizer, base::get<1>(p));
|
| }
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| - WriteParam(m, base::get<0>(p));
|
| - WriteParam(m, base::get<1>(p));
|
| + WriteParam<A>(m, base::get<0>(p));
|
| + WriteParam<B>(m, base::get<1>(p));
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -714,9 +733,9 @@ struct ParamTraits<std::tuple<A, B, C>> {
|
| GetParamSize(sizer, base::get<2>(p));
|
| }
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| - WriteParam(m, base::get<0>(p));
|
| - WriteParam(m, base::get<1>(p));
|
| - WriteParam(m, base::get<2>(p));
|
| + WriteParam<A>(m, base::get<0>(p));
|
| + WriteParam<B>(m, base::get<1>(p));
|
| + WriteParam<C>(m, base::get<2>(p));
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -744,10 +763,10 @@ struct ParamTraits<std::tuple<A, B, C, D>> {
|
| GetParamSize(sizer, base::get<3>(p));
|
| }
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| - WriteParam(m, base::get<0>(p));
|
| - WriteParam(m, base::get<1>(p));
|
| - WriteParam(m, base::get<2>(p));
|
| - WriteParam(m, base::get<3>(p));
|
| + WriteParam<A>(m, base::get<0>(p));
|
| + WriteParam<B>(m, base::get<1>(p));
|
| + WriteParam<C>(m, base::get<2>(p));
|
| + WriteParam<D>(m, base::get<3>(p));
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -779,11 +798,11 @@ struct ParamTraits<std::tuple<A, B, C, D, E>> {
|
| GetParamSize(sizer, base::get<4>(p));
|
| }
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| - WriteParam(m, base::get<0>(p));
|
| - WriteParam(m, base::get<1>(p));
|
| - WriteParam(m, base::get<2>(p));
|
| - WriteParam(m, base::get<3>(p));
|
| - WriteParam(m, base::get<4>(p));
|
| + WriteParam<A>(m, base::get<0>(p));
|
| + WriteParam<B>(m, base::get<1>(p));
|
| + WriteParam<C>(m, base::get<2>(p));
|
| + WriteParam<D>(m, base::get<3>(p));
|
| + WriteParam<E>(m, base::get<4>(p));
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -813,7 +832,7 @@ struct ParamTraits<ScopedVector<P> > {
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| WriteParam(m, static_cast<int>(p.size()));
|
| for (size_t i = 0; i < p.size(); i++)
|
| - WriteParam(m, *p[i]);
|
| + WriteParam<P>(m, *p[i]);
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -851,7 +870,7 @@ struct ParamTraits<base::StackVector<P, stack_capacity> > {
|
| static void Write(base::Pickle* m, const param_type& p) {
|
| WriteParam(m, static_cast<int>(p->size()));
|
| for (size_t i = 0; i < p->size(); i++)
|
| - WriteParam(m, p[i]);
|
| + WriteParam<P>(m, p[i]);
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| @@ -900,8 +919,11 @@ struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > {
|
| WriteParam(m, static_cast<int>(p.size()));
|
| typename param_type::const_iterator iter;
|
| for (iter = p.begin(); iter != p.end(); ++iter) {
|
| - WriteParam(m, iter->first);
|
| - WriteParam(m, iter->second);
|
| + // We expect that types for 'first' and 'second' are specified in
|
| + // the NormalMap instantiation and hence are checked by CheckedTuple.
|
| + // So it's safe to skip checks here.
|
| + WriteParamUnchecked(m, iter->first);
|
| + WriteParamUnchecked(m, iter->second);
|
| }
|
| }
|
| static bool Read(const base::Pickle* m,
|
| @@ -938,7 +960,7 @@ struct ParamTraits<scoped_ptr<P> > {
|
| bool valid = !!p;
|
| WriteParam(m, valid);
|
| if (valid)
|
| - WriteParam(m, *p);
|
| + WriteParam<P>(m, *p);
|
| }
|
| static bool Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
|
|