diff --git a/src/bytes.rs b/src/bytes.rs
index 3228474563afffbfbc05bddfa2b6ea340dfb9f11..9aa24affed6800e9b238c9042caaac6b79f3a570 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -869,6 +869,7 @@ impl FromIterator<u8> for BytesMut {
         let mut out = BytesMut::with_capacity(maybe_max.unwrap_or(min));
 
         for i in iter {
+            out.reserve(1);
             out.put(i);
         }
 
diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs
index 15c315748367403aad4b81a8fbe258e11c218a3d..c940f015c157f98222d18b9a51424f90c64c1941 100644
--- a/tests/test_bytes.rs
+++ b/tests/test_bytes.rs
@@ -674,3 +674,24 @@ fn unsplit_two_split_offs() {
     buf.unsplit(buf2);
     assert_eq!(b"aaaabbbbccccdddd", &buf[..]);
 }
+
+#[test]
+fn from_iter_no_size_hint() {
+    use std::iter;
+
+    let mut expect = vec![];
+
+    let actual: Bytes = iter::repeat(b'x')
+        .scan(100, |cnt, item| {
+            if *cnt >= 1 {
+                *cnt -= 1;
+                expect.push(item);
+                Some(item)
+            } else {
+                None
+            }
+        })
+        .collect();
+
+    assert_eq!(&actual[..], &expect[..]);
+}