diff options
| author | Sebastian Thiel <[email protected]> | 2017-03-06 10:14:39 +0100 |
|---|---|---|
| committer | Sebastian Thiel <[email protected]> | 2017-03-06 10:14:39 +0100 |
| commit | ec2685347c8eba32234a14c4fdc81d6ce83dc97d (patch) | |
| tree | 2dedf0ba10ec21c5bbf2a4f23a68d89152036cdc /openssl/src/stack.rs | |
| parent | Add test to run into issue with stack.len() (diff) | |
| download | rust-openssl-ec2685347c8eba32234a14c4fdc81d6ce83dc97d.tar.xz rust-openssl-ec2685347c8eba32234a14c4fdc81d6ce83dc97d.zip | |
Fix for empty stacks
The culprit is that `sk_num(stack)` can return -1
as c_int if there is no stack allocated.
Previously, thanks to unsafe casts, this would result in
a isize::max() for len() and iteration size if there was no stack.
Now this case is handled specifically, which fixes the issue.
Diffstat (limited to 'openssl/src/stack.rs')
| -rw-r--r-- | openssl/src/stack.rs | 13 |
1 files changed, 11 insertions, 2 deletions
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<T: Stackable> { impl<T: Stackable> IntoIter<T> { 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<T: Stackable> ExactSizeIterator for IntoIter<T> {} pub struct StackRef<T: Stackable>(Opaque, PhantomData<T>); +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<T: Stackable> ForeignTypeRef for StackRef<T> { type CType = T::StackType; } @@ -165,7 +174,7 @@ impl<T: Stackable> StackRef<T> { /// 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<T> { |