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

Side by Side Diff: mojo/public/cpp/bindings/lib/array_internal.h

Issue 307353009: Mojo cpp bindings: report the reason of validation failure. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/public/cpp/bindings/BUILD.gn ('k') | mojo/public/cpp/bindings/lib/array_internal.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
7 7
8 #include <new> 8 #include <new>
9 #include <vector> 9 #include <vector>
10 10
11 #include "mojo/public/cpp/bindings/lib/bindings_internal.h" 11 #include "mojo/public/cpp/bindings/lib/bindings_internal.h"
12 #include "mojo/public/cpp/bindings/lib/bindings_serialization.h" 12 #include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
13 #include "mojo/public/cpp/bindings/lib/bounds_checker.h" 13 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
14 #include "mojo/public/cpp/bindings/lib/buffer.h" 14 #include "mojo/public/cpp/bindings/lib/buffer.h"
15 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
15 16
16 namespace mojo { 17 namespace mojo {
17 template <typename T> class Array; 18 template <typename T> class Array;
18 class String; 19 class String;
19 20
20 namespace internal { 21 namespace internal {
21 22
22 template <typename T> 23 template <typename T>
23 struct ArrayDataTraits { 24 struct ArrayDataTraits {
24 typedef T StorageType; 25 typedef T StorageType;
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 ElementType* elements, 177 ElementType* elements,
177 std::vector<Handle>* handles) { 178 std::vector<Handle>* handles) {
178 for (uint32_t i = 0; i < header->num_elements; ++i) 179 for (uint32_t i = 0; i < header->num_elements; ++i)
179 Decode(&elements[i], handles); 180 Decode(&elements[i], handles);
180 } 181 }
181 182
182 static bool ValidateElements(const ArrayHeader* header, 183 static bool ValidateElements(const ArrayHeader* header,
183 const ElementType* elements, 184 const ElementType* elements,
184 BoundsChecker* bounds_checker) { 185 BoundsChecker* bounds_checker) {
185 for (uint32_t i = 0; i < header->num_elements; ++i) { 186 for (uint32_t i = 0; i < header->num_elements; ++i) {
186 if (!ValidateEncodedPointer(&elements[i].offset) || 187 if (!ValidateEncodedPointer(&elements[i].offset)) {
187 !P::Validate(DecodePointerRaw(&elements[i].offset), bounds_checker)) { 188 ReportValidationError(VALIDATION_ERROR_ILLEGAL_POINTER);
188 return false; 189 return false;
189 } 190 }
191 if (!P::Validate(DecodePointerRaw(&elements[i].offset), bounds_checker))
192 return false;
190 } 193 }
191 return true; 194 return true;
192 } 195 }
193 }; 196 };
194 197
195 template <typename T> 198 template <typename T>
196 class Array_Data { 199 class Array_Data {
197 public: 200 public:
198 typedef ArrayDataTraits<T> Traits; 201 typedef ArrayDataTraits<T> Traits;
199 typedef typename Traits::StorageType StorageType; 202 typedef typename Traits::StorageType StorageType;
200 typedef typename Traits::Ref Ref; 203 typedef typename Traits::Ref Ref;
201 typedef typename Traits::ConstRef ConstRef; 204 typedef typename Traits::ConstRef ConstRef;
202 typedef ArraySerializationHelper<T, IsHandle<T>::value> Helper; 205 typedef ArraySerializationHelper<T, IsHandle<T>::value> Helper;
203 206
204 static Array_Data<T>* New(size_t num_elements, Buffer* buf) { 207 static Array_Data<T>* New(size_t num_elements, Buffer* buf) {
205 size_t num_bytes = sizeof(Array_Data<T>) + 208 size_t num_bytes = sizeof(Array_Data<T>) +
206 Traits::GetStorageSize(num_elements); 209 Traits::GetStorageSize(num_elements);
207 return new (buf->Allocate(num_bytes)) Array_Data<T>(num_bytes, 210 return new (buf->Allocate(num_bytes)) Array_Data<T>(num_bytes,
208 num_elements); 211 num_elements);
209 } 212 }
210 213
211 static bool Validate(const void* data, BoundsChecker* bounds_checker) { 214 static bool Validate(const void* data, BoundsChecker* bounds_checker) {
212 if (!data) 215 if (!data)
213 return true; 216 return true;
214 if (!IsAligned(data)) 217 if (!IsAligned(data)) {
218 ReportValidationError(VALIDATION_ERROR_MISALIGNED_OBJECT);
215 return false; 219 return false;
216 if (!bounds_checker->IsValidRange(data, sizeof(ArrayHeader))) 220 }
221 if (!bounds_checker->IsValidRange(data, sizeof(ArrayHeader))) {
222 ReportValidationError(VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
217 return false; 223 return false;
224 }
218 const ArrayHeader* header = static_cast<const ArrayHeader*>(data); 225 const ArrayHeader* header = static_cast<const ArrayHeader*>(data);
219 if (header->num_bytes < (sizeof(Array_Data<T>) + 226 if (header->num_bytes < (sizeof(Array_Data<T>) +
220 Traits::GetStorageSize(header->num_elements))) { 227 Traits::GetStorageSize(header->num_elements))) {
228 ReportValidationError(VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER);
221 return false; 229 return false;
222 } 230 }
223 if (!bounds_checker->ClaimMemory(data, header->num_bytes)) 231 if (!bounds_checker->ClaimMemory(data, header->num_bytes)) {
232 ReportValidationError(VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
224 return false; 233 return false;
234 }
225 235
226 const Array_Data<T>* object = static_cast<const Array_Data<T>*>(data); 236 const Array_Data<T>* object = static_cast<const Array_Data<T>*>(data);
227 return Helper::ValidateElements(&object->header_, object->storage(), 237 return Helper::ValidateElements(&object->header_, object->storage(),
228 bounds_checker); 238 bounds_checker);
229 } 239 }
230 240
231 size_t size() const { return header_.num_elements; } 241 size_t size() const { return header_.num_elements; }
232 242
233 Ref at(size_t offset) { 243 Ref at(size_t offset) {
234 assert(offset < static_cast<size_t>(header_.num_elements)); 244 assert(offset < static_cast<size_t>(header_.num_elements));
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 }; 326 };
317 327
318 template <> struct WrapperTraits<String, false> { 328 template <> struct WrapperTraits<String, false> {
319 typedef String_Data* DataType; 329 typedef String_Data* DataType;
320 }; 330 };
321 331
322 } // namespace internal 332 } // namespace internal
323 } // namespace mojo 333 } // namespace mojo
324 334
325 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ 335 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/BUILD.gn ('k') | mojo/public/cpp/bindings/lib/array_internal.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698