summaryrefslogtreecommitdiffstats
path: root/mojo
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-22 04:59:07 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-22 04:59:07 +0000
commit7d069e6e4067009b7b0549420e0192bac9db9eee (patch)
tree793062db3acaae5612bd55531e0776f1fed4f91a /mojo
parent833cac8d5aa4a9a3f526374143a6a875e0245419 (diff)
downloadchromium_src-7d069e6e4067009b7b0549420e0192bac9db9eee.zip
chromium_src-7d069e6e4067009b7b0549420e0192bac9db9eee.tar.gz
chromium_src-7d069e6e4067009b7b0549420e0192bac9db9eee.tar.bz2
Mojo: fix integer overflow
BUG=355036 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/208593006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258785 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo')
-rw-r--r--mojo/public/bindings/lib/fixed_buffer.cc7
-rw-r--r--mojo/public/bindings/tests/buffer_unittest.cc20
2 files changed, 23 insertions, 4 deletions
diff --git a/mojo/public/bindings/lib/fixed_buffer.cc b/mojo/public/bindings/lib/fixed_buffer.cc
index 6b20dd1..09e3094 100644
--- a/mojo/public/bindings/lib/fixed_buffer.cc
+++ b/mojo/public/bindings/lib/fixed_buffer.cc
@@ -31,11 +31,10 @@ void* FixedBuffer::Allocate(size_t delta, Destructor dtor) {
delta = internal::Align(delta);
- // TODO(darin): Using <assert.h> is probably not going to cut it.
- assert(delta > 0);
- assert(cursor_ + delta <= size_);
- if (cursor_ + delta > size_)
+ if (delta == 0 || delta > size_ - cursor_) {
+ assert(false);
return NULL;
+ }
char* result = ptr_ + cursor_;
cursor_ += delta;
diff --git a/mojo/public/bindings/tests/buffer_unittest.cc b/mojo/public/bindings/tests/buffer_unittest.cc
index b7d4e15..d2ff91e 100644
--- a/mojo/public/bindings/tests/buffer_unittest.cc
+++ b/mojo/public/bindings/tests/buffer_unittest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <limits>
+
#include "mojo/public/bindings/buffer.h"
#include "mojo/public/bindings/lib/bindings_serialization.h"
#include "mojo/public/bindings/lib/fixed_buffer.h"
@@ -111,6 +113,24 @@ TEST(FixedBufferTest, Leak) {
free(buf_ptr);
}
+#ifdef NDEBUG
+TEST(FixedBufferTest, TooBig) {
+ Environment env;
+
+ internal::FixedBuffer buf(24);
+
+ // A little bit too large.
+ EXPECT_EQ(reinterpret_cast<void*>(0), buf.Allocate(32));
+
+ // Move the cursor forward.
+ EXPECT_NE(reinterpret_cast<void*>(0), buf.Allocate(16));
+
+ // A lot too large, leading to possible integer overflow.
+ EXPECT_EQ(reinterpret_cast<void*>(0),
+ buf.Allocate(std::numeric_limits<size_t>::max() - 8u));
+}
+#endif
+
} // namespace
} // namespace test
} // namespace mojo