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

Side by Side Diff: mojo/system/data_pipe.cc

Issue 414393002: Convert verification of options structs to use the new user pointer handling (see r285350). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: temporarily disable part of OptionsValidationTest.InvalidDeath Created 6 years, 4 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/system/data_pipe.h ('k') | mojo/system/data_pipe_unittest.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 #include "mojo/system/data_pipe.h" 5 #include "mojo/system/data_pipe.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <limits> 10 #include <limits>
(...skipping 11 matching lines...) Expand all
22 // static 22 // static
23 const MojoCreateDataPipeOptions DataPipe::kDefaultCreateOptions = { 23 const MojoCreateDataPipeOptions DataPipe::kDefaultCreateOptions = {
24 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)), 24 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)),
25 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 25 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
26 1u, 26 1u,
27 static_cast<uint32_t>(kDefaultDataPipeCapacityBytes) 27 static_cast<uint32_t>(kDefaultDataPipeCapacityBytes)
28 }; 28 };
29 29
30 // static 30 // static
31 MojoResult DataPipe::ValidateCreateOptions( 31 MojoResult DataPipe::ValidateCreateOptions(
32 const MojoCreateDataPipeOptions* in_options, 32 UserPointer<const MojoCreateDataPipeOptions> in_options,
33 MojoCreateDataPipeOptions* out_options) { 33 MojoCreateDataPipeOptions* out_options) {
34 const MojoCreateDataPipeOptionsFlags kKnownFlags = 34 const MojoCreateDataPipeOptionsFlags kKnownFlags =
35 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD; 35 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD;
36 36
37 *out_options = kDefaultCreateOptions; 37 *out_options = kDefaultCreateOptions;
38 if (!in_options) 38 if (in_options.IsNull())
39 return MOJO_RESULT_OK; 39 return MOJO_RESULT_OK;
40 40
41 MojoResult result = 41 UserOptionsReader<MojoCreateDataPipeOptions> reader(in_options);
42 ValidateOptionsStructPointerSizeAndFlags<MojoCreateDataPipeOptions>( 42 if (!reader.is_valid())
43 in_options, kKnownFlags, out_options); 43 return MOJO_RESULT_INVALID_ARGUMENT;
44 if (result != MOJO_RESULT_OK) 44
45 return result; 45 if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateDataPipeOptions, flags, reader))
46 return MOJO_RESULT_OK;
47 if ((reader.options().flags & ~kKnownFlags))
48 return MOJO_RESULT_UNIMPLEMENTED;
49 out_options->flags = reader.options().flags;
46 50
47 // Checks for fields beyond |flags|: 51 // Checks for fields beyond |flags|:
48 52
49 if (!HAS_OPTIONS_STRUCT_MEMBER(MojoCreateDataPipeOptions, element_num_bytes, 53 if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateDataPipeOptions, element_num_bytes,
50 in_options)) 54 reader))
51 return MOJO_RESULT_OK; 55 return MOJO_RESULT_OK;
52 if (in_options->element_num_bytes == 0) 56 if (reader.options().element_num_bytes == 0)
53 return MOJO_RESULT_INVALID_ARGUMENT; 57 return MOJO_RESULT_INVALID_ARGUMENT;
54 out_options->element_num_bytes = in_options->element_num_bytes; 58 out_options->element_num_bytes = reader.options().element_num_bytes;
55 59
56 if (!HAS_OPTIONS_STRUCT_MEMBER(MojoCreateDataPipeOptions, capacity_num_bytes, 60 if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateDataPipeOptions, capacity_num_bytes,
57 in_options) || 61 reader) ||
58 in_options->capacity_num_bytes == 0) { 62 reader.options().capacity_num_bytes == 0) {
59 // Round the default capacity down to a multiple of the element size (but at 63 // Round the default capacity down to a multiple of the element size (but at
60 // least one element). 64 // least one element).
61 out_options->capacity_num_bytes = std::max( 65 out_options->capacity_num_bytes = std::max(
62 static_cast<uint32_t>(kDefaultDataPipeCapacityBytes - 66 static_cast<uint32_t>(kDefaultDataPipeCapacityBytes -
63 (kDefaultDataPipeCapacityBytes % out_options->element_num_bytes)), 67 (kDefaultDataPipeCapacityBytes % out_options->element_num_bytes)),
64 out_options->element_num_bytes); 68 out_options->element_num_bytes);
65 return MOJO_RESULT_OK; 69 return MOJO_RESULT_OK;
66 } 70 }
67 if (in_options->capacity_num_bytes % out_options->element_num_bytes != 0) 71 if (reader.options().capacity_num_bytes % out_options->element_num_bytes != 0)
68 return MOJO_RESULT_INVALID_ARGUMENT; 72 return MOJO_RESULT_INVALID_ARGUMENT;
69 if (in_options->capacity_num_bytes > kMaxDataPipeCapacityBytes) 73 if (reader.options().capacity_num_bytes > kMaxDataPipeCapacityBytes)
70 return MOJO_RESULT_RESOURCE_EXHAUSTED; 74 return MOJO_RESULT_RESOURCE_EXHAUSTED;
71 out_options->capacity_num_bytes = in_options->capacity_num_bytes; 75 out_options->capacity_num_bytes = reader.options().capacity_num_bytes;
72 76
73 return MOJO_RESULT_OK; 77 return MOJO_RESULT_OK;
74 } 78 }
75 79
76 void DataPipe::ProducerCancelAllWaiters() { 80 void DataPipe::ProducerCancelAllWaiters() {
77 base::AutoLock locker(lock_); 81 base::AutoLock locker(lock_);
78 DCHECK(has_local_producer_no_lock()); 82 DCHECK(has_local_producer_no_lock());
79 producer_waiter_list_->CancelAllWaiters(); 83 producer_waiter_list_->CancelAllWaiters();
80 } 84 }
81 85
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 element_num_bytes_(validated_options.element_num_bytes), 396 element_num_bytes_(validated_options.element_num_bytes),
393 capacity_num_bytes_(validated_options.capacity_num_bytes), 397 capacity_num_bytes_(validated_options.capacity_num_bytes),
394 producer_open_(true), 398 producer_open_(true),
395 consumer_open_(true), 399 consumer_open_(true),
396 producer_waiter_list_(has_local_producer ? new WaiterList() : NULL), 400 producer_waiter_list_(has_local_producer ? new WaiterList() : NULL),
397 consumer_waiter_list_(has_local_consumer ? new WaiterList() : NULL), 401 consumer_waiter_list_(has_local_consumer ? new WaiterList() : NULL),
398 producer_two_phase_max_num_bytes_written_(0), 402 producer_two_phase_max_num_bytes_written_(0),
399 consumer_two_phase_max_num_bytes_read_(0) { 403 consumer_two_phase_max_num_bytes_read_(0) {
400 // Check that the passed in options actually are validated. 404 // Check that the passed in options actually are validated.
401 MojoCreateDataPipeOptions unused ALLOW_UNUSED = { 0 }; 405 MojoCreateDataPipeOptions unused ALLOW_UNUSED = { 0 };
402 DCHECK_EQ(ValidateCreateOptions(&validated_options, &unused), MOJO_RESULT_OK); 406 DCHECK_EQ(ValidateCreateOptions(MakeUserPointer(&validated_options), &unused),
407 MOJO_RESULT_OK);
403 } 408 }
404 409
405 DataPipe::~DataPipe() { 410 DataPipe::~DataPipe() {
406 DCHECK(!producer_open_); 411 DCHECK(!producer_open_);
407 DCHECK(!consumer_open_); 412 DCHECK(!consumer_open_);
408 DCHECK(!producer_waiter_list_); 413 DCHECK(!producer_waiter_list_);
409 DCHECK(!consumer_waiter_list_); 414 DCHECK(!consumer_waiter_list_);
410 } 415 }
411 416
412 void DataPipe::AwakeProducerWaitersForStateChangeNoLock( 417 void DataPipe::AwakeProducerWaitersForStateChangeNoLock(
413 const HandleSignalsState& new_producer_state) { 418 const HandleSignalsState& new_producer_state) {
414 lock_.AssertAcquired(); 419 lock_.AssertAcquired();
415 if (!has_local_producer_no_lock()) 420 if (!has_local_producer_no_lock())
416 return; 421 return;
417 producer_waiter_list_->AwakeWaitersForStateChange(new_producer_state); 422 producer_waiter_list_->AwakeWaitersForStateChange(new_producer_state);
418 } 423 }
419 424
420 void DataPipe::AwakeConsumerWaitersForStateChangeNoLock( 425 void DataPipe::AwakeConsumerWaitersForStateChangeNoLock(
421 const HandleSignalsState& new_consumer_state) { 426 const HandleSignalsState& new_consumer_state) {
422 lock_.AssertAcquired(); 427 lock_.AssertAcquired();
423 if (!has_local_consumer_no_lock()) 428 if (!has_local_consumer_no_lock())
424 return; 429 return;
425 consumer_waiter_list_->AwakeWaitersForStateChange(new_consumer_state); 430 consumer_waiter_list_->AwakeWaitersForStateChange(new_consumer_state);
426 } 431 }
427 432
428 } // namespace system 433 } // namespace system
429 } // namespace mojo 434 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/data_pipe.h ('k') | mojo/system/data_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698