Correct possible UB in Arc::drop

pull/403/head
Arthur Carcano 2 years ago
parent 79b53665a7
commit 73d6679aad

@ -89,8 +89,7 @@ Now, let's wrap this all up inside the `Drop` implementation:
```rust,ignore ```rust,ignore
impl<T> Drop for Arc<T> { impl<T> Drop for Arc<T> {
fn drop(&mut self) { fn drop(&mut self) {
let inner = unsafe { self.ptr.as_ref() }; if unsafe { self.ptr.as_ref() }.rc.fetch_sub(1, Ordering::Release) != 1 {
if inner.rc.fetch_sub(1, Ordering::Release) != 1 {
return; return;
} }
// This fence is needed to prevent reordering of the use and deletion // This fence is needed to prevent reordering of the use and deletion

@ -68,8 +68,7 @@ impl<T> Clone for Arc<T> {
impl<T> Drop for Arc<T> { impl<T> Drop for Arc<T> {
fn drop(&mut self) { fn drop(&mut self) {
let inner = unsafe { self.ptr.as_ref() }; if unsafe { self.ptr.as_ref() }.rc.fetch_sub(1, Ordering::Release) != 1 {
if inner.rc.fetch_sub(1, Ordering::Release) != 1 {
return; return;
} }
// This fence is needed to prevent reordering of the use and deletion // This fence is needed to prevent reordering of the use and deletion

Loading…
Cancel
Save