{"record":{"id":"9e990c35aa83ef33","repo":"tonhowtf/omniget","slug":"invalid-file-size-from-sender-mod","errorCode":null,"errorMessage":"Invalid file size from sender: {}","messagePattern":"Invalid file size from sender: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/src/platforms/p2p/mod.rs","lineNumber":144,"sourceCode":"\n        write_half\n            .write_all(format!(\"RECV {}\\n\", code).as_bytes())\n            .await?;\n        write_half.flush().await?;\n\n        let response = read_line(&mut reader).await?;\n        check_relay_error(&response)?;\n        if response != \"READY\" {\n            anyhow::bail!(\"Unexpected relay response: {}\", response);\n        }\n\n        tracing::info!(\"[p2p] connected to sender via relay\");\n\n        let file_name = read_line(&mut reader).await?;\n        let file_size_str = read_line(&mut reader).await?;\n        let file_size: u64 = file_size_str\n            .parse()\n            .map_err(|_| anyhow!(\"Invalid file size from sender: {}\", file_size_str))?;\n\n        tracing::info!(\"[p2p] receiving: {} ({} bytes)\", file_name, file_size);\n\n        write_half.write_all(b\"OK\\n\").await?;\n        write_half.flush().await?;\n\n        let _ = progress.send(ProgressUpdate::percent(0.0)).await;\n\n        let sanitized = sanitize_filename::sanitize(&file_name);\n        let output_path = opts.output_dir.join(&sanitized);\n        if let Some(parent) = output_path.parent() {\n            tokio::fs::create_dir_all(parent).await?;\n        }\n\n        let mut file = File::create(&output_path).await?;\n        let mut received: u64 = 0;\n        let mut buf = vec![0u8; CHUNK_SIZE];\n","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/src/platforms/p2p/mod.rs#L126-L162","documentation":"After connecting, the receiver reads the sender's handshake lines (file name, then file size) and parses the size as u64. If the sender sent a line that is not a valid unsigned integer (or empty/garbage), parse() fails and this error is thrown. It protects against protocol desync between sender and receiver.","triggerScenarios":"download()'s read_line returns a file_size_str that fails u64::parse — sender sent an error message, an empty line, a line with trailing characters (e.g. '\\r' handled incorrectly), or the protocol is out of order so a non-size line is read here.","commonSituations":"Sender aborted and the relay delivered a status/error line instead of the size; sender implementation version mismatch writing a human-readable size (e.g. '1.5 MB'); CRLF line endings not trimmed before parse.","solutions":["Verify sender writes the size as a plain decimal u64 followed by a single newline.","Trim the received line (especially '\\r') before parsing: file_size_str.trim().parse::<u64>().","Check that sender/receiver protocol versions match (same handshake order and format).","Inspect what the sender actually sent — log file_size_str verbatim to spot protocol desync."],"exampleFix":"// before\nlet file_size: u64 = file_size_str\n    .parse()\n    .map_err(|_| anyhow!(\"Invalid file size from sender: {}\", file_size_str))?;\n// after\nlet file_size: u64 = file_size_str\n    .trim()\n    .parse()\n    .map_err(|_| anyhow!(\"Invalid file size from sender: {:?}\", file_size_str))?;","handlingStrategy":"try-catch","validationCode":"// Rust: validate a size line before handing it to the protocol\nfn parse_size_line(line: &str) -> Option<u64> {\n    line.trim().parse::<u64>().ok()\n}","typeGuard":null,"tryCatchPattern":"let file_size: u64 = match read_line(&mut reader).await?.trim().parse() {\n    Ok(n) => n,\n    Err(_) => {\n        tracing::error!(\"sender handshake desync, got: {:?}\", file_size_str);\n        anyhow::bail!(\"sender sent invalid file size; transfer aborted\");\n    }\n};","preventionTips":["Trim CRLF before parsing lines from the socket","Keep sender and receiver handshake format versioned and identical","Have the sender send an explicit error/abort marker the receiver recognizes","Log raw handshake lines (bounded) for debugging desyncs"],"tags":["protocol","parsing","p2p","handshake"],"backgroundTag":"invalid-argument-format","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}