Skip to content

Conversation

@oliverchang
Copy link

A malformed HDF5 file could trigger an out-of-bounds read in HDF5's H5HG_read. This occurred when the COMPOUND_RECORD_DEFINITION attribute's physical storage size did not match the product of the number of fields and the datatype size (e.g., 360 bytes stored for 15 elements of 16 bytes each).

The resulting incorrect stride caused HDF5 to interpret garbage data as Global Heap IDs for Variable Length (VL) strings. Dereferencing these invalid IDs led to the overflow.

Validation has been added to ensure attribute.getStorageSize() == numFields * attrDataType.getSize() before calling attribute.read(). If a mismatch is detected, an InvalidValueSize exception is thrown. This is caught in BAG::Dataset::readDataset, allowing the application to safely skip the malformed layer.

Fixes: #141

A malformed HDF5 file could trigger an out-of-bounds read in HDF5's
`H5HG_read`. This occurred when the `COMPOUND_RECORD_DEFINITION`
attribute's physical storage size did not match the product of the
number of fields and the datatype size (e.g., 360 bytes stored for 15
elements of 16 bytes each).

The resulting incorrect stride caused HDF5 to interpret garbage data as
Global Heap IDs for Variable Length (VL) strings. Dereferencing these
invalid IDs led to the overflow.

Validation has been added to ensure `attribute.getStorageSize() ==
numFields * attrDataType.getSize()` before calling `attribute.read()`.
If a mismatch is detected, an `InvalidValueSize` exception is thrown.
This is caught in `BAG::Dataset::readDataset`, allowing the application
to safely skip the malformed layer.

Co-authored-by: CodeMender <codemender-patching@google.com>
Fixes: OpenNavigationSurface#141
@selimnairb
Copy link
Collaborator

@oliverchang Thanks for submitting this PR. It looks like this is causing some tests to now fail. Can you address that? Thanks.


const auto attrDataType = attribute.getDataType();
if (attribute.getStorageSize() != numFields * attrDataType.getSize())
throw InvalidValueSize{};
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use curly braces, even for a single-line if statement, or place on a single line (yes, I know, other parts of the codebase don't do this, but I want to make sure new code does).

@selimnairb selimnairb self-assigned this Feb 10, 2026
@oliverchang
Copy link
Author

Thank you! It looks like I'm having a fair bit of trouble getting tests running properly though (pre-existing failures with and without ASan).. so it might take a while..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

oss-fuzz: Issue 471587333 opennavsurf-bag:bag_read_fuzzer: Heap-buffer-overflow in H5HG_read

2 participants