fix(format): read version-1 shared message addresses after the heap offset
A version-1 shared message (HDF5 1.6) embeds the target as a symbol-table entry: after six reserved bytes comes a length-sized local-heap offset, then the object header address. We read the heap offset as the address, so datasets using a committed datatype in 1.6-era files (tcompound.h5, tcompound2.h5) failed with InvalidObjectHeaderVersion. parse_shared_ref now takes length_size and skips the offset, as libhdf5 does. Resolving a reference also no longer falls back to the first message of any type in the target header: a missing target message is SharedMessageTargetMissing instead of garbage. Fixture: tcompound.h5 from libhdf5's tools/test/testfiles (8 KiB). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
@@ -273,6 +273,15 @@
|
||||
- CI keeps zlib-ng building and tested; the arm64 job no longer needs cmake.
|
||||
|
||||
### Correctness
|
||||
- `clawhdf5-format` reader: version-1 shared messages (HDF5 1.6-era files,
|
||||
e.g. a dataset using a committed datatype in libhdf5's `tcompound.h5`)
|
||||
read the heap-offset field of the embedded symbol-table entry as the
|
||||
target address and failed with `InvalidObjectHeaderVersion`. The address
|
||||
is now read after it, as libhdf5 does. **Breaking (format crate):**
|
||||
`shared_message::parse_shared_ref` takes `length_size`. A reference whose
|
||||
target header has no message of the referenced type is now
|
||||
`FormatError::SharedMessageTargetMissing` instead of returning the first
|
||||
other message found there (which decoded as garbage).
|
||||
- `clawhdf5-format` reader: array members of version-1 compound datatypes
|
||||
(HDF5 1.6-era files, e.g. libhdf5's `tcompound.h5`) were read as a single
|
||||
element: a `[4] i32` member came back as one `i32`, with the wrong size.
|
||||
|
||||
Reference in New Issue
Block a user