fix(format): a VL element at the undefined heap address is an error
libhdf5 fails to read a VL element whose global heap address is
undefined (all 0xff), even at length 0 ("addr undefined"); we returned
"" (or an empty sequence) in every reader. Checked with h5py first:
libhdf5 writes a null element with address 0, which still reads as
empty, and h5py writes "" as a zero-size heap object at a real address,
so no file they write relies on the old behaviour. read_vl_bytes now
treats address 0 as null whatever the length, as VlResolver does.
Tests, each failing before: vl_data unit test (8- and 4-byte offsets,
lengths 0 and 1); clawhdf5 vl_data_interop
a_vl_element_at_the_undefined_heap_address_fails_like_h5py (also checks
where h5py writes ""); h5rs dump --json and check --data on the patched
`undef` dataset; clawhdf5-wasm vl_strings.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
@@ -77,6 +77,16 @@
|
||||
`crates/clawhdf5-wasm/tests/vl_strings.rs`). New
|
||||
`VlResolver::element` / `string_element` resolve one element in place.
|
||||
|
||||
- **A VL element at the undefined heap address is an error**, as in
|
||||
libhdf5 ("addr undefined"). One of length 0 read as `""` in every reader
|
||||
(`File`, `h5rs`, `clawhdf5-wasm`, `read_vl_strings`, `read_vl_bytes`).
|
||||
libhdf5 writes a null element with heap address 0, which still reads as
|
||||
empty, and h5py writes `""` as a zero-size heap object at a real address,
|
||||
so no file libhdf5 or h5py writes is affected
|
||||
(`a_vl_element_at_the_undefined_heap_address_fails_like_h5py` in
|
||||
`crates/clawhdf5/tests/vl_data_interop.rs`). `read_vl_bytes` now also
|
||||
treats address 0 as null whatever the length, as `VlResolver` does.
|
||||
|
||||
### Plugin filters (2026-09-26)
|
||||
- **LZF, bitshuffle, bzip2 and Blosc read and write, in pure Rust.** Files
|
||||
written by h5py with `compression="lzf"`, or with hdf5plugin's
|
||||
|
||||
Reference in New Issue
Block a user