Skip to content

Commit a55c00f

Browse files
committed
assembler: do not return whether there was an overlap.
This functionality is completely unused, and was panicky with overflow checking (see #694) Fixes #694
1 parent a794133 commit a55c00f

File tree

3 files changed

+30
-32
lines changed

3 files changed

+30
-32
lines changed

src/iface/fragmentation.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,8 @@ impl<'a> PacketAssembler<'a> {
182182
);
183183

184184
match assembler.add(offset, data.len()) {
185-
Ok(overlap) => {
185+
Ok(()) => {
186186
net_debug!("assembler: {}", self.assembler);
187-
188-
if overlap {
189-
net_debug!("packet was added, but there was an overlap.");
190-
}
191187
self.is_complete()
192188
}
193189
// NOTE(thvdveld): hopefully we wont get too many holes errors I guess?

src/socket/tcp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1764,7 +1764,7 @@ impl<'a> Socket<'a> {
17641764

17651765
// Try adding payload octets to the assembler.
17661766
match self.assembler.add(payload_offset, payload_len) {
1767-
Ok(_) => {
1767+
Ok(()) => {
17681768
debug_assert!(self.assembler.total_size() == self.rx_buffer.capacity());
17691769
// Place payload octets into the buffer.
17701770
tcp_trace!(

src/storage/assembler.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,8 @@ impl Assembler {
194194

195195
/// Add a new contiguous range to the assembler, and return `Ok(bool)`,
196196
/// or return `Err(TooManyHolesError)` if too many discontiguities are already recorded.
197-
/// Returns `Ok(true)` when there was an overlap.
198-
pub fn add(&mut self, mut offset: usize, mut size: usize) -> Result<bool, TooManyHolesError> {
197+
pub fn add(&mut self, mut offset: usize, mut size: usize) -> Result<(), TooManyHolesError> {
199198
let mut index = 0;
200-
let mut overlap = size;
201199
while index != self.contigs.len() && size != 0 {
202200
let contig = self.contigs[index];
203201

@@ -208,7 +206,6 @@ impl Assembler {
208206
// The range being added covers the entire hole in this contig, merge it
209207
// into the previous config.
210208
self.contigs[index - 1].expand_data_by(contig.total_size());
211-
overlap -= contig.total_size();
212209
self.remove_contig_at(index);
213210
index += 0;
214211
} else if offset == 0 && size < contig.hole_size && index > 0 {
@@ -217,12 +214,10 @@ impl Assembler {
217214
// the previous contig.
218215
self.contigs[index - 1].expand_data_by(size);
219216
self.contigs[index].shrink_hole_by(size);
220-
overlap -= size;
221217
index += 1;
222218
} else if offset <= contig.hole_size && offset + size >= contig.hole_size {
223219
// The range being added covers both a part of the hole and a part of the data
224220
// in this contig, shrink the hole in this contig.
225-
overlap -= contig.hole_size - offset;
226221
self.contigs[index].shrink_hole_to(offset);
227222
index += 1;
228223
} else if offset + size >= contig.hole_size {
@@ -234,7 +229,6 @@ impl Assembler {
234229
{
235230
let inserted = self.add_contig_at(index)?;
236231
*inserted = Contig::hole_and_data(offset, size);
237-
overlap -= size;
238232
}
239233
// Previous contigs[index] got moved to contigs[index+1]
240234
self.contigs[index + 1].shrink_hole_by(offset + size);
@@ -253,7 +247,7 @@ impl Assembler {
253247
}
254248

255249
debug_assert!(size == 0);
256-
Ok(overlap != 0)
250+
Ok(())
257251
}
258252

259253
/// Remove a contiguous range from the front of the assembler and `Some(data_size)`,
@@ -364,92 +358,92 @@ mod test {
364358
#[test]
365359
fn test_empty_add_full() {
366360
let mut assr = Assembler::new(16);
367-
assert_eq!(assr.add(0, 16), Ok(false));
361+
assert_eq!(assr.add(0, 16), Ok(()));
368362
assert_eq!(assr, contigs![(0, 16)]);
369363
}
370364

371365
#[test]
372366
fn test_empty_add_front() {
373367
let mut assr = Assembler::new(16);
374-
assert_eq!(assr.add(0, 4), Ok(false));
368+
assert_eq!(assr.add(0, 4), Ok(()));
375369
assert_eq!(assr, contigs![(0, 4), (12, 0)]);
376370
}
377371

378372
#[test]
379373
fn test_empty_add_back() {
380374
let mut assr = Assembler::new(16);
381-
assert_eq!(assr.add(12, 4), Ok(false));
375+
assert_eq!(assr.add(12, 4), Ok(()));
382376
assert_eq!(assr, contigs![(12, 4)]);
383377
}
384378

385379
#[test]
386380
fn test_empty_add_mid() {
387381
let mut assr = Assembler::new(16);
388-
assert_eq!(assr.add(4, 8), Ok(false));
382+
assert_eq!(assr.add(4, 8), Ok(()));
389383
assert_eq!(assr, contigs![(4, 8), (4, 0)]);
390384
}
391385

392386
#[test]
393387
fn test_partial_add_front() {
394388
let mut assr = contigs![(4, 8), (4, 0)];
395-
assert_eq!(assr.add(0, 4), Ok(false));
389+
assert_eq!(assr.add(0, 4), Ok(()));
396390
assert_eq!(assr, contigs![(0, 12), (4, 0)]);
397391
}
398392

399393
#[test]
400394
fn test_partial_add_back() {
401395
let mut assr = contigs![(4, 8), (4, 0)];
402-
assert_eq!(assr.add(12, 4), Ok(false));
396+
assert_eq!(assr.add(12, 4), Ok(()));
403397
assert_eq!(assr, contigs![(4, 12)]);
404398
}
405399

406400
#[test]
407401
fn test_partial_add_front_overlap() {
408402
let mut assr = contigs![(4, 8), (4, 0)];
409-
assert_eq!(assr.add(0, 8), Ok(true));
403+
assert_eq!(assr.add(0, 8), Ok(()));
410404
assert_eq!(assr, contigs![(0, 12), (4, 0)]);
411405
}
412406

413407
#[test]
414408
fn test_partial_add_front_overlap_split() {
415409
let mut assr = contigs![(4, 8), (4, 0)];
416-
assert_eq!(assr.add(2, 6), Ok(true));
410+
assert_eq!(assr.add(2, 6), Ok(()));
417411
assert_eq!(assr, contigs![(2, 10), (4, 0)]);
418412
}
419413

420414
#[test]
421415
fn test_partial_add_back_overlap() {
422416
let mut assr = contigs![(4, 8), (4, 0)];
423-
assert_eq!(assr.add(8, 8), Ok(true));
417+
assert_eq!(assr.add(8, 8), Ok(()));
424418
assert_eq!(assr, contigs![(4, 12)]);
425419
}
426420

427421
#[test]
428422
fn test_partial_add_back_overlap_split() {
429423
let mut assr = contigs![(4, 8), (4, 0)];
430-
assert_eq!(assr.add(10, 4), Ok(true));
424+
assert_eq!(assr.add(10, 4), Ok(()));
431425
assert_eq!(assr, contigs![(4, 10), (2, 0)]);
432426
}
433427

434428
#[test]
435429
fn test_partial_add_both_overlap() {
436430
let mut assr = contigs![(4, 8), (4, 0)];
437-
assert_eq!(assr.add(0, 16), Ok(true));
431+
assert_eq!(assr.add(0, 16), Ok(()));
438432
assert_eq!(assr, contigs![(0, 16)]);
439433
}
440434

441435
#[test]
442436
fn test_partial_add_both_overlap_split() {
443437
let mut assr = contigs![(4, 8), (4, 0)];
444-
assert_eq!(assr.add(2, 12), Ok(true));
438+
assert_eq!(assr.add(2, 12), Ok(()));
445439
assert_eq!(assr, contigs![(2, 12), (2, 0)]);
446440
}
447441

448442
#[test]
449443
fn test_rejected_add_keeps_state() {
450444
let mut assr = Assembler::new(CONTIG_COUNT * 20);
451445
for c in 1..=CONTIG_COUNT - 1 {
452-
assert_eq!(assr.add(c * 10, 3), Ok(false));
446+
assert_eq!(assr.add(c * 10, 3), Ok(()));
453447
}
454448
// Maximum of allowed holes is reached
455449
let assr_before = assr.clone();
@@ -499,39 +493,39 @@ mod test {
499493
#[test]
500494
fn test_iter_full() {
501495
let mut assr = Assembler::new(16);
502-
assert_eq!(assr.add(0, 16), Ok(false));
496+
assert_eq!(assr.add(0, 16), Ok(()));
503497
let segments: Vec<_> = assr.iter_data(10).collect();
504498
assert_eq!(segments, vec![(10, 26)]);
505499
}
506500

507501
#[test]
508502
fn test_iter_offset() {
509503
let mut assr = Assembler::new(16);
510-
assert_eq!(assr.add(0, 16), Ok(false));
504+
assert_eq!(assr.add(0, 16), Ok(()));
511505
let segments: Vec<_> = assr.iter_data(100).collect();
512506
assert_eq!(segments, vec![(100, 116)]);
513507
}
514508

515509
#[test]
516510
fn test_iter_one_front() {
517511
let mut assr = Assembler::new(16);
518-
assert_eq!(assr.add(0, 4), Ok(false));
512+
assert_eq!(assr.add(0, 4), Ok(()));
519513
let segments: Vec<_> = assr.iter_data(10).collect();
520514
assert_eq!(segments, vec![(10, 14)]);
521515
}
522516

523517
#[test]
524518
fn test_iter_one_back() {
525519
let mut assr = Assembler::new(16);
526-
assert_eq!(assr.add(12, 4), Ok(false));
520+
assert_eq!(assr.add(12, 4), Ok(()));
527521
let segments: Vec<_> = assr.iter_data(10).collect();
528522
assert_eq!(segments, vec![(22, 26)]);
529523
}
530524

531525
#[test]
532526
fn test_iter_one_mid() {
533527
let mut assr = Assembler::new(16);
534-
assert_eq!(assr.add(4, 8), Ok(false));
528+
assert_eq!(assr.add(4, 8), Ok(()));
535529
let segments: Vec<_> = assr.iter_data(10).collect();
536530
assert_eq!(segments, vec![(14, 22)]);
537531
}
@@ -556,4 +550,12 @@ mod test {
556550
let segments: Vec<_> = assr.iter_data(100).collect();
557551
assert_eq!(segments, vec![(102, 108), (110, 111), (113, 115)]);
558552
}
553+
554+
#[test]
555+
fn test_issue_694() {
556+
let mut assr = Assembler::new(16);
557+
assert_eq!(assr.add(0, 1), Ok(()));
558+
assert_eq!(assr.add(2, 1), Ok(()));
559+
assert_eq!(assr.add(1, 1), Ok(()));
560+
}
559561
}

0 commit comments

Comments
 (0)