FuzzFileAction {
array: ListViewArray {
dtype: List(
List(
Utf8(
Nullable,
),
Nullable,
),
Nullable,
),
elements: ListViewArray {
dtype: List(
Utf8(
Nullable,
),
Nullable,
),
elements: VarBinViewArray {
dtype: Utf8(
Nullable,
),
buffers: [],
views: Buffer<vortex_vector::binaryview::view::BinaryView> {
length: 0,
alignment: Alignment(
16,
),
as_slice: [],
},
validity: AllValid,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
offsets: PrimitiveArray {
dtype: Primitive(
U64,
NonNullable,
),
buffer: BufferHandle(
Host(
Buffer<u8> {
length: 0,
alignment: Alignment(
8,
),
as_slice: [],
},
),
),
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [
(
IsSorted,
Exact(
ScalarValue(
Bool(
true,
),
),
),
),
],
},
},
},
},
sizes: PrimitiveArray {
dtype: Primitive(
U64,
NonNullable,
),
buffer: BufferHandle(
Host(
Buffer<u8> {
length: 0,
alignment: Alignment(
8,
),
as_slice: [],
},
),
),
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
is_zero_copy_to_list: true,
validity: AllValid,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
offsets: PrimitiveArray {
dtype: Primitive(
I32,
NonNullable,
),
buffer: BufferHandle(
Host(
Buffer<u8> {
length: 8,
alignment: Alignment(
4,
),
as_slice: [0, 0, 0, 0, 0, 0, 0, 0],
},
),
),
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [
(
IsSorted,
Exact(
ScalarValue(
Bool(
true,
),
),
),
),
],
},
},
},
},
sizes: PrimitiveArray {
dtype: Primitive(
I32,
NonNullable,
),
buffer: BufferHandle(
Host(
Buffer<u8> {
length: 8,
alignment: Alignment(
4,
),
as_slice: [0, 0, 0, 0, 0, 0, 0, 0],
},
),
),
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
is_zero_copy_to_list: true,
validity: AllValid,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
projection_expr: None,
filter_expr: None,
compressor_strategy: Compact,
}
Fuzzing Crash Report
Analysis
Crash Location:
vortex-array/src/arrow/executor/list.rs:122in thelist_view_zctlfunctionError Message:
Stack Trace:
Root Cause:
The fuzzer discovered an integer overflow panic in the Arrow executor when converting a nested ListViewArray to an Arrow array. The crash occurs at line 122 in
list_view_zctl:When
sizes.len()is 0, the expressionsizes.len() - 1causes an integer underflow panic in debug/fuzz builds.The crash path:
List(List(Utf8))structure with empty arrays is createdlist_view_zctllist_view_zctlsizesarray (length 0)sizes.len() - 1whenlen() == 0causes integer overflowThe debug output shows the structure:
This indicates a valid edge case where nested empty lists should be handled, but the current code assumes
sizes.len() >= 1.Debug Output
Summary
file_iocrash-f59d24f0d4e13cdb621ff55a229aa3153a9eaeb0Reproduction
Download the crash artifact:
$ARTIFACT_NAMEat: $WORKFLOW_RUNReproduce locally:
# The artifact contains file_io/crash-f59d24f0d4e13cdb621ff55a229aa3153a9eaeb0 cargo +nightly fuzz run -D --sanitizer=none file_io file_io/crash-f59d24f0d4e13cdb621ff55a229aa3153a9eaeb0 -- -rss_limit_mb=0Auto-created by fuzzing workflow with Claude analysis