FuzzFileAction {
array: PrimitiveArray {
dtype: Primitive(
U8,
Nullable,
),
buffer: Buffer<u8> {
length: 57,
alignment: Alignment(
1,
),
as_slice: [33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, ...],
},
validity: Array(
BoolArray {
dtype: Bool(
NonNullable,
),
bits: BitBuffer {
buffer: Buffer<u8> {
length: 8,
alignment: Alignment(
1,
),
as_slice: [169, 255, 255, 255, 39, 213, 63, 0],
},
offset: 0,
len: 57,
},
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
),
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
projection_expr: None,
filter_expr: None,
compressor_strategy: Compact,
}
Fuzzing Crash Report
Analysis
Crash Location:
vortex-layout/src/sequence.rs:313(SequentialStreamAdapter::poll_next)Error Message:
Stack Trace:
Root Cause: The
SequentialStreamAdapterenforces that all chunks in a stream have the same dtype. The fuzzer discovered a case where a stream initialized for U8 (Nullable) received a chunk with U16 (NonNullable) dtype. This indicates a type inconsistency during stream processing, likely in the repartitioning or compression layer.The crash happens when writing a nullable U8 PrimitiveArray through a dict layout strategy with compact compression. The stream processing pipeline (dict → repartition → compress → buffered → chunked) appears to be transforming the dtype incorrectly.
Debug Output
Summary
file_iocrash-f34f3a6108ae41cb796a5e9d27f0f636135656f2Reproduction
Download the crash artifact:
io-fuzzing-crash-artifactsat: https://github.com/vortex-data/vortex/actions/runs/20460350217Reproduce locally:
# The artifact contains file_io/crash-f34f3a6108ae41cb796a5e9d27f0f636135656f2 cargo +nightly fuzz run -D --sanitizer=none file_io file_io/crash-f34f3a6108ae41cb796a5e9d27f0f636135656f2 -- -rss_limit_mb=0Auto-created by fuzzing workflow with Claude analysis