sxyazi/yazi · error · io::Error
InvalidInput
InvalidInput
Error message
seek overflow
What it means
This error is raised by the Lua file handle's seek implementation when computing a new absolute position from `SeekFrom::Current(n)` overflows (or underflows) the internal position counter via `checked_add_signed`. The seek is rejected before any I/O so the handle's position is never left in an invalid state. It means the requested relative offset is nonsensical for the current position.
Source
Thrown at yazi-vfs/src/engine/lua/file.rs:147
me.pos = me.pos.checked_add(n as u64).expect("offset overflow");
}))
}
}
impl AsyncSeek for File {
fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> io::Result<()> {
let me = self.get_mut();
if me.pending_seek.is_some() {
return Err(io::Error::other("call poll_complete before start_seek"));
}
me.pending_seek = Some(match position {
SeekFrom::Start(n) => SeekState::NonBlocking(n),
SeekFrom::Current(n) => me
.pos
.checked_add_signed(n)
.map(SeekState::NonBlocking)
.ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "seek overflow"))?,
SeekFrom::End(n) => {
let service = me.service;
let job = ProvideJob::Metadata { url: me.url.clone() };
SeekState::Blocking(
n,
Box::pin(async move { Ok(RUNNER.provide::<Cha>(service, job).await.0?.len) }),
)
}
});
Ok(())
}
fn poll_complete(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>> {
let me = self.get_mut();
let Some(state) = &mut me.pending_seek else {
return Poll::Ready(Ok(me.pos));
};View on GitHub (pinned to 5f901b886b)
Solutions
- Check the current position (`seek('cur', 0)`) before applying a relative offset and clamp n so `pos + n >= 0`
- Use `SeekFrom::Start(n)` with an absolute, validated offset instead of a relative Current seek
- Fix the logic that computes the delta; negative seeks below position 0 are invalid
- Catch the io::Error with ErrorKind::InvalidInput and surface a clear message to the user
Example fix
-- before
file:seek('cur', -huge_offset) -- underflows
-- after
local pos = file:seek('cur', 0)
local delta = math.min(huge_offset, pos)
file:seek('cur', -delta) Defensive patterns
Strategy: validation
Validate before calling
local pos = file:seek('cur', 0)
assert(pos + delta >= 0, 'seek underflow: delta too negative for pos '..pos) Try / catch
local ok, err = pcall(function() return file:seek('cur', delta) end)
if not ok then
-- err: seek overflow (InvalidInput)
file:seek('set', 0) -- reset to a known-good position
end Prevention
- Prefer absolute seeks (SeekFrom::Start) over relative Current seeks with computed deltas
- Read the current position with seek('cur', 0) before applying relative offsets
- Clamp computed offsets against file size and current position
- Validate delta sources (chunk sizes, metadata) before using them as seek offsets
When it happens
Trigger: Calling `file:seek('cur', n)` from Lua (or `Seek(SeekFrom::Current(n))` on the handle) where `pos + n` overflows i64/u64 — e.g. a huge positive offset past the file end or a negative offset larger than the current position that underflows below 0.
Common situations: Scripts computing offsets from untrusted/erroneous data (bad chunk sizes, corrupt metadata), seeking backwards with a negative delta larger than the current position, or off-by-one loops that keep advancing a cursor indefinitely.
Related errors
- NotFound
- Not a custom VFS URL: {url:?}
- either name or interactive must be specified in TabRenameFor
- unknown error kind: {s}
- unknown image format
AI-assisted analysis of sxyazi/yazi@5f901b886b (2026-09-02).
Data as JSON: /api/errors/7c56a2bb81440098.
Report an issue: GitHub.