Skip to content

USBUtils 0.0.6

Latest

Choose a tag to compare

@AldySan AldySan released this 30 Oct 12:56
c104db3

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 .rip sidecar 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.cfg could 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 4294967296 deleted game #0. The index was parsed with atoi(), which on 64-bit Linux/macOS silently wraps (4294967296 → 0) and passes every bounds check. The same wrap affected rename/export/rip/inject/move/dnas patch. Indices are now parsed with strtoll and saturated, so the command errors out with bad index. (Verified against a real test drive: game #0 survives.)
  • find 666 searched for an empty pattern (matching every file of every game) instead of "666" — numeric positionals were stolen by the index branch.
  • list without -d silently listed the current working directory as if it were a drive, exit code 0.
  • recover --apply printed "ul.cfg updated" even when the write failed; fix --apply exited 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 rule iso extract already had); --size rejects non-numeric values; dnas patch without an index is a usage error; report -o detects 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.