diff --git a/crates/librqbit/src/file_ops.rs b/crates/librqbit/src/file_ops.rs index a82b870..3497363 100644 --- a/crates/librqbit/src/file_ops.rs +++ b/crates/librqbit/src/file_ops.rs @@ -78,6 +78,7 @@ impl<'a, Sha1Impl: ISha1> FileOps<'a, Sha1Impl> { let mut have_bytes = 0u64; let mut needed_bytes = 0u64; + #[derive(Debug)] struct CurrentFile<'a> { index: usize, fd: &'a Arc>, @@ -132,6 +133,7 @@ impl<'a, Sha1Impl: ISha1> FileOps<'a, Sha1Impl> { while piece_remaining > 0 { let mut to_read_in_file = std::cmp::min(current_file.remaining(), piece_remaining as u64) as usize; + while to_read_in_file == 0 { current_file = file_iterator .next() diff --git a/crates/librqbit_core/src/lengths.rs b/crates/librqbit_core/src/lengths.rs index e3d7206..9714af8 100644 --- a/crates/librqbit_core/src/lengths.rs +++ b/crates/librqbit_core/src/lengths.rs @@ -82,12 +82,16 @@ impl Lengths { piece_length ); } + if total_length == 0 { + anyhow::bail!("torrent with 0 length") + } + let total_pieces = ceil_div_u64(total_length as u64, piece_length as u64) as u32; Ok(Self { chunk_length, piece_length, total_length, chunks_per_piece: ceil_div_u64(piece_length as u64, chunk_length as u64) as u32, - last_piece_id: ((total_length + 1) / piece_length as u64) as u32, + last_piece_id: total_pieces - 1, last_piece_length: last_element_size_u64(total_length, piece_length as u64) as u32, }) } @@ -248,6 +252,12 @@ mod tests { assert_eq!(l.total_pieces(), 4480); } + #[test] + fn test_total_pieces_2() { + let l = Lengths::new(4148166656, 2097152, None).unwrap(); + assert_eq!(l.total_pieces(), 1978); + } + #[test] fn test_piece_length() { let l = make_lengths();