{"record":{"id":"d437c9784d92117d","repo":"HKUDS/DeepTutor","slug":"invalid-math-animator-config-details","errorCode":null,"errorMessage":"Invalid math animator config: {details}","messagePattern":"Invalid math animator config: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"deeptutor/agents/math_animator/request_config.py","lineNumber":32,"sourceCode":"    quality: Literal[\"low\", \"medium\", \"high\"] = \"medium\"\n    style_hint: str = Field(default=\"\", max_length=500)\n\n\ndef validate_math_animator_request_config(\n    raw_config: dict[str, Any] | None,\n) -> MathAnimatorRequestConfig:\n    if raw_config is None:\n        return MathAnimatorRequestConfig()\n    if not isinstance(raw_config, dict):\n        raise ValueError(\"Math animator config must be an object.\")\n    try:\n        return MathAnimatorRequestConfig.model_validate(raw_config)\n    except ValidationError as exc:\n        details = \"; \".join(\n            f\"{'.'.join(str(part) for part in error['loc'])}: {error['msg']}\"\n            for error in exc.errors()\n        )\n        raise ValueError(f\"Invalid math animator config: {details}\") from exc\n\n\n__all__ = [\n    \"MathAnimatorRequestConfig\",\n    \"validate_math_animator_request_config\",\n]\n","sourceCodeStart":14,"sourceCodeEnd":39,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/agents/math_animator/request_config.py#L14-L39","documentation":"DocumentTooLargeError raised when a member's file_size/compress_size ratio exceeds _EPUB_MAX_COMPRESSION_RATIO — a classic zip-bomb signature. Even if absolute sizes are small, an extreme expansion ratio signals maliciously crafted compression.","triggerScenarios":"A member with e.g. 1KB compressed / 500MB declared uncompressed; crafted archives designed to evade absolute-size checks while still exploding on extraction.","commonSituations":"Adversarial uploads to public ingestion endpoints; rarely, unusual but legitimate highly-repetitive content (padding files) triggering false positives.","solutions":["If legitimate, re-zip the EPUB without the extreme-ratio member (often padding/junk)","If from an untrusted source, reject the file outright","Catch DocumentTooLargeError at the ingestion boundary and log/alert on it as a potential attack"],"exampleFix":"// before\ntext = extract_text_from_bytes(data, filename=\"suspicious.epub\")  # raises\n\n// after\nimport zipfile\nzf = zipfile.ZipFile(io.BytesIO(data))\n# audit ratios, strip offending members, rebuild, then extract","handlingStrategy":"validation","validationCode":"import zipfile, io\nzf = zipfile.ZipFile(io.BytesIO(data))\nif any(i.compress_size and i.file_size / i.compress_size > 100 for i in zf.infolist()):\n    quarantine(fn, \"possible zip bomb\")","typeGuard":null,"tryCatchPattern":"except DocumentTooLargeError as e:\n    if \"compression ratio\" in str(e):\n        quarantine_and_alert(fn)","preventionTips":["Treat extreme compression ratios from untrusted sources as attacks","Keep extraction within sandboxed, resource-limited workers"],"tags":["epub","zip-bomb","security","compression-ratio"],"backgroundTag":"zip-bomb-detected","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}