From 4da40a9a5bcdb9491de41464687aad53fa96f721 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Tue, 31 Mar 2020 01:53:01 -0700 Subject: [PATCH] adb: fix front_size, front_data. Bug: https://issuetracker.google.com/150827486 Test: adb_test Change-Id: I3d2c73a20a703d793efb56e592cf33149815f89b --- adb/types.cpp | 2 +- adb/types.h | 4 ++-- adb/types_test.cpp | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/adb/types.cpp b/adb/types.cpp index 26b77ab62..9cdf32b93 100644 --- a/adb/types.cpp +++ b/adb/types.cpp @@ -51,7 +51,7 @@ void IOVector::drop_front(IOVector::size_type len) { auto dropped = 0u; while (dropped < len) { const auto next = chain_[start_index_].size() - begin_offset_; - if (dropped + next < len) { + if (dropped + next <= len) { pop_front_block(); dropped += next; } else { diff --git a/adb/types.h b/adb/types.h index deca7eafb..620aa8eb7 100644 --- a/adb/types.h +++ b/adb/types.h @@ -155,7 +155,7 @@ struct IOVector { return nullptr; } - return chain_.front().data() + begin_offset_; + return chain_[start_index_].data() + begin_offset_; } size_type front_size() const { @@ -163,7 +163,7 @@ struct IOVector { return 0; } - return chain_.front().size() - begin_offset_; + return chain_[start_index_].size() - begin_offset_; } size_type size() const { return chain_length_ - begin_offset_; } diff --git a/adb/types_test.cpp b/adb/types_test.cpp index 2c99f9512..41fa1db25 100644 --- a/adb/types_test.cpp +++ b/adb/types_test.cpp @@ -117,3 +117,20 @@ TEST(IOVector, misaligned_split) { ASSERT_EQ(1ULL, bc.size()); ASSERT_EQ(create_block("x"), bc.coalesce()); } + +TEST(IOVector, drop_front) { + IOVector vec; + + vec.append(create_block('x', 2)); + vec.append(create_block('y', 1000)); + ASSERT_EQ(2U, vec.front_size()); + ASSERT_EQ(1002U, vec.size()); + + vec.drop_front(1); + ASSERT_EQ(1U, vec.front_size()); + ASSERT_EQ(1001U, vec.size()); + + vec.drop_front(1); + ASSERT_EQ(1000U, vec.front_size()); + ASSERT_EQ(1000U, vec.size()); +}