fix(format): locate the address in version-1 shared messages
A version-1 shared message reference is version, type, six reserved bytes and then an old-style symbol table entry: link-name offset (length size), object header address, cache type, reserved, scratch. We read the address straight after the reserved bytes, i.e. the link-name offset, and the committed datatype lookup failed with InvalidObjectHeaderVersion (the bytes checked in tcompound.h5: name offset 0x10, then 0x590 = /type1). Datasets of 1.4/1.6-era files that use a committed datatype were unreadable. Skip the name offset. parse_shared_ref has no length size, so add parse_shared_ref_sized and use it in every internal caller; parse_shared_ref keeps its signature and assumes length size == offset size. The old parse_v1_ref unit test encoded the wrong layout and now uses the real bytes. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
@@ -305,6 +305,14 @@
|
||||
the member's offset; they are now array members, as in libhdf5
|
||||
(`tarrold.h5`, `tcompound.h5`). Only reachable once layout versions 1/2
|
||||
were readable, since the files that use it are that old.
|
||||
- `clawhdf5-format` reader — errors on valid files: a version-1 shared
|
||||
message (a committed datatype in HDF5 1.4/1.6-era files) was read as if the
|
||||
object header address followed the reserved bytes; it follows a link-name
|
||||
offset (the reference is an old-style symbol table entry), so the reader
|
||||
followed the name offset and failed with `InvalidObjectHeaderVersion`
|
||||
(`tcompound.h5`). New `shared_message::parse_shared_ref_sized` takes the
|
||||
superblock's length size; `parse_shared_ref` assumes it equals the offset
|
||||
size.
|
||||
- `clawhdf5-format` reader — errors on valid files: enum and bool datasets
|
||||
through the numeric readers; the "don't filter partial edge chunks" layout
|
||||
flag; Fletcher32 ahead of deflate (NetCDF-4's order). Unknown-message flags
|
||||
|
||||
Reference in New Issue
Block a user