Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Unified Diff: ipc/ipc_message_utils.h

Issue 1665363002: Clang plugin to check that unstable types are not used in IPC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Blacklist types instead Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698