diff --git a/src/alloc.rs b/src/alloc.rs
index ad9452fdaa88d372edd63401620cc33ee6006185..9171c3804e7986e2df658835f3cd2d178e967c63 100644
--- a/src/alloc.rs
+++ b/src/alloc.rs
@@ -1,8 +1,9 @@
 use std::{mem, ptr};
 use std::rt::heap;
 use std::sync::atomic::{AtomicUsize, Ordering};
+use std::usize;
 
-const MAX_ALLOC_SIZE: usize = (1 << 32) - 1;
+const MAX_ALLOC_SIZE: usize = usize::MAX;
 
 /// Allocates memory to be used by Bufs or Bytes. Allows allocating memory
 /// using alternate stratgies than the default Rust heap allocator. Also does
diff --git a/src/lib.rs b/src/lib.rs
index d516a75d95ff3b3c229106626509599114f51ce5..8c4874fa2d876aa486bce10dd781df9897e4ecc9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -307,25 +307,28 @@ impl<'a> Sink for &'a mut Vec<u8> {
     fn sink<B: Buf>(self, buf: &mut B) -> Result<usize, BufError> {
         use std::slice;
 
+        self.clear();
+
         let rem = buf.remaining();
         let cap = self.capacity();
-        let len = rem - cap;
 
         // Ensure that the vec is big enough
-        if cap < rem {
-            self.reserve(len);
+        if rem > self.capacity() {
+            self.reserve(rem - cap);
         }
 
         unsafe {
             {
                 let dst = self.as_mut_slice();
-                buf.read_slice(slice::from_raw_parts_mut(dst.as_mut_ptr(), rem));
+                let cnt = buf.read_slice(slice::from_raw_parts_mut(dst.as_mut_ptr(), rem));
+
+                debug_assert!(cnt == rem);
             }
 
             self.set_len(rem);
         }
 
-        Ok(len)
+        Ok(rem)
     }
 }