| Index: mojo/system/data_pipe.cc | 
| diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc | 
| index b0b350f808b154d73a898a8fb14a86fcee4b40c5..78e84f803ba76a2a16f6deb407a103350149a3ca 100644 | 
| --- a/mojo/system/data_pipe.cc | 
| +++ b/mojo/system/data_pipe.cc | 
| @@ -29,33 +29,37 @@ const MojoCreateDataPipeOptions DataPipe::kDefaultCreateOptions = { | 
|  | 
| // static | 
| MojoResult DataPipe::ValidateCreateOptions( | 
| -    const MojoCreateDataPipeOptions* in_options, | 
| +    UserPointer<const MojoCreateDataPipeOptions> in_options, | 
| MojoCreateDataPipeOptions* out_options) { | 
| const MojoCreateDataPipeOptionsFlags kKnownFlags = | 
| MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD; | 
|  | 
| *out_options = kDefaultCreateOptions; | 
| -  if (!in_options) | 
| +  if (in_options.IsNull()) | 
| return MOJO_RESULT_OK; | 
|  | 
| -  MojoResult result = | 
| -      ValidateOptionsStructPointerSizeAndFlags<MojoCreateDataPipeOptions>( | 
| -          in_options, kKnownFlags, out_options); | 
| -  if (result != MOJO_RESULT_OK) | 
| -    return result; | 
| +  UserOptionsReader<MojoCreateDataPipeOptions> reader(in_options); | 
| +  if (!reader.is_valid()) | 
| +    return MOJO_RESULT_INVALID_ARGUMENT; | 
| + | 
| +  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateDataPipeOptions, flags, reader)) | 
| +    return MOJO_RESULT_OK; | 
| +  if ((reader.options().flags & ~kKnownFlags)) | 
| +    return MOJO_RESULT_UNIMPLEMENTED; | 
| +  out_options->flags = reader.options().flags; | 
|  | 
| // Checks for fields beyond |flags|: | 
|  | 
| -  if (!HAS_OPTIONS_STRUCT_MEMBER(MojoCreateDataPipeOptions, element_num_bytes, | 
| -                                 in_options)) | 
| +  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateDataPipeOptions, element_num_bytes, | 
| +                                 reader)) | 
| return MOJO_RESULT_OK; | 
| -  if (in_options->element_num_bytes == 0) | 
| +  if (reader.options().element_num_bytes == 0) | 
| return MOJO_RESULT_INVALID_ARGUMENT; | 
| -  out_options->element_num_bytes = in_options->element_num_bytes; | 
| +  out_options->element_num_bytes = reader.options().element_num_bytes; | 
|  | 
| -  if (!HAS_OPTIONS_STRUCT_MEMBER(MojoCreateDataPipeOptions, capacity_num_bytes, | 
| -                                 in_options) || | 
| -      in_options->capacity_num_bytes == 0) { | 
| +  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateDataPipeOptions, capacity_num_bytes, | 
| +                                 reader) || | 
| +      reader.options().capacity_num_bytes == 0) { | 
| // Round the default capacity down to a multiple of the element size (but at | 
| // least one element). | 
| out_options->capacity_num_bytes = std::max( | 
| @@ -64,11 +68,11 @@ MojoResult DataPipe::ValidateCreateOptions( | 
| out_options->element_num_bytes); | 
| return MOJO_RESULT_OK; | 
| } | 
| -  if (in_options->capacity_num_bytes % out_options->element_num_bytes != 0) | 
| +  if (reader.options().capacity_num_bytes % out_options->element_num_bytes != 0) | 
| return MOJO_RESULT_INVALID_ARGUMENT; | 
| -  if (in_options->capacity_num_bytes > kMaxDataPipeCapacityBytes) | 
| +  if (reader.options().capacity_num_bytes > kMaxDataPipeCapacityBytes) | 
| return MOJO_RESULT_RESOURCE_EXHAUSTED; | 
| -  out_options->capacity_num_bytes = in_options->capacity_num_bytes; | 
| +  out_options->capacity_num_bytes = reader.options().capacity_num_bytes; | 
|  | 
| return MOJO_RESULT_OK; | 
| } | 
| @@ -399,7 +403,8 @@ DataPipe::DataPipe(bool has_local_producer, | 
| consumer_two_phase_max_num_bytes_read_(0) { | 
| // Check that the passed in options actually are validated. | 
| MojoCreateDataPipeOptions unused ALLOW_UNUSED = { 0 }; | 
| -  DCHECK_EQ(ValidateCreateOptions(&validated_options, &unused), MOJO_RESULT_OK); | 
| +  DCHECK_EQ(ValidateCreateOptions(MakeUserPointer(&validated_options), &unused), | 
| +            MOJO_RESULT_OK); | 
| } | 
|  | 
| DataPipe::~DataPipe() { | 
|  |