| 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 |