0.3.5 - 2026-08-26
Release Notes
Security
-
slipcase unpackno longer launders where a container came from. A
container downloaded from the internet is marked as such by the platform that
downloaded it —com.apple.quarantineon macOS, aZone.Identifierstream on
Windows,user.xdg.origin.urlon Linux — and all three are properties of the
file rather than of its contents. The payload written out of it carried none
of them, so whatever opened that payload next saw a file this machine made and
the warning the container would have raised never appeared. That has been true
since 0.1.0.provenance::carry, behind the newprovenancefeature, moves the mark
across, andunpackcalls it. It fails only where the platform gates opening
on a mark, the source carries one, and the copy ends up carrying none — so for
a caller about to hand a payload to the system, an error means do not open it.
Whereunpackmeets that failure it removes the payload rather than leaving
one that opens without the warning its origin earned. A container read from
standard input has no source to read a mark from and is unpacked without one.Linux is a note rather than a gate: nothing there consults the attribute
before opening a file, andMark::Notedis a separate answer so that nothing
reads one as the other.
Fixed
-
A payload named for a Windows device now extracts as a file. SPEC 2.3
acceptsCON,COM1,AUX,LPT1,PRNandNUL, and the conformance
corpus carries a case for one, but Win32 resolves those names to devices
wherever they appear.dest.join(payload_name())was therefore not a path in
that directory — it was the console. WritingCONreturned success at every
step and left no file, and reading it back never returned at all, so
slipcase unpackon such a container hung rather than failing.payload_pathaskscanonicalizeof the directory and joins the name onto
the answer, which reaches the filesystem without those names being looked for.
Nothing holds a list of reserved names: which names are devices stays
Windows's to know. Asking the shell to open such a file still fails, which
is the truth about that container on that platform.
Added
-
payload_pathanddisplay_path, with thefsfeature. The first is
above; the second takes the\\?\prefix off a path before a person reads it,
since that prefix is how a path is addressed rather than part of its name.
Note that on Windowspayload_pathreports where the file is rather than how
the caller spelled it:canonicalizeexpands 8.3 short names and resolves
junctions, so a caller comparing its result against a path of their own must
compare files and not strings. -
The
provenancefeature, off by default and separate fromfs. It adds
no crates on Windows, where an alternate data stream is reached through
std::fs, and on Unix one crate on top offsor four on its own —fs
already bringsxattr's tree ofrustix,bitflagsandlinux-raw-sysin
throughtempfile.provenance::arrived_from_elsewhereis there for a
caller that wants to report where a container came from rather than act on it.
Changed
Markis#[non_exhaustive], as every other public enum in the crate is.
What a platform records about a downloaded file is that platform's to change.
Install slipcase 0.3.5
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/excelano/slpc-rust/releases/download/v0.3.5/slipcase-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/excelano/slpc-rust/releases/download/v0.3.5/slipcase-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install excelano/tap/slipcaseDownload slipcase 0.3.5
| File | Platform | Checksum |
|---|---|---|
| slipcase-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| slipcase-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| slipcase-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| slipcase-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| slipcase-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |