@@ -234,7 +234,6 @@ impl HoleList {
234
234
}
235
235
}
236
236
237
- #[ cfg( test) ]
238
237
#[ allow( dead_code) ]
239
238
pub ( crate ) fn debug ( & mut self ) {
240
239
if let Some ( cursor) = self . cursor ( ) {
@@ -421,36 +420,44 @@ impl Cursor {
421
420
}
422
421
423
422
fn try_insert_after ( & mut self , mut node : NonNull < Hole > ) -> Result < ( ) , ( ) > {
424
- if self . hole < node {
425
- let node_u8 = node. as_ptr ( ) . cast :: < u8 > ( ) ;
426
- let node_size = unsafe { node. as_ref ( ) . size } ;
427
- let hole_u8 = self . hole . as_ptr ( ) . cast :: < u8 > ( ) ;
428
- let hole_size = self . current ( ) . size ;
423
+ let node_u8 = node. as_ptr ( ) . cast :: < u8 > ( ) ;
424
+ let node_size = unsafe { node. as_ref ( ) . size } ;
429
425
430
- // Does hole overlap node?
431
- assert ! (
432
- hole_u8. wrapping_add( hole_size) <= node_u8,
433
- "Freed node aliases existing hole! Bad free?" ,
434
- ) ;
435
-
436
- // If we have a next, does the node overlap next?
437
- if let Some ( next) = self . current ( ) . next . as_ref ( ) {
426
+ // If we have a next, does the node overlap next?
427
+ if let Some ( next) = self . current ( ) . next . as_ref ( ) {
428
+ if node < * next {
438
429
let node_u8 = node_u8 as * const u8 ;
439
430
assert ! (
440
431
node_u8. wrapping_add( node_size) <= next. as_ptr( ) . cast:: <u8 >( ) ,
441
432
"Freed node aliases existing hole! Bad free?" ,
442
433
) ;
434
+ } else {
435
+ // The new hole isn't between current and next.
436
+ return Err ( ( ) ) ;
443
437
}
438
+ }
444
439
445
- // All good! Let's insert that after.
446
- unsafe {
447
- let maybe_next = self . hole . as_mut ( ) . next . replace ( node) ;
448
- node. as_mut ( ) . next = maybe_next;
449
- }
450
- Ok ( ( ) )
451
- } else {
452
- Err ( ( ) )
440
+ // At this point, we either have no "next" pointer, or the hole is
441
+ // between current and "next". The following assert can only trigger
442
+ // if we've gotten our list out of order.
443
+ debug_assert ! ( self . hole < node, "Hole list out of order?" ) ;
444
+
445
+ let hole_u8 = self . hole . as_ptr ( ) . cast :: < u8 > ( ) ;
446
+ let hole_size = self . current ( ) . size ;
447
+
448
+ // Does hole overlap node?
449
+ assert ! (
450
+ hole_u8. wrapping_add( hole_size) <= node_u8,
451
+ "Freed node aliases existing hole! Bad free?" ,
452
+ ) ;
453
+
454
+ // All good! Let's insert that after.
455
+ unsafe {
456
+ let maybe_next = self . hole . as_mut ( ) . next . replace ( node) ;
457
+ node. as_mut ( ) . next = maybe_next;
453
458
}
459
+
460
+ Ok ( ( ) )
454
461
}
455
462
456
463
// Merge the current node with up to n following nodes
0 commit comments