Revision control

Copy as Markdown

Other Tools

/* Copyright 2026 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//! Logical offsets into the input wasm file are strictly limited to fit into
//! an integer of type [u64]. Data in each chunk is addressed through an offset
//! into an `[u8]` slice, which uses `usize`-addressing.
//!
//! This module contains functionality to bridge the gap.
// An (not necessarily exhaustive) list of properties we use of `u64` in relation
// to usize:
// - u64::MAX as an upper bound and sometimes invalid offset
// - 0u64 as the starting offset
// - we can add and subtract small offsets to recalculate the original position
// in some error paths, where saving the position directly would clutter registers.
// An memory offset into some chunk of bytes occurs at some specified logical
// offset in the file. We currently use `usize` to represent memory offsets.
// TODO: on platforms where usize::BITS > u64::BITS (currently almost no-where),
// we could use u64 directly instead of usize to represent memory offsets.
use crate::Error;
/// Return the largest memory offset that can be added to `offset` without going
/// past `max_offset` or overflowing.
pub fn max_data_len(offset: u64, max_offset: u64) -> usize {
let mut max_logical = max_offset - offset;
if u64::BITS > usize::BITS {
max_logical = max_logical.min(usize::MAX as u64)
}
// we now know that max_logical fits into a usize
max_logical as usize
}
#[cold]
pub fn panic_too_many_bytes(offset: u64, len: usize, max_len: usize) -> ! {
panic!(
"Content too large to parse. Got {len}, expected at most {max_len} bytes at offset 0x{offset:x}."
)
}
pub fn err_too_many_bytes(offset: u64, len: usize, max_len: usize) -> Error {
format_err!(
offset,
"Content too large to parse. Got {len}, expected at most {max_len} bytes."
)
}