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

Side by Side Diff: mojo/edk/system/channel.h

Issue 2008953003: [mojo-edk] Explicitly serialise HANDLEs into messages instead of PlatformHandles. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cast2 Created 4 years, 7 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
« no previous file with comments | « no previous file | mojo/edk/system/channel.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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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_EDK_SYSTEM_CHANNEL_H_ 5 #ifndef MOJO_EDK_SYSTEM_CHANNEL_H_
6 #define MOJO_EDK_SYSTEM_CHANNEL_H_ 6 #define MOJO_EDK_SYSTEM_CHANNEL_H_
7 7
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 struct MachPortsExtraHeader { 84 struct MachPortsExtraHeader {
85 // Actual number of Mach ports encoded in the extra header. 85 // Actual number of Mach ports encoded in the extra header.
86 uint16_t num_ports; 86 uint16_t num_ports;
87 87
88 // Array of encoded Mach ports. If |num_ports| > 0, |entires[0]| through 88 // Array of encoded Mach ports. If |num_ports| > 0, |entires[0]| through
89 // to |entries[num_ports-1]| inclusive are valid. 89 // to |entries[num_ports-1]| inclusive are valid.
90 MachPortsEntry entries[0]; 90 MachPortsEntry entries[0];
91 }; 91 };
92 static_assert(sizeof(MachPortsExtraHeader) == 2, 92 static_assert(sizeof(MachPortsExtraHeader) == 2,
93 "sizeof(MachPortsExtraHeader) must be 2 bytes"); 93 "sizeof(MachPortsExtraHeader) must be 2 bytes");
94 #elif defined(OS_WIN)
95 struct HandleEntry {
96 // The windows HANDLE. HANDLEs are guaranteed to fit inside 32-bits.
97 // See: https://msdn.microsoft.com/en-us/library/aa384203(VS.85).aspx
98 uint32_t handle;
99 };
100 static_assert(sizeof(HandleEntry) == 4,
101 "sizeof(HandleEntry) must be 4 bytes");
94 #endif 102 #endif
95 #pragma pack(pop) 103 #pragma pack(pop)
96 104
97 // Allocates and owns a buffer for message data with enough capacity for 105 // Allocates and owns a buffer for message data with enough capacity for
98 // |payload_size| bytes plus a header, plus |max_handles| platform handles. 106 // |payload_size| bytes plus a header, plus |max_handles| platform handles.
99 Message(size_t payload_size, 107 Message(size_t payload_size,
100 size_t max_handles, 108 size_t max_handles,
101 Header::MessageType message_type = Header::MessageType::NORMAL); 109 Header::MessageType message_type = Header::MessageType::NORMAL);
102 110
103 ~Message(); 111 ~Message();
(...skipping 17 matching lines...) Expand all
121 return header_->num_header_bytes - sizeof(Header); 129 return header_->num_header_bytes - sizeof(Header);
122 } 130 }
123 131
124 void* mutable_payload() { return data_ + header_->num_header_bytes; } 132 void* mutable_payload() { return data_ + header_->num_header_bytes; }
125 const void* payload() const { return data_ + header_->num_header_bytes; } 133 const void* payload() const { return data_ + header_->num_header_bytes; }
126 size_t payload_size() const; 134 size_t payload_size() const;
127 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID) 135 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID)
128 136
129 size_t num_handles() const { return header_->num_handles; } 137 size_t num_handles() const { return header_->num_handles; }
130 bool has_handles() const { return header_->num_handles > 0; } 138 bool has_handles() const { return header_->num_handles > 0; }
131 PlatformHandle* handles();
132 #if defined(OS_MACOSX) && !defined(OS_IOS) 139 #if defined(OS_MACOSX) && !defined(OS_IOS)
133 bool has_mach_ports() const; 140 bool has_mach_ports() const;
134 #endif 141 #endif
135 142
136 // Note: SetHandles() and TakeHandles() invalidate any previous value of 143 // Note: SetHandles() and TakeHandles() invalidate any previous value of
137 // handles(). 144 // handles().
138 void SetHandles(ScopedPlatformHandleVectorPtr new_handles); 145 void SetHandles(ScopedPlatformHandleVectorPtr new_handles);
139 ScopedPlatformHandleVectorPtr TakeHandles(); 146 ScopedPlatformHandleVectorPtr TakeHandles();
140 // Version of TakeHandles that returns a vector of platform handles suitable 147 // Version of TakeHandles that returns a vector of platform handles suitable
141 // for transfer over an underlying OS mechanism. i.e. file descriptors over 148 // for transfer over an underlying OS mechanism. i.e. file descriptors over
142 // a unix domain socket. Any handle that cannot be transferred this way, 149 // a unix domain socket. Any handle that cannot be transferred this way,
143 // such as Mach ports, will be removed. 150 // such as Mach ports, will be removed.
144 ScopedPlatformHandleVectorPtr TakeHandlesForTransport(); 151 ScopedPlatformHandleVectorPtr TakeHandlesForTransport();
145 152
146 #if defined(OS_WIN) 153 #if defined(OS_WIN)
147 // Prepares the handles in this message for use in a different process. 154 // Prepares the handles in this message for use in a different process.
148 // Upon calling this the handles should belong to |from_process|; after the 155 // Upon calling this the handles should belong to |from_process|; after the
149 // call they'll belong to |to_process|. The source handles are always 156 // call they'll belong to |to_process|. The source handles are always
150 // closed by this call. Returns false iff one or more handles failed 157 // closed by this call. Returns false iff one or more handles failed
151 // duplication. 158 // duplication.
152 static bool RewriteHandles(base::ProcessHandle from_process, 159 static bool RewriteHandles(base::ProcessHandle from_process,
153 base::ProcessHandle to_process, 160 base::ProcessHandle to_process,
154 PlatformHandle* handles, 161 PlatformHandleVector* handles);
155 size_t num_handles);
156 #endif 162 #endif
157 163
158 private: 164 private:
159 size_t size_; 165 size_t size_;
160 size_t max_handles_; 166 size_t max_handles_;
161 char* data_; 167 char* data_;
162 Header* header_; 168 Header* header_;
163 169
170 ScopedPlatformHandleVectorPtr handle_vector_;
171
164 #if defined(OS_WIN) 172 #if defined(OS_WIN)
165 // On Windows, handles are serialised into the extra header section. 173 // On Windows, handles are serialised into the extra header section.
166 PlatformHandle* handles_ = nullptr; 174 HandleEntry* handles_ = nullptr;
167 #else 175 #elif defined(OS_MACOSX) && !defined(OS_IOS)
168 ScopedPlatformHandleVectorPtr handle_vector_;
169 #endif
170
171 #if defined(OS_MACOSX) && !defined(OS_IOS)
172 // On OSX, handles are serialised into the extra header section. 176 // On OSX, handles are serialised into the extra header section.
173 MachPortsExtraHeader* mach_ports_header_ = nullptr; 177 MachPortsExtraHeader* mach_ports_header_ = nullptr;
174 #endif 178 #endif
175 179
176 DISALLOW_COPY_AND_ASSIGN(Message); 180 DISALLOW_COPY_AND_ASSIGN(Message);
177 }; 181 };
178 182
179 // Delegate methods are called from the I/O task runner with which the Channel 183 // Delegate methods are called from the I/O task runner with which the Channel
180 // was created (see Channel::Create). 184 // was created (see Channel::Create).
181 class Delegate { 185 class Delegate {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 Delegate* delegate_; 279 Delegate* delegate_;
276 const std::unique_ptr<ReadBuffer> read_buffer_; 280 const std::unique_ptr<ReadBuffer> read_buffer_;
277 281
278 DISALLOW_COPY_AND_ASSIGN(Channel); 282 DISALLOW_COPY_AND_ASSIGN(Channel);
279 }; 283 };
280 284
281 } // namespace edk 285 } // namespace edk
282 } // namespace mojo 286 } // namespace mojo
283 287
284 #endif // MOJO_EDK_SYSTEM_CHANNEL_H_ 288 #endif // MOJO_EDK_SYSTEM_CHANNEL_H_
OLDNEW
« no previous file with comments | « no previous file | mojo/edk/system/channel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698