diff --git a/src/buf/take.rs b/src/buf/take.rs
index 53c2933e9b1477754d0f242325c5c610fa11ce33..a0c8ed479e1717666822b26ddd676b1bd93b2fec 100644
--- a/src/buf/take.rs
+++ b/src/buf/take.rs
@@ -143,7 +143,8 @@ impl<T: Buf> Buf for Take<T> {
     }
 
     fn bytes(&self) -> &[u8] {
-        &self.inner.bytes()[..self.limit]
+        let bytes = self.inner.bytes();
+        &bytes[..cmp::min(bytes.len(), self.limit)]
     }
 
     fn advance(&mut self, cnt: usize) {
diff --git a/tests/test_take.rs b/tests/test_take.rs
new file mode 100644
index 0000000000000000000000000000000000000000..93e0c6c5ab8a14eeb6bd4a4f6ab5705f3d8e950c
--- /dev/null
+++ b/tests/test_take.rs
@@ -0,0 +1,13 @@
+extern crate bytes;
+
+use bytes::Buf;
+use std::io::Cursor;
+
+#[test]
+fn long_take() {
+    // Tests that take with a size greater than the buffer length will not
+    // overrun the buffer. Regression test for #138.
+    let buf = Cursor::new(b"hello world").take(100);
+    assert_eq!(11, buf.remaining());
+    assert_eq!(b"hello world", buf.bytes());
+}