You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2021/11/25 21:30:40 UTC
[arrow] branch master updated: ARROW-14854: [C++] Fix struct_field crash on invalid index
This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 43e6a03 ARROW-14854: [C++] Fix struct_field crash on invalid index
43e6a03 is described below
commit 43e6a036cffcc2a5d6e39b2eb93edb8ca29cf986
Author: Antoine Pitrou <an...@python.org>
AuthorDate: Thu Nov 25 16:28:39 2021 -0500
ARROW-14854: [C++] Fix struct_field crash on invalid index
A trivial fix.
Closes #11768 from pitrou/ARROW-14854-struct-field-crash
Authored-by: Antoine Pitrou <an...@python.org>
Signed-off-by: David Li <li...@gmail.com>
---
cpp/src/arrow/compute/kernels/scalar_nested.cc | 2 +-
cpp/src/arrow/compute/kernels/scalar_nested_test.cc | 18 ++++++++++++++----
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/cpp/src/arrow/compute/kernels/scalar_nested.cc b/cpp/src/arrow/compute/kernels/scalar_nested.cc
index f2e4cfb..b2014ab 100644
--- a/cpp/src/arrow/compute/kernels/scalar_nested.cc
+++ b/cpp/src/arrow/compute/kernels/scalar_nested.cc
@@ -285,7 +285,7 @@ struct StructFieldFunctor {
static Status CheckIndex(int index, const DataType& type) {
if (!ValidParentType(type)) {
return Status::TypeError("struct_field: cannot subscript field of type ", type);
- } else if (index < 0 || index > type.num_fields()) {
+ } else if (index < 0 || index >= type.num_fields()) {
return Status::Invalid("struct_field: out-of-bounds field reference to field ",
index, " in type ", type, " with ", type.num_fields(),
" fields");
diff --git a/cpp/src/arrow/compute/kernels/scalar_nested_test.cc b/cpp/src/arrow/compute/kernels/scalar_nested_test.cc
index 0b6f7bc..1f78fd6 100644
--- a/cpp/src/arrow/compute/kernels/scalar_nested_test.cc
+++ b/cpp/src/arrow/compute/kernels/scalar_nested_test.cc
@@ -113,7 +113,8 @@ TEST(TestScalarNested, StructField) {
StructFieldOptions extract20({2, 0});
StructFieldOptions invalid1({-1});
StructFieldOptions invalid2({2, 4});
- StructFieldOptions invalid3({0, 1});
+ StructFieldOptions invalid3({3});
+ StructFieldOptions invalid4({0, 1});
FieldVector fields = {field("a", int32()), field("b", utf8()),
field("c", struct_({
field("d", int64()),
@@ -137,8 +138,11 @@ TEST(TestScalarNested, StructField) {
EXPECT_RAISES_WITH_MESSAGE_THAT(Invalid,
::testing::HasSubstr("out-of-bounds field reference"),
CallFunction("struct_field", {arr}, &invalid2));
- EXPECT_RAISES_WITH_MESSAGE_THAT(TypeError, ::testing::HasSubstr("cannot subscript"),
+ EXPECT_RAISES_WITH_MESSAGE_THAT(Invalid,
+ ::testing::HasSubstr("out-of-bounds field reference"),
CallFunction("struct_field", {arr}, &invalid3));
+ EXPECT_RAISES_WITH_MESSAGE_THAT(TypeError, ::testing::HasSubstr("cannot subscript"),
+ CallFunction("struct_field", {arr}, &invalid4));
}
{
auto ty = dense_union(fields, {2, 5, 8});
@@ -159,8 +163,11 @@ TEST(TestScalarNested, StructField) {
EXPECT_RAISES_WITH_MESSAGE_THAT(Invalid,
::testing::HasSubstr("out-of-bounds field reference"),
CallFunction("struct_field", {arr}, &invalid2));
- EXPECT_RAISES_WITH_MESSAGE_THAT(TypeError, ::testing::HasSubstr("cannot subscript"),
+ EXPECT_RAISES_WITH_MESSAGE_THAT(Invalid,
+ ::testing::HasSubstr("out-of-bounds field reference"),
CallFunction("struct_field", {arr}, &invalid3));
+ EXPECT_RAISES_WITH_MESSAGE_THAT(TypeError, ::testing::HasSubstr("cannot subscript"),
+ CallFunction("struct_field", {arr}, &invalid4));
// Test edge cases for union representation
auto ints = ArrayFromJSON(fields[0]->type(), "[null, 2, 3]");
@@ -205,8 +212,11 @@ TEST(TestScalarNested, StructField) {
EXPECT_RAISES_WITH_MESSAGE_THAT(Invalid,
::testing::HasSubstr("out-of-bounds field reference"),
CallFunction("struct_field", {arr}, &invalid2));
- EXPECT_RAISES_WITH_MESSAGE_THAT(TypeError, ::testing::HasSubstr("cannot subscript"),
+ EXPECT_RAISES_WITH_MESSAGE_THAT(Invalid,
+ ::testing::HasSubstr("out-of-bounds field reference"),
CallFunction("struct_field", {arr}, &invalid3));
+ EXPECT_RAISES_WITH_MESSAGE_THAT(TypeError, ::testing::HasSubstr("cannot subscript"),
+ CallFunction("struct_field", {arr}, &invalid4));
}
{
auto arr = ArrayFromJSON(int32(), "[0, 1, 2, 3]");