Skip to content

GH-1236: fix out-of-slice read in ArrowFlightJdbcArray.checkBoundaries - #1237

Open
Arawoof06 wants to merge 1 commit into
apache:mainfrom
Arawoof06:jdbc-array-slice-bounds
Open

Arawoof06 wants to merge 1 commit into
apache:mainfrom
Arawoof06:jdbc-array-slice-bounds

Conversation

@Arawoof06

Copy link
Copy Markdown
Contributor

What's Changed

checkBoundaries validates the caller index against startOffset + valuesCount, but index is relative to the start of the array and both call sites add startOffset to it only after the check, so the accepted range is too long by exactly startOffset elements. getArray and getResultSet then read that far past the end of the row's slice. AbstractArrowFlightJdbcListVectorAccessor constructs these from the offsets of the list element being read, so any row of a list column not starting at child offset 0 hands back values belonging to neighbouring rows of the shared child vector, and past the child's valueCount whatever is in allocated-but-unwritten memory. The bound belongs on the relative index, so it is compared against valuesCount instead; that is the same expression as today when startOffset is 0, which is why the existing tests all pass unchanged and only the offset case gets tighter. Added a regression test for each of the two entry points, both of which fail on main.

Closes #1236.

@github-actions

This comment has been minimized.

@lidavidm lidavidm added the bug-fix PRs that fix a big. label Aug 25, 2026
@lidavidm

Copy link
Copy Markdown
Member

@Arawoof06 please rebase.

@Arawoof06
Arawoof06 force-pushed the jdbc-array-slice-bounds branch from daa958c to 1b1a4f9 Compare August 25, 2026 11:11
@Arawoof06

Copy link
Copy Markdown
Contributor Author

Rebased onto main, no conflicts.

@Arawoof06
Arawoof06 force-pushed the jdbc-array-slice-bounds branch from 1b1a4f9 to 2f4a0b4 Compare October 5, 2026 21:28
@github-actions github-actions Bot added this to the 20.0.0 milestone Oct 5, 2026
@Arawoof06

Copy link
Copy Markdown
Contributor Author

Rebased onto current main. The CI runs from the August push never ran any jobs, and the new ones are waiting on workflow approval; the Test matrix passes on my fork for this commit.

@jbonofre jbonofre left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Dropping startOffset from the upper bound in checkBoundaries is the right fix. index is relative to the array's slice (the callers add startOffset afterwards), so the old bound let a slice at a non-zero offset read past its end. The new getArray(1, 3) and getResultSet(1, 3) tests cover that case.

Two older issues are out of scope here, and you may want a follow-up for them. index is treated as 0-based, although JDBC specifies 1-based. A negative count isn't validated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug-fix PRs that fix a big.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightJdbcArray.getArray(index, count) can read past the end of the array slice

3 participants