Releases: oschwald/maxminddb-rust
Releases · oschwald/maxminddb-rust
Release list
0.30.0
- Added
deserialize_any_with_raw_strings()for Serde-based format adapters
to validate MMDB strings while constructing another runtime's native string
type, avoiding duplicate UTF-8 validation without unsafe Rust. Adapters
remain responsible for strict UTF-8 validation. - Fixed network iteration on cyclic or over-deep corrupt search trees so it
returns an error instead of looping indefinitely. - Fixed
decode_path()error rendering for extreme negative indexes and
reduced path traversal header parsing. - Removed decoder logging checks from hot deserialization paths.
- Fixed
verify()to validate shared data-section pointer targets once, reject
pointer cycles, invalid scalar encodings, and impossible container sizes.
0.29.0
- Breaking:
Metadata::build_time()now returns
Result<SystemTime, MaxMindDbError>instead of panicking on
unrepresentable timestamps, and databases whosebuild_epochcannot be
represented asSystemTimeare rejected as invalid during open and verify. - Breaking:
Reader::metadatais now private. UseReader::metadata()to
access validated metadata by shared reference. - Breaking: Opening a database now rejects unsupported major format versions,
unsupported IP versions, and zero-node search trees. Minor format versions
are still accepted for forward compatibility. - Fixed:
within()andnetworks()now handle IPv6 databases without an
IPv4 subtree without reading terminal data nodes as tree nodes or
panicking while formatting low IPv6 networks. - Fixed: Skipping ignored or unknown fields now enforces data-section
bounds and the maximum nesting depth instead of accepting truncated
values or overflowing the stack on deeply nested corrupt data. - Internal: Added focused benchmarks for network iteration and serde
unknown-field skipping, plus metadata build-time conversion, to guard
performance-sensitive fixes. - Documentation: Fixed intra-doc links so docs build with warnings denied,
and added a CI check to keep them passing.
0.28.1
- Fixed: Databases with an impossible declared search tree size are now
rejected during open/verify instead of causing runaway allocation
during validation. - Fixed:
within()now rejects IPv6 CIDRs on IPv4-only databases instead
of yielding unrelated networks. - Fixed: Verification now rejects truncated scalar/string payloads instead
of skipping past them and reporting the database as valid. - Fixed:
LookupResult::network()now uses the reader's measured IPv4
subtree depth instead of assuming it always begins at bit 96.
0.28.0
- Performance improvement: Faster search-tree traversal by dispatching
on the database's record size to monomorphized node readers, replacing
per-step branching on the record size. - Performance improvement: Direct deserialization of scalars, sequences,
maps, and structs through dedicated fast paths instead of routing
throughdeserialize_any. - Performance improvement: IPv4 and IPv6 lookups dispatch to dedicated
paths, avoiding per-call address-kind checks on the hot path. - Behavior change: Deserializing a database array into a tuple or
tuple struct now returns a decoding error when the lengths do not
match. Previously the mismatch was silently ignored. - Fixed: A corrupt data pointer that would underflow during resolution
now returns anInvalidDatabaseerror instead of panicking.
0.27.3
0.27.2
- Performance improvement: Faster lookups and record decoding in common paths,
including control-byte header parsing and integer decoding. - Performance improvement: Faster string decoding for ASCII-only values by
using a dedicated ASCII fast path. - Performance improvement: Reduced release-build overhead by compiling out
debug/trace logging calls. - Fixed: Truncated or corrupt data in control-byte headers now returns a
decoding error instead of panicking.
0.27.1
- Performance improvement: Skipped UTF-8 validation for map keys during
deserialization. This significantly speeds up full record decoding by
treating keys as raw bytes when matching against struct fields. - Performance improvement: Optimized tree traversal by reducing bounds checks
during node reading.
0.27.0
This release includes significant API changes. See UPGRADING.md
for migration guidance.
Breaking Changes
Lookup API
lookup()now returnsLookupResultinstead ofOption<T>. The new API
enables lazy decoding - data is only deserialized when explicitly requested.lookup_prefix()has been removed. Uselookup(ip)?.network()instead.
Iteration API
within()now requires a secondWithinOptionsparameter. Use
Default::default()for the previous behavior.Withiniterator now yieldsLookupResultinstead ofWithinItem<T>.
GeoIP2 Structs
- The
namesfields now use aNamesstruct instead ofBTreeMap<&str, &str>.
Access names directly via language fields (e.g.,names.english). - Nested struct fields (
city,country,location, etc.) are now
non-optional withDefault, simplifying access patterns. - Removed
is_anonymous_proxyandis_satellite_providerfromTraits.
These fields are no longer present in MaxMind databases.
Error Types
InvalidDatabaseandDecodingvariants now use structured fields instead
of a single string. Pattern matching must be updated.- New
InvalidInputvariant for user input errors (e.g., IPv6 lookup in
IPv4-only database).
Memory Mapping
Reader::open_mmapis nowunsafe. The caller must ensure the database
file is not modified or truncated while theReaderexists. This fixes a
soundness issue. Reported by paolobarbolini. GitHub #86.
Added
LookupResulttype with lazy decoding support:has_data()- Check if data exists for this IPnetwork()- Get the network containing the IPoffset()- Get data offset for caching/deduplicationdecode()- Deserialize full recorddecode_path()- Selectively decode specific fields by path
PathElementenum andpath!macro for navigating nested structures.WithinOptionsto control network iteration behavior:include_aliased_networks()- Include IPv4 via IPv6 aliasesinclude_networks_without_data()- Include networks without data recordsskip_empty_values()- Skip empty maps/arrays
networks()method for iterating over all networks in the database.verify()method for comprehensive database validation.Metadata::build_time()to convertbuild_epochtoSystemTime.PartialEqandEqimplementations forMetadataandWithinOptions.
Changed
- Error messages now include byte offsets when available.
decode_path()errors include path context showing where navigation failed.- Added recursion depth limit (512) matching libmaxminddb and Go reader.
- Serde deserializer improvements: size hints,
is_human_readable()returns
false,deserialize_ignored_any, anddeserialize_enumsupport. MaxMindDbErroris now#[non_exhaustive].
0.26.0
- BREAKING CHANGE: The
lookupandlookup_prefixmethods now return
Ok(None)orOk((None, prefix_len))respectively when an IP address is
valid but not found in the database (or has no associated data record),
instead of returning anErr(MaxMindDbError::AddressNotFoundError).
Code previously matching onAddressNotFoundErrormust be updated to
handle theOk(None)/Ok((None, prefix_len))variants. - BREAKING CHANGE: The
MaxMindDBErrorenum has been renamed
MaxMindDbErrorand variants have been renamed and refactored. For
example,IoErroris nowIo,InvalidDatabaseErroris now
InvalidDatabase,DecodingErroris nowDecoding,
InvalidNetworkErroris nowInvalidNetwork. TheMapErrorvariant has
been replaced byMmap(under themmapfeature flag). Code explicitly
matching on the old variant names must be updated. - BREAKING CHANGE:
MaxMindDbErrorno longer implementsPartialEq.
This is because underlying error types likestd::io::Error(now
wrapped by theIoandMmapvariants) do not implementPartialEq.
Code comparing errors directly using==orassert_eq!must be
updated, typically by usingmatches!or by matching on the error
kind and potentially its contents. - Refactored
MaxMindDbErrorhandling using thethiserrorcrate.
Variants likeIo,Mmap, andInvalidNetworknow directly wrap
the underlying error types (std::io::Error,ipnetwork::IpNetworkError). - Errors wrapping underlying types (
Io,Mmap,InvalidNetwork) now
correctly implementstd::error::Error::source(), allowing inspection
of the original cause. - The
Displayimplementation forMaxMindDbErrorhas been refined to
generally show only the specific error details, often including the
message from the source error, rather than prefixing with the variant
name. lookup_prefixnow returns the prefix length of the entry even when the
value is not found.- Fixed an internal bounds checking error when resolving data pointers.
The previous logic could cause a panic on a corrupt database.
0.25.0
- Serde will now skip serialization of the GeoIP2 struct fields
whenOptionis none. Pull request by Stefan Sundin. GitHub #79. SerializeandClonewere added to theMetadatastruct. Pull
request by Stefan Sundin. GitHub #80.- Added feature to use
simdutf8as a faster alternative when
unsafe-str-decodeis too risky. Pull request by Jakub Onderka.
GitHub #88. - Minor internal refactoring and performance improvements.