Repository navigation
[0.41.1] - 2026-09-05
Security
- The wizard's Runs search no longer compiles caller-supplied regexes (#230).
/api/audit-log?q=handed theqstring tore.compile, and stdlibrehas no timeout — a seven-character pattern like(a+)+$backtracks catastrophically on a moderately long log line, pinning a server thread indefinitely; withdbx serve --bindexposed beyond loopback and one thread per request, repeated requests exhaust the pool. The 200-char length cap did not help, because backtracking is a function of pattern structure, not length (CodeQL:py/regex-injection).q=is now a case-insensitive literal substring match against the stringified entry — the feature is a log filter, not a regex playground — so every query string is valid (formerly-invalid patterns like[[[[return 200 and match literally) and regex metacharacters lose their meaning:q=.*matches rows containing the literal text.*. The length cap stays as a plain input bound, and the Runs view drops its now-dead invalid-regex retry fallback.
Fixed
-
A MySQL backup with a large schema left a 0-byte
.meta.jsonwhile still reporting success (#248).mysql_backuppassedscrub_schematojqvia--argjson, the same E2BIG exposurepg_backuphad under #242 — a wide-enough schema pushed the blob past the kernel's per-argument limit, jq failed with "Argument list too long," and the backup finalized anyway with an empty sidecar (no checksum record, no scrub_schema for the pre-restore drift check).mysql_backupnow writesscrub_schemathrough--slurpfile(a temp file), never argv. Both engines also gained a sharedmeta_json_is_validgate: a backup no longer moves into place unless its.meta.jsonis non-empty and parses as JSON, so a future metadata-write failure fails the backup instead of silently shipping a broken one. Covered bytests/unit/core.bats(the gate, including a payload too large for--argjson) and new wide-schema cases intests/integration/mysql_roundtrip.bats/postgres_roundtrip.batsthat reproduce the original E2BIG on a real backup and assert the metadata comes out valid. -
dbx backupdied withexclude_opts[@]: unbound variablefor any postgres database configured with an emptyexclude_data: [](#244). Expanding an empty array errors underset -uon bash < 4.4 — macOS ships 3.2, Amazon Linux 2 ships 4.2 — so the first database configured with no excludes broke, while databases with non-empty exclude lists never hit it. Fixed with the${arr[@]+"${arr[@]}"}guard the codebase already uses elsewhere, at the pg_dump call site and at the other reachable-with-an-empty-array sites the audit turned up: the mysqldump ignore-table loop and argv (same empty-exclude_datatrigger, mysql engine),dbx clean --older-thaniterating a database dir with no backup files, andpick_postgres_image's extension loop when the source database reports no extensions. Other[@]expansions in the tree are statically non-empty or behind${#arr[@]}count guards.