{"record":{"id":"70945efbe4870ccf","repo":"Hmbown/CodeWhale","slug":"event-recovery-chunk-length-fits-usize","errorCode":null,"errorMessage":"event recovery chunk length fits usize","messagePattern":"event recovery chunk length fits usize","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"info","filePath":"crates/tui/src/runtime_threads.rs","lineNumber":14023,"sourceCode":"        .len();\n    if len == 0 {\n        return Ok(());\n    }\n\n    file.seek(SeekFrom::End(-1))?;\n    let mut last = [0_u8; 1];\n    file.read_exact(&mut last)?;\n    if last[0] == b'\\n' {\n        return Ok(());\n    }\n\n    let mut search_end = len;\n    let mut truncate_at = 0_u64;\n    let mut buffer = [0_u8; 8 * 1024];\n    let buffer_len = u64::try_from(buffer.len()).expect(\"event recovery buffer fits u64\");\n    while search_end > 0 {\n        let chunk_len = usize::try_from(search_end.min(buffer_len))\n            .expect(\"event recovery chunk length fits usize\");\n        let chunk_len_u64 = u64::try_from(chunk_len).expect(\"event recovery chunk length fits u64\");\n        let chunk_start = search_end - chunk_len_u64;\n        file.seek(SeekFrom::Start(chunk_start))?;\n        file.read_exact(&mut buffer[..chunk_len])?;\n        if let Some(index) = buffer[..chunk_len].iter().rposition(|byte| *byte == b'\\n') {\n            truncate_at = chunk_start\n                + u64::try_from(index).expect(\"event recovery newline index fits u64\")\n                + 1;\n            break;\n        }\n        search_end = chunk_start;\n    }\n\n    file.set_len(truncate_at)\n        .with_context(|| format!(\"Failed to truncate torn tail in {}\", path.display()))?;\n    file.sync_all()\n        .with_context(|| format!(\"Failed to sync repaired {}\", path.display()))?;\n    tracing::warn!(","sourceCodeStart":14005,"sourceCodeEnd":14041,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/runtime_threads.rs#L14005-L14041","documentation":"Panic from `usize::try_from(search_end.min(buffer_len))`. `search_end` is a u64 file length and `buffer_len` is the u64 form of an 8 KiB buffer, so the minimum is at most 8192 and always fits usize on any real target; the expect asserts that invariant.","triggerScenarios":"Unreachable in practice: would require `min(search_end, buffer_len)` to exceed `usize::MAX`, impossible since buffer_len is 8192 and usize >= u32 on supported platforms.","commonSituations":"Only a change shrinking usize below u64 range for chunk sizes (no real target) or replacing the fixed chunk bound with file-length-derived values without a re-check.","solutions":["No change needed for the current fixed 8 KiB chunking","If chunk size ever derives from the file length, clamp to usize::MAX first"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"let chunk_len_usize = usize::try_from(search_end.min(buffer_len)).expect(\"chunk fits usize\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Bound chunk size by the fixed buffer length, never by raw file length","Re-check bounds if chunk derivation changes"],"tags":["rust","panic","integer-conversion","filesystem"],"backgroundTag":"value-out-of-range","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-22T11:17:16.035Z"}