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, |