{"record":{"id":"08290451ad8e883f","repo":"huggingface/candle","slug":"gguf-tensor-count-tensor-count-exceeds-max-ggu","errorCode":null,"errorMessage":"gguf: tensor_count {tensor_count} exceeds max {GGUF_MAX_ARRAY_ELEMENTS}","messagePattern":"gguf: tensor_count (.+?) exceeds max (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"candle-core/src/quantized/gguf_file.rs","lineNumber":481,"sourceCode":"            Self::Array => 4 + magic.length_prefix_size(),\n        }\n    }\n}\n\nimpl Content {\n    pub fn read<R: std::io::Seek + std::io::Read>(reader: &mut R) -> Result<Self> {\n        // Capture the file size once so the bounds checks below don't have to\n        // seek to the end and back on every length-prefixed read.\n        let start = reader.stream_position()?;\n        let file_size = reader.seek(std::io::SeekFrom::End(0))?;\n        reader.seek(std::io::SeekFrom::Start(start))?;\n\n        let magic = VersionedMagic::read(reader)?;\n        let tensor_count = read_length(reader, &magic)?;\n        let metadata_kv_count = read_length(reader, &magic)?;\n\n        if tensor_count > GGUF_MAX_ARRAY_ELEMENTS {\n            crate::bail!(\"gguf: tensor_count {tensor_count} exceeds max {GGUF_MAX_ARRAY_ELEMENTS}\")\n        }\n        if metadata_kv_count > GGUF_MAX_ARRAY_ELEMENTS {\n            crate::bail!(\n                \"gguf: metadata_kv_count {metadata_kv_count} exceeds max {GGUF_MAX_ARRAY_ELEMENTS}\"\n            )\n        }\n\n        // Reject header-declared counts that can't fit in the file at minimum size.\n        // Per-entry minima: a metadata kv is at least `key_len_prefix + u32 value_type\n        // + 1 byte value`; a tensor info is at least `name_len_prefix + u32 n_dims\n        // + u32 dtype + u64 offset`.\n        let prefix = magic.length_prefix_size();\n        let min_per_kv = prefix + 4 + 1;\n        let min_per_tensor = prefix + 4 + 4 + 8;\n        let needed = metadata_kv_count\n            .saturating_mul(min_per_kv)\n            .saturating_add(tensor_count.saturating_mul(min_per_tensor));\n        let remaining = remaining_bytes(reader, file_size)?;","sourceCodeStart":463,"sourceCodeEnd":499,"githubUrl":"https://github.com/huggingface/candle/blob/d5fee525bfde3273eb7c9b75fd2bc4937be867ca/candle-core/src/quantized/gguf_file.rs#L463-L499","documentation":"candle guards against absurd header-declared tensor counts before allocating. The GGUF header contains a tensor_count field; a malicious or corrupt file can declare a huge count that would cause OOM or DoS during parsing. Values above GGUF_MAX_ARRAY_ELEMENTS are rejected outright.","triggerScenarios":"GgufFile::read on a file whose header tensor_count exceeds GGUF_MAX_ARRAY_ELEMENTS — i.e., a corrupted, truncated, or maliciously crafted GGUF file.","commonSituations":"Incomplete download of a quantized model; bit-rotted file on disk; adversarial model file; reading a non-GGUF binary as GGUF so random bytes are interpreted as counts.","solutions":["Re-download or regenerate the GGUF file and verify its checksum","Confirm the file starts with the GGUF magic bytes before parsing","Check available disk space / download completeness"],"exampleFix":"// before\nlet file = File::open(\"model.gguf\")?; // truncated download\nlet gguf = GgufFile::from_reader(&mut BufReader::new(file))?;\n// after\n// verify checksum before parsing\nlet bytes = std::fs::read(\"model.gguf\")?;\nassert_eq!(&bytes[..4], b\"GGUF\", \"not a valid gguf file\");\nassert_eq!(sha256(&bytes), EXPECTED_SHA256);\nlet gguf = GgufFile::from_reader(&mut std::io::Cursor::new(bytes))?;","handlingStrategy":"validation","validationCode":"let bytes = std::fs::read(\"model.gguf\")?;\nif &bytes[..4] != b\"GGUF\" { return Err(anyhow!(\"invalid magic\")); }\n// sanity check declared counts region by ensuring file size is plausible (> header)\nif bytes.len() < 32 { return Err(anyhow!(\"file too small for gguf header\")); }","typeGuard":null,"tryCatchPattern":"match GgufFile::from_reader(&mut reader) {\n    Ok(g) => g,\n    Err(e) if e.to_string().contains(\"tensor_count\") => {\n        eprintln!(\"model.gguf appears corrupt; re-download it\");\n        return Err(e.into());\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Always verify checksums of downloaded GGUF models","Check download completeness (size comparison) before loading","Only load GGUF files from trusted sources"],"tags":["gguf","corrupt-file","file-format","security"],"backgroundTag":"gguf-header-count-exceeds-limit","analyzedSha":"d5fee525bfde3273eb7c9b75fd2bc4937be867ca","analyzedAt":"2026-09-02T00:15:47.023Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}