Skip to content

Commit 77eb0a2

Browse files
authored
Fixed deriving ZeroizeOnDrop on DerefMut (#739)
1 parent 3576e3a commit 77eb0a2

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

zeroize/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ pub mod __internal {
271271
fn zeroize_or_on_drop(self);
272272
}
273273

274-
impl<T: ZeroizeOnDrop> AssertZeroizeOnDrop for &&mut T {
274+
impl<T: ZeroizeOnDrop + ?Sized> AssertZeroizeOnDrop for &&mut T {
275275
fn zeroize_or_on_drop(self) {}
276276
}
277277

@@ -280,7 +280,7 @@ pub mod __internal {
280280
fn zeroize_or_on_drop(&mut self);
281281
}
282282

283-
impl<T: Zeroize> AssertZeroize for T {
283+
impl<T: Zeroize + ?Sized> AssertZeroize for T {
284284
fn zeroize_or_on_drop(&mut self) {
285285
self.zeroize()
286286
}

zeroize/tests/zeroize_derive.rs

+28
Original file line numberDiff line numberDiff line change
@@ -287,3 +287,31 @@ fn derive_inherit_both() {
287287
}
288288
assert_eq!(&value.0 .0, &[0, 0, 0])
289289
}
290+
291+
#[test]
292+
fn derive_deref() {
293+
struct X([u8; 3]);
294+
295+
impl std::ops::Deref for X {
296+
type Target = [u8];
297+
298+
fn deref(&self) -> &Self::Target {
299+
&self.0
300+
}
301+
}
302+
303+
impl std::ops::DerefMut for X {
304+
fn deref_mut(&mut self) -> &mut Self::Target {
305+
&mut self.0
306+
}
307+
}
308+
309+
#[derive(Zeroize, ZeroizeOnDrop)]
310+
struct Z(X);
311+
312+
let mut value = Z(X([1, 2, 3]));
313+
unsafe {
314+
std::ptr::drop_in_place(&mut value);
315+
}
316+
assert_eq!(&value.0 .0, &[0, 0, 0])
317+
}

0 commit comments

Comments
 (0)