Skip to content

Commit 046bb2e

Browse files
committed
Add Out of bounds IndexError for KeyValueMetadata::Delete
* The Delete function now catches out of bound index and does not throw a segmentation fault. Signed-off-by: OmBiradar <ombiradar04@gmail.com>
1 parent f10c93c commit 046bb2e

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

cpp/src/arrow/util/key_value_metadata.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ Result<std::string> KeyValueMetadata::Get(std::string_view key) const {
100100
}
101101

102102
Status KeyValueMetadata::Delete(int64_t index) {
103+
if (ARROW_PREDICT_FALSE(index < 0 || std::cmp_greater_equal(index, values_.size()))) {
104+
return Status::IndexError(
105+
"KeyValueMetadata::Delete: index ", std::to_string(index),
106+
" is out of bounds for metadata "
107+
"of size ",
108+
std::to_string(keys_.size()), " (valid range: [0, ",
109+
std::to_string((keys_.size() == 0 ? 0UL : keys_.size() - 1)), "])");
110+
}
103111
keys_.erase(keys_.begin() + index);
104112
values_.erase(values_.begin() + index);
105113
return Status::OK();

cpp/src/arrow/util/key_value_metadata_test.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,26 @@ TEST(KeyValueMetadataTest, Delete) {
187187
ASSERT_OK(metadata.Delete(3));
188188
ASSERT_TRUE(metadata.Equals(
189189
KeyValueMetadata({"aa", "bb", "dd", "ff", "gg"}, {"1", "2", "4", "6", "7"})));
190+
191+
std::string expected_error_message =
192+
"Index error: KeyValueMetadata::Delete: index -1 is out of bounds for metadata "
193+
"of size 5 (valid range: [0, 4])";
194+
ASSERT_RAISES_WITH_MESSAGE(IndexError, expected_error_message, metadata.Delete(-1));
195+
expected_error_message =
196+
"Index error: KeyValueMetadata::Delete: index 7 is out of bounds for metadata "
197+
"of size 5 (valid range: [0, 4])";
198+
ASSERT_RAISES_WITH_MESSAGE(IndexError, expected_error_message, metadata.Delete(7));
199+
200+
ASSERT_OK(metadata.Delete(4));
201+
ASSERT_OK(metadata.Delete(3));
202+
ASSERT_OK(metadata.Delete(2));
203+
ASSERT_OK(metadata.Delete(1));
204+
ASSERT_OK(metadata.Delete(0));
205+
206+
expected_error_message =
207+
"Index error: KeyValueMetadata::Delete: index 7 is out of bounds for metadata "
208+
"of size 0 (valid range: [0, 0])";
209+
ASSERT_RAISES_WITH_MESSAGE(IndexError, expected_error_message, metadata.Delete(7));
190210
}
191211
{
192212
KeyValueMetadata metadata(keys, values);

0 commit comments

Comments
 (0)