Skip to content

[Python][Parquet] Comparing metadata or schemas with None can crash Python #53500

Open

Description

@Mola-maker

Describe the bug

Parquet metadata and schema equality can terminate the Python interpreter when the other operand is None. For example, checking metadata.row_group(0).column(0).statistics == None causes SIGSEGV instead of returning False.

The equals() methods accept a typed Cython object without rejecting None, then access its native pointer. FileMetaData.equals() already uses other not None; the other five metadata/schema classes do not.

Reproducer

Run in an isolated Python process:

import pyarrow as pa
import pyarrow.parquet as pq

sink = pa.BufferOutputStream()
pq.write_table(pa.table({"value": [1, 2, 3]}), sink)
metadata = pq.read_metadata(pa.BufferReader(sink.getvalue()))
statistics = metadata.row_group(0).column(0).statistics
print(statistics == None)  # process exits with SIGSEGV

The same result occurs with .equals(None), row-group metadata, column-chunk metadata, and column schemas. On Arch Linux / CPython 3.14.8, ParquetSchema comparison also crashes. On Ubuntu / CPython 3.12.14 it happens to return False. This was reproduced with PyArrow 26.0.0 and with the current main _parquet extension built from source at 9b34c4a6a8856212b885f6a1e934795af04f3192 against the matching 26.0.0 SDK.

Expected: normal equality with None returns False; explicit .equals(None) rejects the invalid argument with TypeError, consistently with FileMetaData.

Existing work checked

Open PRs #51161 and #51163 change other Parquet entry points (constructors, sorting, binary types). Their current patches do not change these five equals() methods. Searches for metadata/schema/statistics comparison and None-related open PRs found no overlapping fix.

Component(s)

Python, Parquet

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions