You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: address CodeRabbit review findings on the security-remediation diff
Critical permission-classifier bypasses:
- sudo long value-options (`sudo --user alice rm -rf /`) were not consumed, so
the wrapped destructive payload classified as the option's value. Add the long
forms to _SUDO_VALUE_OPTS.
- uv global options before `run` (`uv --directory repo run rm -rf /`) hid the
subcommand; the global flag's value was mistaken for it. Add
_uv_strip_global_opts and apply it in both mutation and destructive paths.
Major:
- file_restore: treat missing (None) or malformed-base64 content as a corrupt
restore point instead of silently writing an empty/garbage file.
- web/fetch: _ip_is_blocked now fails closed (blocks) on an unparseable address.
- scratchpad: stop unlinking the advisory lock file (split-inode race); keep it
persistent and add *.scratchpad.lock to the written .gitignore patterns.
- soul shutdown: don't re-await an already-finished task in the cleanup loop —
retrieve its exception without re-raising so the rest of shutdown still runs.
- pythinkersoul: on mid-tool interruption, keep the real results of calls that
already completed (captured via on_tool_result) and only synthesize the
interruption marker for still-pending calls.
Minor / nitpick:
- /import arg parsing now uses shlex via a shared parse_import_args helper
(soul/slash + ui/shell/export_import), preserving quoted paths.
- web/runner: offload the blocking wire-file stat with asyncio.to_thread;
document the intentional broad except at the per-message dispatch boundary.
- cli/vis: rename unused callback param to _ctx.
- tests: regression cases for both bypasses; strengthened import token-count
assertions; lock-file persistence test; minor annotations.
0 commit comments