fix: apply the superblock extension and cache image in every opener
File, MmapFile and LazyFile decoded the superblock extension and laid a metadata cache image over the file's metadata; the other readers did not, so the same file read differently by entry point: NativeVol, AsyncHDF5File and MpiVol (clawhdf5-io) and the external source files of a virtual dataset (clawhdf5-format vds.rs) read a file with an image from its own bytes, which libhdf5 does not (they may be stale, or zeros: h5clear_mdc_image.h5 failed with InvalidObjectHeaderVersion(0)), and skipped the extension checks File::open makes (cve-2020-10810/10812). Each of them owns its buffer, so each now calls the shared superblock_ext::apply_cache_image_in_place, which checks the extension and writes the image's entries in place (only the image block is copied). These readers read whole datasets and cannot open a file and fail each object, so an image libhdf5 cannot load is refused with the image's error, never read around. clawhdf5-io's vol::load_hdf5 wraps it for NativeVol (at open; for from_bytes the error is reported on read, as a truncated file already was) and MpiVol. The MpiVol edit is minimal and was not compiled: the mpi-io feature needs an MPI installation this machine does not have (mpi-sys's build script panics). Tests: NativeVol (open_path and from_bytes), AsyncHDF5File and a VDS whose source file is h5clear_mdc_image.h5 (vds_interop.rs, against h5py) read the fixture's values; the corrupted-image variants are refused. Each fails without its fix. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
@@ -34,6 +34,18 @@ ZFP filters; the 2 mismatches are the known h5py big-endian VL bug.
|
||||
files as agreeing with h5py that the library did not open; probe and
|
||||
library now take the decision from the same
|
||||
`superblock_ext::cache_image_state`.
|
||||
- **Every other opener applies the superblock extension and the cache
|
||||
image too** (`superblock_ext::apply_cache_image_in_place`, writing into
|
||||
the buffer each already owns): `clawhdf5_io`'s `NativeVol` (at `open`,
|
||||
and on read for `from_bytes`), `AsyncHDF5File`, `MpiVol` (a minimal edit
|
||||
through the same `vol::load_hdf5`; the `mpi-io` feature cannot be built
|
||||
without an MPI installation, so it was not compiled), and the external
|
||||
source files of a virtual dataset. They read a file with an image from
|
||||
its own bytes — stale metadata, or none (`h5clear_mdc_image.h5` failed
|
||||
with `InvalidObjectHeaderVersion(0)`) — and skipped the extension checks
|
||||
`File::open` makes. These readers cannot open a file and fail each
|
||||
object, so an image libhdf5 cannot load is refused with the image's
|
||||
error.
|
||||
- **The superblock extension is decoded at open, as libhdf5 does:** a File
|
||||
Space Info or Metadata Cache Image message libhdf5 cannot decode makes the
|
||||
open fail (`cve-2020-10810`, `cve-2020-10812` were opened).
|
||||
|
||||
Reference in New Issue
Block a user