mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-09-02 17:49:20 +00:00
fix: eliminate panic paths in production code (#1184)
* fix: eliminate panic paths in production code and document infallible operations PolicyRule::new() now returns Result instead of panicking on invalid caller-supplied regex. CreateJobTool returns ToolError when job_manager is unconfigured instead of panicking. Remaining infallible unwrap/expect calls (hardcoded regexes, compile-time constants, guarded accesses) are annotated with SAFETY comments. Where possible, unwraps are replaced with safer patterns: split_last(), if-let, match-destructure, and reusing peek() values. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * fix: use inline lowercase safety comments to match CI pattern The no-panics CI check greps for '// safety:' (lowercase, inline) to suppress false positives. Switch from block SAFETY comments to inline safety comments on the .unwrap() lines. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * test: add regression tests for panic-path fixes - PolicyRule::new returns Err on invalid regex (not panic) - CreateJobTool::execute_sandbox returns ToolError when job_manager is None Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * fix: add inline // safety: comments on all infallible unwrap/expect lines The CI no-panics check requires '// safety:' on the same line as unwrap()/expect() to suppress false positives. Move safety annotations from block comments to inline comments on every infallible production unwrap/expect across all touched files. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * chore: trigger CI with skip-regression-check label [skip-regression-check] Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * refactor: remove redundant block-level SAFETY comments Each unwrap/expect now carries its own inline // safety: annotation, making the standalone block comments above them redundant. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
c79754df28
commit
716629809c
+4
-4
@@ -48,7 +48,7 @@ pub const MAX_PROMPT_FILE_SIZE: u64 = 64 * 1024;
|
||||
|
||||
/// Regex for validating skill names: alphanumeric, hyphens, underscores, dots.
|
||||
static SKILL_NAME_PATTERN: std::sync::LazyLock<Regex> =
|
||||
std::sync::LazyLock::new(|| Regex::new(r"^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$").unwrap());
|
||||
std::sync::LazyLock::new(|| Regex::new(r"^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$").unwrap()); // safety: hardcoded literal
|
||||
|
||||
/// Validate a skill name against the allowed pattern.
|
||||
pub fn validate_skill_name(name: &str) -> bool {
|
||||
@@ -268,13 +268,13 @@ pub fn escape_skill_content(content: &str) -> String {
|
||||
// Match `<` followed by optional `/`, optional whitespace/control chars,
|
||||
// then `skill` (case-insensitive). Catches both opening and closing tags:
|
||||
// `<skill`, `</skill`, `< skill`, `</\0skill`, `<SKILL`, etc.
|
||||
Regex::new(r"(?i)</?[\s\x00]*skill").unwrap()
|
||||
Regex::new(r"(?i)</?[\s\x00]*skill").unwrap() // safety: hardcoded literal
|
||||
});
|
||||
|
||||
SKILL_TAG_RE
|
||||
.replace_all(content, |caps: ®ex::Captures| {
|
||||
// Replace leading `<` with `<` to neutralize the tag
|
||||
let matched = caps.get(0).unwrap().as_str();
|
||||
// Replace leading `<` with `<` to neutralize the tag.
|
||||
let matched = caps.get(0).unwrap().as_str(); // safety: group 0 always exists
|
||||
format!("<{}", &matched[1..])
|
||||
})
|
||||
.into_owned()
|
||||
|
||||
Reference in New Issue
Block a user