H5Z__filter_fletcher32 subtracts 4 from a chunk size value derived from parsed file metadata without validating that the size is at least 4 bytes. This integer underflow triggers when a crafted HDF5 file declares a Fletcher32-compressed chunk smaller than the 4-byte checksum itself — a condition the file parser never validates because no filter-specific contract exists. The immediate fix is trivial: add if (size < 4) return FAIL; at the filter's entry point. Apply this patch.
But patching only this filter is insufficient. The deeper problem is architectural: the HDF5 filter API hands every loaded filter an unchecked size field from the chunk parser, and there is no standardized mechanism for filters to declare or validate size preconditions. Fletcher32 is the fourth or fifth filter in HDF5's history with this exact vulnerability — shuffle had it in 2018, scale-offset has had comparable issues. Each time, a one-line guard closes the CVE and the pattern resets. This is whack-a-mole by design, not carelessness.
The MEDIUM severity classification compounds the problem. CVSS 6.8 treats this as a high-assurance vulnerability requiring a crafted file, but HDF5 files circulate in scientific repositories, package distributions, and cross-institution collaborations where origin is opaque. The blast radius extends beyond the single crash: an out-of-bounds read can corrupt chunk cache state, poison subsequent reads of adjacent chunks, or feed corrupted data to workflows that don't checksum outputs. In MPI-IO and HPC contexts, this becomes a data integrity failure, not just a crash.
Your actions: patch H5Zfilter_fletcher32 immediately, then audit every other filter in your deployment for identical unchecked size arithmetic. Treat any filter receiving raw chunk_size from the parser as suspect. If you maintain third-party HDF5 filters, add size guards defensively — the API will not do it for you. The structural fix (filter contract validation at H5Zapply invocation) requires upstream library changes, but your defensive posture does not wait for that.