diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-06 19:59:26 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-06 19:59:26 +0000 |
commit | 73cb8e4fdbb96c28e5d280d5dcd6f8812b77253a (patch) | |
tree | f353648f24a5fe3538e66e268c88a471a34068ba | |
parent | 677b473ea7acc3068ab52b3238ba150d0e09f913 (diff) | |
download | chromium_src-73cb8e4fdbb96c28e5d280d5dcd6f8812b77253a.zip chromium_src-73cb8e4fdbb96c28e5d280d5dcd6f8812b77253a.tar.gz chromium_src-73cb8e4fdbb96c28e5d280d5dcd6f8812b77253a.tar.bz2 |
Merge 267280 "Fix InMemoryUrlProtocol available_bytes computation."
> Fix InMemoryUrlProtocol available_bytes computation.
>
> Fixed available_bytes computation to properly handle large buffers and
> add defensive logic to Read() to protect against negative sizes.
>
> BUG=364065
> TESTS=InMemoryUrlProtocolTest.*
>
> Review URL: https://codereview.chromium.org/253923002
TBR=acolwell@chromium.org
Review URL: https://codereview.chromium.org/269953007
git-svn-id: svn://svn.chromium.org/chrome/branches/1916/src@268594 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/filters/in_memory_url_protocol.cc | 14 | ||||
-rw-r--r-- | media/filters/in_memory_url_protocol_unittest.cc | 51 | ||||
-rw-r--r-- | media/media.gyp | 4 |
3 files changed, 66 insertions, 3 deletions
diff --git a/media/filters/in_memory_url_protocol.cc b/media/filters/in_memory_url_protocol.cc index 85fa290..da8a7dd 100644 --- a/media/filters/in_memory_url_protocol.cc +++ b/media/filters/in_memory_url_protocol.cc @@ -4,6 +4,8 @@ #include "media/filters/in_memory_url_protocol.h" +#include "media/ffmpeg/ffmpeg_common.h" + namespace media { InMemoryUrlProtocol::InMemoryUrlProtocol(const uint8* data, int64 size, @@ -17,12 +19,18 @@ InMemoryUrlProtocol::InMemoryUrlProtocol(const uint8* data, int64 size, InMemoryUrlProtocol::~InMemoryUrlProtocol() {} int InMemoryUrlProtocol::Read(int size, uint8* data) { - int available_bytes = size_ - position_; + if (size < 0) + return AVERROR(EIO); + + int64 available_bytes = size_ - position_; if (size > available_bytes) size = available_bytes; - memcpy(data, data_ + position_, size); - position_ += size; + if (size > 0) { + memcpy(data, data_ + position_, size); + position_ += size; + } + return size; } diff --git a/media/filters/in_memory_url_protocol_unittest.cc b/media/filters/in_memory_url_protocol_unittest.cc new file mode 100644 index 0000000..7b615cd --- /dev/null +++ b/media/filters/in_memory_url_protocol_unittest.cc @@ -0,0 +1,51 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/ffmpeg/ffmpeg_common.h" +#include "media/filters/in_memory_url_protocol.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +static const uint8 kData[] = { 0x01, 0x02, 0x03, 0x04 }; + +TEST(InMemoryUrlProtocolTest, ReadFromLargeBuffer) { + InMemoryUrlProtocol protocol(kData, std::numeric_limits<int64>::max(), false); + + uint8 out[sizeof(kData)]; + EXPECT_EQ(4, protocol.Read(sizeof(out), out)); + EXPECT_EQ(0, memcmp(out, kData, sizeof(out))); +} + +TEST(InMemoryUrlProtocolTest, ReadWithNegativeSize) { + InMemoryUrlProtocol protocol(kData, sizeof(kData), false); + + uint8 out[sizeof(kData)]; + EXPECT_EQ(AVERROR(EIO), protocol.Read(-2, out)); +} + +TEST(InMemoryUrlProtocolTest, ReadWithZeroSize) { + InMemoryUrlProtocol protocol(kData, sizeof(kData), false); + + uint8 out; + EXPECT_EQ(0, protocol.Read(0, &out)); +} + +TEST(InMemoryUrlProtocolTest, SetPosition) { + InMemoryUrlProtocol protocol(kData, sizeof(kData), false); + + EXPECT_FALSE(protocol.SetPosition(-1)); + EXPECT_FALSE(protocol.SetPosition(sizeof(kData) + 1)); + + uint8 out; + EXPECT_TRUE(protocol.SetPosition(sizeof(kData))); + EXPECT_EQ(0, protocol.Read(1, &out)); + + int i = sizeof(kData) / 2; + EXPECT_TRUE(protocol.SetPosition(i)); + EXPECT_EQ(1, protocol.Read(1, &out)); + EXPECT_EQ(kData[i], out); +} + +} // namespace media diff --git a/media/media.gyp b/media/media.gyp index d439453..fa06e15 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -563,6 +563,8 @@ 'filters/ffmpeg_h264_to_annex_b_bitstream_converter.h', 'filters/ffmpeg_video_decoder.cc', 'filters/ffmpeg_video_decoder.h', + 'filters/in_memory_url_protocol.cc', + 'filters/in_memory_url_protocol.h', ], }], ['media_use_libvpx==1', { @@ -1024,6 +1026,7 @@ 'filters/h264_bit_reader_unittest.cc', 'filters/h264_parser_unittest.cc', 'filters/h264_to_annex_b_bitstream_converter_unittest.cc', + 'filters/in_memory_url_protocol_unittest.cc', 'filters/pipeline_integration_test.cc', 'filters/pipeline_integration_test_base.cc', 'filters/skcanvas_video_renderer_unittest.cc', @@ -1101,6 +1104,7 @@ 'filters/ffmpeg_glue_unittest.cc', 'filters/ffmpeg_h264_to_annex_b_bitstream_converter_unittest.cc', 'filters/ffmpeg_video_decoder_unittest.cc', + 'filters/in_memory_url_protocol_unittest.cc', 'filters/pipeline_integration_test.cc', 'filters/pipeline_integration_test_base.cc', ], |