diff --git a/openssl/src/stack.rs b/openssl/src/stack.rs index 268afde7..d9795a51 100644 --- a/openssl/src/stack.rs +++ b/openssl/src/stack.rs @@ -116,7 +116,7 @@ pub struct IntoIter { impl IntoIter { fn stack_len(&self) -> c_int { - unsafe { OPENSSL_sk_num(self.stack as *mut _) } + safe_stack_size(self.stack as *mut _) as c_int } } @@ -154,6 +154,15 @@ impl ExactSizeIterator for IntoIter {} pub struct StackRef(Opaque, PhantomData); +fn safe_stack_size(stack: *mut OPENSSL_STACK) -> usize { + let l = unsafe { OPENSSL_sk_num(stack) as isize }; + if l < 0 { + 0 + } else { + l as usize + } +} + impl ForeignTypeRef for StackRef { type CType = T::StackType; } @@ -165,7 +174,7 @@ impl StackRef { /// Returns the number of items in the stack pub fn len(&self) -> usize { - unsafe { OPENSSL_sk_num(self.as_stack()) as usize } + safe_stack_size(self.as_stack()) } pub fn iter(&self) -> Iter {