OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ipc/ipc_message.h" | 5 #include "ipc/ipc_message.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 | 8 |
9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 data -= sizeof(int64_t); | 124 data -= sizeof(int64_t); |
125 return *(reinterpret_cast<const int64_t*>(data)); | 125 return *(reinterpret_cast<const int64_t*>(data)); |
126 } | 126 } |
127 | 127 |
128 void Message::set_received_time(int64_t time) const { | 128 void Message::set_received_time(int64_t time) const { |
129 received_time_ = time; | 129 received_time_ = time; |
130 } | 130 } |
131 #endif | 131 #endif |
132 | 132 |
133 Message::NextMessageInfo::NextMessageInfo() | 133 Message::NextMessageInfo::NextMessageInfo() |
134 : message_found(false), pickle_end(nullptr), message_end(nullptr) {} | 134 : message_size(0), message_found(false), pickle_end(nullptr), |
| 135 message_end(nullptr) {} |
135 Message::NextMessageInfo::~NextMessageInfo() {} | 136 Message::NextMessageInfo::~NextMessageInfo() {} |
136 | 137 |
137 Message::SerializedAttachmentIds | 138 Message::SerializedAttachmentIds |
138 Message::SerializedIdsOfBrokerableAttachments() { | 139 Message::SerializedIdsOfBrokerableAttachments() { |
139 DCHECK(HasBrokerableAttachments()); | 140 DCHECK(HasBrokerableAttachments()); |
140 std::vector<const BrokerableAttachment*> attachments = | 141 std::vector<const BrokerableAttachment*> attachments = |
141 attachment_set_->PeekBrokerableAttachments(); | 142 attachment_set_->PeekBrokerableAttachments(); |
142 CHECK_LE(attachments.size(), std::numeric_limits<size_t>::max() / | 143 CHECK_LE(attachments.size(), std::numeric_limits<size_t>::max() / |
143 BrokerableAttachment::kNonceSize); | 144 BrokerableAttachment::kNonceSize); |
144 size_t size = attachments.size() * BrokerableAttachment::kNonceSize; | 145 size_t size = attachments.size() * BrokerableAttachment::kNonceSize; |
145 char* buffer = static_cast<char*>(malloc(size)); | 146 char* buffer = static_cast<char*>(malloc(size)); |
146 for (size_t i = 0; i < attachments.size(); ++i) { | 147 for (size_t i = 0; i < attachments.size(); ++i) { |
147 const BrokerableAttachment* attachment = attachments[i]; | 148 const BrokerableAttachment* attachment = attachments[i]; |
148 char* start_range = buffer + i * BrokerableAttachment::kNonceSize; | 149 char* start_range = buffer + i * BrokerableAttachment::kNonceSize; |
149 BrokerableAttachment::AttachmentId id = attachment->GetIdentifier(); | 150 BrokerableAttachment::AttachmentId id = attachment->GetIdentifier(); |
150 id.SerializeToBuffer(start_range, BrokerableAttachment::kNonceSize); | 151 id.SerializeToBuffer(start_range, BrokerableAttachment::kNonceSize); |
151 } | 152 } |
152 SerializedAttachmentIds ids; | 153 SerializedAttachmentIds ids; |
153 ids.buffer = buffer; | 154 ids.buffer = buffer; |
154 ids.size = size; | 155 ids.size = size; |
155 return ids; | 156 return ids; |
156 } | 157 } |
157 | 158 |
158 // static | 159 // static |
159 void Message::FindNext(const char* range_start, | 160 void Message::FindNext(const char* range_start, |
160 const char* range_end, | 161 const char* range_end, |
161 NextMessageInfo* info) { | 162 NextMessageInfo* info) { |
162 DCHECK(info); | 163 DCHECK(info); |
163 const char* pickle_end = | 164 info->message_found = false; |
164 base::Pickle::FindNext(sizeof(Header), range_start, range_end); | 165 info->message_size = 0; |
165 if (!pickle_end) | 166 |
| 167 size_t pickle_size = 0; |
| 168 if (!base::Pickle::PeekNext(sizeof(Header), |
| 169 range_start, range_end, &pickle_size)) |
166 return; | 170 return; |
167 info->pickle_end = pickle_end; | 171 |
| 172 bool have_entire_pickle = |
| 173 static_cast<size_t>(range_end - range_start) >= pickle_size; |
168 | 174 |
169 #if USE_ATTACHMENT_BROKER | 175 #if USE_ATTACHMENT_BROKER |
| 176 // TODO(dskiba): determine message_size when entire pickle is not available |
| 177 |
| 178 if (!have_entire_pickle) |
| 179 return; |
| 180 |
| 181 const char* pickle_end = range_start + pickle_size; |
| 182 |
170 // The data is not copied. | 183 // The data is not copied. |
171 size_t pickle_len = static_cast<size_t>(pickle_end - range_start); | 184 Message message(range_start, static_cast<int>(pickle_size)); |
172 Message message(range_start, static_cast<int>(pickle_len)); | 185 size_t num_attachments = message.header()->num_brokered_attachments; |
173 int num_attachments = message.header()->num_brokered_attachments; | |
174 | 186 |
175 // Check for possible overflows. | 187 // Check for possible overflows. |
176 size_t max_size_t = std::numeric_limits<size_t>::max(); | 188 size_t max_size_t = std::numeric_limits<size_t>::max(); |
177 if (num_attachments >= max_size_t / BrokerableAttachment::kNonceSize) | 189 if (num_attachments >= max_size_t / BrokerableAttachment::kNonceSize) |
178 return; | 190 return; |
179 | 191 |
180 size_t attachment_length = num_attachments * BrokerableAttachment::kNonceSize; | 192 size_t attachment_length = num_attachments * BrokerableAttachment::kNonceSize; |
181 if (pickle_len > max_size_t - attachment_length) | 193 if (pickle_size > max_size_t - attachment_length) |
182 return; | 194 return; |
183 | 195 |
184 // Check whether the range includes the attachments. | 196 // Check whether the range includes the attachments. |
185 size_t buffer_length = static_cast<size_t>(range_end - range_start); | 197 size_t buffer_length = static_cast<size_t>(range_end - range_start); |
186 if (buffer_length < attachment_length + pickle_len) | 198 if (buffer_length < attachment_length + pickle_size) |
187 return; | 199 return; |
188 | 200 |
189 for (int i = 0; i < num_attachments; ++i) { | 201 for (int i = 0; i < num_attachments; ++i) { |
190 const char* attachment_start = | 202 const char* attachment_start = |
191 pickle_end + i * BrokerableAttachment::kNonceSize; | 203 pickle_end + i * BrokerableAttachment::kNonceSize; |
192 BrokerableAttachment::AttachmentId id(attachment_start, | 204 BrokerableAttachment::AttachmentId id(attachment_start, |
193 BrokerableAttachment::kNonceSize); | 205 BrokerableAttachment::kNonceSize); |
194 info->attachment_ids.push_back(id); | 206 info->attachment_ids.push_back(id); |
195 } | 207 } |
196 info->message_end = | 208 info->message_end = |
197 pickle_end + num_attachments * BrokerableAttachment::kNonceSize; | 209 pickle_end + num_attachments * BrokerableAttachment::kNonceSize; |
| 210 info->message_size = info->message_end - range_start; |
198 #else | 211 #else |
| 212 info->message_size = pickle_size; |
| 213 |
| 214 if (!have_entire_pickle) |
| 215 return; |
| 216 |
| 217 const char* pickle_end = range_start + pickle_size; |
| 218 |
199 info->message_end = pickle_end; | 219 info->message_end = pickle_end; |
200 #endif // USE_ATTACHMENT_BROKER | 220 #endif // USE_ATTACHMENT_BROKER |
201 | 221 |
| 222 info->pickle_end = pickle_end; |
202 info->message_found = true; | 223 info->message_found = true; |
203 } | 224 } |
204 | 225 |
205 bool Message::AddPlaceholderBrokerableAttachmentWithId( | 226 bool Message::AddPlaceholderBrokerableAttachmentWithId( |
206 BrokerableAttachment::AttachmentId id) { | 227 BrokerableAttachment::AttachmentId id) { |
207 scoped_refptr<PlaceholderBrokerableAttachment> attachment( | 228 scoped_refptr<PlaceholderBrokerableAttachment> attachment( |
208 new PlaceholderBrokerableAttachment(id)); | 229 new PlaceholderBrokerableAttachment(id)); |
209 return attachment_set()->AddAttachment(attachment); | 230 return attachment_set()->AddAttachment(attachment); |
210 } | 231 } |
211 | 232 |
(...skipping 26 matching lines...) Expand all Loading... |
238 bool Message::HasMojoHandles() const { | 259 bool Message::HasMojoHandles() const { |
239 return attachment_set_.get() && attachment_set_->num_mojo_handles() > 0; | 260 return attachment_set_.get() && attachment_set_->num_mojo_handles() > 0; |
240 } | 261 } |
241 | 262 |
242 bool Message::HasBrokerableAttachments() const { | 263 bool Message::HasBrokerableAttachments() const { |
243 return attachment_set_.get() && | 264 return attachment_set_.get() && |
244 attachment_set_->num_brokerable_attachments() > 0; | 265 attachment_set_->num_brokerable_attachments() > 0; |
245 } | 266 } |
246 | 267 |
247 } // namespace IPC | 268 } // namespace IPC |
OLD | NEW |