aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar scroggo <scroggo@google.com>2016-01-11 06:38:00 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-01-11 06:38:00 -0800
commitb512aaa5c808bcb1336c147682657882ee54e652 (patch)
treef41946ac736809519f55ce9b46ba5da98ed3331e
parent0b558cb42c6771b310520b2db41310c1da746f0c (diff)
Make SkROBuffer::Iter::size() work when exhausted
According to the documentation, this method will return 0 when the Iter is exhausted. Prior to this CL, it crashes instead. Prevent a crash with a null fHead, and add a test to verify the behavior. GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1574603002 Review URL: https://codereview.chromium.org/1574603002
-rw-r--r--src/core/SkRWBuffer.cpp3
-rw-r--r--tests/DataRefTest.cpp15
2 files changed, 18 insertions, 0 deletions
diff --git a/src/core/SkRWBuffer.cpp b/src/core/SkRWBuffer.cpp
index e9147dc684..0784378d99 100644
--- a/src/core/SkRWBuffer.cpp
+++ b/src/core/SkRWBuffer.cpp
@@ -150,6 +150,9 @@ const void* SkROBuffer::Iter::data() const {
}
size_t SkROBuffer::Iter::size() const {
+ if (!fBlock) {
+ return 0;
+ }
return SkTMin(fBlock->fUsed, fRemaining);
}
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp
index 0c7d5f4520..f1e645ec7e 100644
--- a/tests/DataRefTest.cpp
+++ b/tests/DataRefTest.cpp
@@ -313,3 +313,18 @@ DEF_TEST(RWBuffer, reporter) {
delete streams[i];
}
}
+
+// Tests that it is safe to call SkROBuffer::Iter::size() when exhausted.
+DEF_TEST(RWBuffer_size, r) {
+ SkRWBuffer buffer;
+ buffer.append(gABC, 26);
+
+ SkAutoTUnref<SkROBuffer> roBuffer(buffer.newRBufferSnapshot());
+ SkROBuffer::Iter iter(roBuffer);
+ REPORTER_ASSERT(r, iter.data());
+ REPORTER_ASSERT(r, iter.size() == 26);
+
+ // There is only one block in this buffer.
+ REPORTER_ASSERT(r, !iter.next());
+ REPORTER_ASSERT(r, 0 == iter.size());
+}