You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "mbutrovich (via GitHub)" <gi...@apache.org> on 2026/05/28 17:21:47 UTC
[I] `from_ffi` realignment is bypassed under `force_validate` [arrow-rs]
mbutrovich opened a new issue, #10034:
URL: https://github.com/apache/arrow-rs/issues/10034
Follow-up to #10030 / #10028.
## Describe the bug
`arrow::ffi::from_ffi` and `from_ffi_and_data_type` call `data.align_buffers()` after `ImportedArrowArray::consume()` to realign protocol-legal but under-aligned C Data Interface buffers (e.g. 8-byte-aligned `Decimal128` from a JVM producer). Under `cfg(feature = "force_validate")` this realignment is unreachable: `consume()` constructs `ArrayData` via `ArrayData::new_unchecked`, which goes through `ArrayDataBuilder::build`. That builder runs `validate_data()` whenever `force_validate` is enabled, regardless of `skip_validation`:
```rust
// arrow-data/src/data.rs:2195
if !skip_validation.get() || cfg!(feature = "force_validate") {
data.validate_data()?;
}
```
`validate()` rejects misaligned `BufferSpec::FixedWidth` buffers (`arrow-data/src/data.rs:842-867`), so `consume()?` returns `InvalidArgumentError` before `from_ffi`'s `align_buffers()` runs. The same applies recursively through `consume_children` / `consume_child`.
The new regression test added in #10030 (`test_decimal128_under_aligned_round_trip`) is gated `#[cfg(not(feature = "force_validate"))]`, so CI under that feature does not surface the gap.
This is not a regression introduced by #10030 — prior to that PR, `force_validate` builds also returned an error rather than panicking. But the inline comment "a no-op when buffers are already aligned" reads as if alignment is handled in all builds, which is misleading.
## To Reproduce
Build with `--features force_validate` and run the round-trip with an 8-byte-aligned-but-not-16-byte-aligned `Decimal128` buffer through `from_ffi`. `consume()` returns `InvalidArgumentError` before realignment can run.
## Expected behavior
`from_ffi` accepts spec-conformant C Data Interface input regardless of `force_validate`. 8-byte alignment is legal over the C Data Interface; it only becomes an arrow-rs `ArrayData` invariant violation after import. Today the order is "validate, then realign", which treats protocol-legal input as an invariant violation. The correct order on the import boundary is "realign, then validate".
## Proposed fix
Push alignment into `ImportedArrowArray::consume` (and recursively through `consume_child`) by replacing `ArrayData::new_unchecked` with the builder form:
```rust
ArrayDataBuilder::new(self.data_type)
.len(len)
.offset(offset)
.null_count(null_count)
.null_bit_buffer(null_bit_buffer)
.buffers(buffers)
.child_data(child_data)
.align_buffers(true)
.skip_validation(true)
.build()?
```
`ArrayDataBuilder::build` runs `align_buffers` before `validate_data` (`arrow-data/src/data.rs:2190-2197`), so this works correctly under `force_validate` while preserving the existing intent of skipping FFI validation on the hot path.
Then:
- Drop the now-redundant outer `data.align_buffers()` calls in `from_ffi` / `from_ffi_and_data_type` to avoid a duplicate recursive scan.
- Remove the `#[cfg(not(feature = "force_validate"))]` gate on `test_decimal128_under_aligned_round_trip` so the case is covered under that feature too.
It would also be worth tightening the doc on `ArrayData::align_buffers` to note that on import boundaries it must be called *before* validation; the current doc only says it's "useful when interacting with buffers produced by other systems" without addressing ordering.
## Additional context
Raised in review of #10030: https://github.com/apache/arrow-rs/pull/10030#pullrequestreview-4383084253
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] `from_ffi` realignment is bypassed under `force_validate` [arrow-rs]
Posted by "bit2swaz (via GitHub)" <gi...@apache.org>.
bit2swaz commented on issue #10034:
URL: https://github.com/apache/arrow-rs/issues/10034#issuecomment-5381541318
im taking this. ill push the align into `consume()`'s builder so it runs before the `force_validate`-gated validate (same as the ipc reader) and drop the now-redundant outer `align_buffers()`. brb
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] `from_ffi` realignment is bypassed under `force_validate` [arrow-rs]
Posted by "Jefffrey (via GitHub)" <gi...@apache.org>.
Jefffrey closed issue #10034: `from_ffi` realignment is bypassed under `force_validate`
URL: https://github.com/apache/arrow-rs/issues/10034
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org