BigPizzaV3/CodexPlusPlus · error

主题包路径不安全:{name}

Error message

主题包路径不安全:{name}

What it means

Path-traversal guard in validate_archive_entry_name: the ZIP entry name is empty, starts with '/', or contains a backslash. Such names escape or subvert the package-root normalization, so they are rejected before any file is extracted.

Source

Thrown at crates/codex-plus-core/src/dream_skin_package.rs:819

            }
            "saturate" => numeric(argument, "", 0.5, 2.0),
            "brightness" | "contrast" => numeric(argument, "", 0.8, 1.5),
            _ => false,
        };
        if !valid {
            return false;
        }
    }
    seen.contains("blur")
}

fn parse_json<T: serde::de::DeserializeOwned>(bytes: &[u8], label: &str) -> anyhow::Result<T> {
    serde_json::from_slice(bytes).with_context(|| format!("{label} 不是有效 JSON"))
}

fn validate_archive_entry_name(name: &str) -> anyhow::Result<()> {
    if name.is_empty() || name.starts_with('/') || name.contains('\\') {
        bail!("主题包路径不安全:{name}");
    }
    if name != name.trim()
        || name.contains(['\0', ':'])
        || name.split('/').any(|part| part == "." || part == "..")
        || (!name.starts_with("__MACOSX/")
            && name.split('/').filter(|part| !part.is_empty()).count() > 2)
    {
        bail!("主题包文件名不安全:{name}");
    }
    Ok(())
}

fn normalize_package_entries(
    entries: Vec<(String, Option<Vec<u8>>)>,
) -> anyhow::Result<std::collections::BTreeMap<String, Vec<u8>>> {
    let content_entries = entries
        .into_iter()
        .filter_map(|(name, content)| content.map(|content| (name, content)))

View on GitHub (pinned to f2074595a2)

Solutions

  1. Rebuild the ZIP with plain relative POSIX-style entry names
  2. Remove entries with absolute or backslash paths
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/codex-plus-core/src/dream_skin_package.rs:819 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BigPizzaV3/CodexPlusPlus@f2074595a2 (2026-08-23). Data as JSON: /api/errors/7b2c5d5c225ec0bb. Report an issue: GitHub.