MuntashirAkon/AppManager · error · IllegalArgumentException

The offset can not be smaller than 0

Error message

The offset can not be smaller than 0

What it means

Thrown by TarArchiveEntry.setDataOffset when a negative data offset is supplied. The offset marks where the entry's file data begins within the tar stream; negative values are meaningless and indicate a bug in the caller or corrupt archive metadata.

Solutions

  1. Validate the offset is non-negative before calling setDataOffset
  2. Verify entry sizes/offsets computed from headers haven't overflowed (use unsigned parsing helpers)
  3. Regenerate the archive with a compliant tool if the source archive is corrupt
  4. Catch IllegalArgumentException around entry construction and surface a corrupt-archive message

Example fix

// before
entry.setDataOffset(currentPosition()); // can be -1 when stream position is unknown
// after
long pos = currentPosition();
if (pos < 0) {
    throw new IOException("invalid data offset for entry " + entry.getName());
}
entry.setDataOffset(pos);
Defensive patterns

Strategy: validation

Validate before calling

if (dataOffset < 0) { throw new IOException("Invalid negative data offset"); }
entry.setDataOffset(dataOffset);

Type guard

boolean isValidOffset(long offset) { return offset >= 0; }

Try / catch

try {
    entry.setDataOffset(offset);
} catch (IllegalArgumentException e) {
    throw new IOException("Corrupt archive: negative data offset", e);
}

Prevention

When it happens

Trigger: Calling setDataOffset(long) with a negative value — typically when archive metadata (entry sizes, header offsets) is computed from corrupt or maliciously modified tar data.

Common situations: Streaming archives where byte offsets are accumulated from header fields that overflowed or were misparsed; custom archive readers built on top of this library.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of MuntashirAkon/AppManager@0152f468fc (2026-09-12). Data as JSON: /api/errors/de6277b578af15fc. Report an issue: GitHub.

Appendix: source

Thrown at app/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java:1185

    /**
     * {@inheritDoc}
     *
     * @since 1.21
     */
    @Override
    public long getDataOffset() {
        return dataOffset;
    }

    /**
     * Set the offset of the data for the tar entry.
     *
     * @param dataOffset the position of the data in the tar.
     * @since 1.21
     */
    public void setDataOffset(final long dataOffset) {
        if (dataOffset < 0) {
            throw new IllegalArgumentException("The offset can not be smaller than 0");
        }
        this.dataOffset = dataOffset;
    }

    /**
     * {@inheritDoc}
     *
     * @since 1.21
     */
    @Override
    public boolean isStreamContiguous() {
        return true;
    }

    /**
     * get extra PAX Headers
     *
     * @return read-only map containing any extra PAX Headers

View on GitHub (pinned to 0152f468fc)