Repository navigation
USBUtils 0.0.6
Quality release: a full re-audit of the engine, CLI and GUI (bugs, logic errors, memory violations — no feature changes). Everything below was verified against real test drives and hostile/corrupt inputs before shipping.
Fixed — engine (memory safety)
- Corrupt video-rip backup could OOM the app. The
.ripsidecar loader sized its entry vector from the untrusted header count — a file claiming 4 billion entries attempted a ~64 GiB allocation on the worker thread before any read failed. The count is now clamped by the actual file size. Regression-tested with a hostile sidecar in the test suite. - PS2Load scan: unbounded allocation on corrupt images. The root-directory size from the Primary Volume Descriptor was trusted directly (up to a ~4 GiB vector). Now capped at 8 MiB, the same bound the ISO walker already enforced.
- Failed copy/move left half-written games on the destination. If part N failed (or the destination
ul.cfgcould not be written), every already-copied chunk stayed behind as an unreferenced file until you ran Restore-space. All failure paths now roll back the written files — the same contract installs already had.
Fixed — CLI (could damage the wrong game)
usbutils remove 4294967296deleted game #0. The index was parsed withatoi(), which on 64-bit Linux/macOS silently wraps (4294967296→ 0) and passes every bounds check. The same wrap affectedrename/export/rip/inject/move/dnas patch. Indices are now parsed withstrtolland saturated, so the command errors out withbad index. (Verified against a real test drive: game #0 survives.)find 666searched for an empty pattern (matching every file of every game) instead of "666" — numeric positionals were stolen by the index branch.listwithout-dsilently listed the current working directory as if it were a drive, exit code 0.recover --applyprinted "ul.cfg updated" even when the write failed;fix --applyexited 0 when fixes failed — both now report errors and exit non-zero.- Multi-file
extract/iso extract/export all: same-named files silently overwrote each other; collisions now get_1,_2… suffixes. extract -o <existing directory>now treats it as an output directory (the ruleiso extractalready had);--sizerejects non-numeric values;dnas patchwithout an index is a usage error;report -odetects short writes.
Fixed — GUI (stability)
- Closing a dialog mid-operation could crash the app. The Video-rip, Game-files and Find dialogs run work on background threads that post progress back to the dialog — and all three could be destroyed while that work was still running (Esc and the Close button bypass the existing close guard; Game-files and Find had no guard at all). All close paths now respect a busy counter.
- The menu bar stayed live during operations. After clicking Cancel on a progress dialog the job keeps running for a moment — during that window File→Open / Games→Remove could re-enter mid-operation and corrupt the list. The menu bar is disabled while busy.
- Copy/Move ran on a live snapshot problem: the worker thread used the GUI-owned game list directly (a Move even mutated it from the thread). It now works on its own snapshot and re-resolves the game by id+serial.
- Sort / Clean up drive space / Recover could act on the wrong drive. They used the drive combo selection instead of the opened games list — with two drives plugged in, "Clean up" deleted leftover files from the other drive while the visible list stayed unchanged. They now always operate on the opened list's drive.
- The shutdown wait for the update check could time out before the network timeouts it waits for, leaving the worker posting events into a destroyed window; it now waits for completion.
- A cancelled backup/extract was reported as a failure message box; the Replace progress dialog showed a Cancel button that could not cancel anything.
Fixed — dead features
- ISO explorer: editing the Volume ID never worked — the field's signals were blocked on image load and never unblocked, so edits were silently dropped when saving the modified copy.
- Find dialog: the optional exact-size filter was never read — typing a size changed nothing. It is now applied.
Downloads
| File | Contents |
|---|---|
usbutils-0.0.6-windows-x86_64.zip |
GUI (usbutils-gui.exe) + CLI (usbutils.exe) + all required Qt and MinGW runtime DLLs + data files |
usbutils-0.0.6-linux-x86_64.tar.gz |
GUI (usbutils-gui) + CLI (usbutils) + bundled Qt runtime + data files |
Both packages are self-contained: extract and run — no Qt installation, no other downloads needed.
As always: the GUI performs a silent update check a few seconds after startup; the CLI has usbutils check-update.