diff --git a/CHANGELOG.md b/CHANGELOG.md index 23357174b..ac5d8d5ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 1.6.1 (July 13, 2024) + +This release fixes a bug where `Bytes::is_unique` returns incorrect values when +the `Bytes` originates from a shared `BytesMut`. (#718) + # 1.6.0 (March 22, 2024) ### Added diff --git a/Cargo.toml b/Cargo.toml index 793582af1..ef44fbb9d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ name = "bytes" # When releasing to crates.io: # - Update CHANGELOG.md. # - Create "v1.x.y" git tag. -version = "1.6.0" +version = "1.6.1" edition = "2018" rust-version = "1.39" license = "MIT" diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index f2a3dab5c..2829a7cfb 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -1780,7 +1780,7 @@ static SHARED_VTABLE: Vtable = Vtable { clone: shared_v_clone, to_vec: shared_v_to_vec, to_mut: shared_v_to_mut, - is_unique: crate::bytes::shared_is_unique, + is_unique: shared_v_is_unique, drop: shared_v_drop, }; @@ -1843,6 +1843,12 @@ unsafe fn shared_v_to_mut(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> B } } +unsafe fn shared_v_is_unique(data: &AtomicPtr<()>) -> bool { + let shared = data.load(Ordering::Acquire); + let ref_count = (*shared.cast::()).ref_count.load(Ordering::Relaxed); + ref_count == 1 +} + unsafe fn shared_v_drop(data: &mut AtomicPtr<()>, _ptr: *const u8, _len: usize) { data.with_mut(|shared| { release_shared(*shared as *mut Shared); diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 017ce66ea..8e5d0ae1f 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -1173,6 +1173,15 @@ fn shared_is_unique() { assert!(c.is_unique()); } +#[test] +fn mut_shared_is_unique() { + let mut b = BytesMut::from(LONG); + let c = b.split().freeze(); + assert!(!c.is_unique()); + drop(b); + assert!(c.is_unique()); +} + #[test] fn test_bytesmut_from_bytes_static() { let bs = b"1b23exfcz3r";