Chromium Code Reviews| 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. |
|
jam
2016/02/19 16:16:05
perhaps add a presubmit check to ensure that Write
|
| 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, |