pw_blob_store: Don't assert on BlobReader seeks or reads
Return FAILED_PRECONDITION if seeking or reading from a closed
BlobStore::BlobReader.
Change-Id: I8ff4710d9378fd86f79f3e1e95282c09d7562de8
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/77823
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Reviewed-by: David Rogers <davidrogers@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/pw_blob_store/blob_store.cc b/pw_blob_store/blob_store.cc
index 9a1fd7b..fee5e5b 100644
--- a/pw_blob_store/blob_store.cc
+++ b/pw_blob_store/blob_store.cc
@@ -706,7 +706,10 @@
}
Status BlobStore::BlobReader::DoSeek(ptrdiff_t offset, Whence origin) {
- PW_DCHECK(open_);
+ if (!open_) {
+ return Status::FailedPrecondition();
+ }
+
// Note that Open ensures it is ValidToRead() which
// in turn guarantees store_.ReadableDataBytes() > 0.
@@ -718,7 +721,10 @@
}
StatusWithSize BlobStore::BlobReader::DoRead(ByteSpan dest) {
- PW_DCHECK(open_);
+ if (!open_) {
+ return StatusWithSize::FailedPrecondition();
+ }
+
StatusWithSize status = store_.Read(offset_, dest);
if (status.ok()) {
offset_ += status.size();
diff --git a/pw_blob_store/blob_store_test.cc b/pw_blob_store/blob_store_test.cc
index 22dc621..11fd849 100644
--- a/pw_blob_store/blob_store_test.cc
+++ b/pw_blob_store/blob_store_test.cc
@@ -683,6 +683,27 @@
ASSERT_EQ(Status::InvalidArgument(), reader.Open(kOffset));
}
+TEST_F(BlobStoreTest, ReadSeekClosedReader) {
+ InitSourceBufferToRandom(0x11309);
+ WriteTestBlock();
+
+ kvs::ChecksumCrc16 checksum;
+
+ char name[16] = "TestBlobBlock";
+ constexpr size_t kBufferSize = 16;
+ BlobStoreBuffer<kBufferSize> blob(
+ name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
+ EXPECT_EQ(OkStatus(), blob.Init());
+ BlobStore::BlobReader reader(blob);
+ ASSERT_EQ(OkStatus(), reader.Open());
+ ASSERT_EQ(OkStatus(), reader.Close());
+
+ EXPECT_EQ(Status::FailedPrecondition(), reader.Seek(0));
+
+ std::byte read_buffer[32];
+ EXPECT_EQ(Status::FailedPrecondition(), reader.Read(read_buffer).status());
+}
+
TEST_F(BlobStoreTest, InvalidSeekOffset) {
InitSourceBufferToRandom(0x11309);
WriteTestBlock();