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

Side by Side Diff: base/pickle.cc

Issue 1345353004: Resize IPC input buffer to fit the next message. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests and address comments Created 5 years, 2 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
OLDNEW
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 "base/pickle.h" 5 #include "base/pickle.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <algorithm> // for max() 9 #include <algorithm> // for max()
10 #include <limits>
10 11
11 #include "base/bits.h" 12 #include "base/bits.h"
12 #include "base/macros.h" 13 #include "base/macros.h"
13 14
14 namespace base { 15 namespace base {
15 16
16 // static 17 // static
17 const int Pickle::kPayloadUnit = 64; 18 const int Pickle::kPayloadUnit = 64;
18 19
19 static const size_t kCapacityReadOnly = static_cast<size_t>(-1); 20 static const size_t kCapacityReadOnly = static_cast<size_t>(-1);
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 size_t Pickle::GetTotalAllocatedSize() const { 332 size_t Pickle::GetTotalAllocatedSize() const {
332 if (capacity_after_header_ == kCapacityReadOnly) 333 if (capacity_after_header_ == kCapacityReadOnly)
333 return 0; 334 return 0;
334 return header_size_ + capacity_after_header_; 335 return header_size_ + capacity_after_header_;
335 } 336 }
336 337
337 // static 338 // static
338 const char* Pickle::FindNext(size_t header_size, 339 const char* Pickle::FindNext(size_t header_size,
339 const char* start, 340 const char* start,
340 const char* end) { 341 const char* end) {
342 size_t pickle_size = 0;
343 if (!PeekNext(header_size, start, end, &pickle_size))
344 return NULL;
345
346 if (pickle_size > static_cast<size_t>(end - start))
347 return NULL;
348
349 return start + pickle_size;
350 }
351
352 // static
353 bool Pickle::PeekNext(size_t header_size,
354 const char* start,
355 const char* end,
356 size_t* pickle_size) {
341 DCHECK_EQ(header_size, bits::Align(header_size, sizeof(uint32))); 357 DCHECK_EQ(header_size, bits::Align(header_size, sizeof(uint32)));
358 DCHECK_GE(header_size, sizeof(Header));
342 DCHECK_LE(header_size, static_cast<size_t>(kPayloadUnit)); 359 DCHECK_LE(header_size, static_cast<size_t>(kPayloadUnit));
343 360
344 size_t length = static_cast<size_t>(end - start); 361 size_t length = static_cast<size_t>(end - start);
345 if (length < sizeof(Header)) 362 if (length < sizeof(Header))
346 return NULL; 363 return false;
347 364
348 const Header* hdr = reinterpret_cast<const Header*>(start); 365 const Header* hdr = reinterpret_cast<const Header*>(start);
349 if (length < header_size || length - header_size < hdr->payload_size) 366 if (length < header_size)
350 return NULL; 367 return false;
351 return start + header_size + hdr->payload_size; 368
369 if (hdr->payload_size > std::numeric_limits<size_t>::max() - header_size) {
370 // If payload_size causes an overflow, we return maximum possible
371 // pickle size to indicate that.
372 *pickle_size = std::numeric_limits<size_t>::max();
373 } else {
374 *pickle_size = header_size + hdr->payload_size;
375 }
376 return true;
352 } 377 }
353 378
354 template <size_t length> void Pickle::WriteBytesStatic(const void* data) { 379 template <size_t length> void Pickle::WriteBytesStatic(const void* data) {
355 WriteBytesCommon(data, length); 380 WriteBytesCommon(data, length);
356 } 381 }
357 382
358 template void Pickle::WriteBytesStatic<2>(const void* data); 383 template void Pickle::WriteBytesStatic<2>(const void* data);
359 template void Pickle::WriteBytesStatic<4>(const void* data); 384 template void Pickle::WriteBytesStatic<4>(const void* data);
360 template void Pickle::WriteBytesStatic<8>(const void* data); 385 template void Pickle::WriteBytesStatic<8>(const void* data);
361 386
(...skipping 17 matching lines...) Expand all
379 } 404 }
380 405
381 char* write = mutable_payload() + write_offset_; 406 char* write = mutable_payload() + write_offset_;
382 memcpy(write, data, length); 407 memcpy(write, data, length);
383 memset(write + length, 0, data_len - length); 408 memset(write + length, 0, data_len - length);
384 header_->payload_size = static_cast<uint32>(new_size); 409 header_->payload_size = static_cast<uint32>(new_size);
385 write_offset_ = new_size; 410 write_offset_ = new_size;
386 } 411 }
387 412
388 } // namespace base 413 } // namespace base
OLDNEW
« no previous file with comments | « base/pickle.h ('k') | base/pickle_unittest.cc » ('j') | ipc/ipc_channel_reader.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698