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

  1. Check the current position (`seek('cur', 0)`) before applying a relative offset and clamp n so `pos + n >= 0`
  2. Use `SeekFrom::Start(n)` with an absolute, validated offset instead of a relative Current seek
  3. Fix the logic that computes the delta; negative seeks below position 0 are invalid
  4. 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

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


AI-assisted analysis of sxyazi/yazi@5f901b886b (2026-09-02). Data as JSON: /api/errors/7c56a2bb81440098. Report an issue: GitHub.