reduced the number of read(2)s
diff --git a/bbb_cape/src/bbb/packet_finder.cc b/bbb_cape/src/bbb/packet_finder.cc
index 15a8e62..783ce32 100644
--- a/bbb_cape/src/bbb/packet_finder.cc
+++ b/bbb_cape/src/bbb/packet_finder.cc
@@ -30,7 +30,7 @@
 PacketFinder::PacketFinder(ByteReaderInterface *reader, size_t packet_size)
     : reader_(reader),
       packet_size_(packet_size),
-      buf_(new AlignedChar[packet_size_]),
+      buf_(new AlignedChar[packet_size_ + kZeros]),
       unstuffed_data_(new AlignedChar[packet_size_ - 4]) {
   CHECK((packet_size_ % 4) == 0);
 }
@@ -45,14 +45,15 @@
   int zeros_found = 0;
   while (true) {
     size_t already_read = ::std::max(0, packet_bytes_);
+    size_t to_read = packet_size_ - already_read;
+    if (packet_bytes_ == -1) to_read += kZeros;
     ssize_t new_bytes =
         reader_->ReadBytes((uint8_t *)(buf_ + already_read),
-                           packet_size_ - already_read, timeout_time);
+                           to_read, timeout_time);
     if (new_bytes < 0) {
       if (new_bytes == -1) {
         LOG(ERROR, "ReadBytes(%p, %zd) failed with %d: %s\n",
-            buf_ + already_read, packet_size_ - already_read, errno,
-            strerror(errno));
+            buf_ + already_read, to_read, errno, strerror(errno));
       } else if (new_bytes == -2) {
         LOG(INFO, "timed out\n");
       } else {
@@ -86,7 +87,7 @@
            ++to_check) {
         if (buf_[to_check] == 0) {
           ++zeros_found;
-          if (zeros_found == 4) {
+          if (zeros_found == kZeros) {
             packet_bytes_ = 0;
             zeros_found = 0;
             new_bytes -= to_check + 1;
@@ -101,6 +102,7 @@
     }
     if (packet_bytes_ != -1) {  // if we decided that these are good bytes
       packet_bytes_ += new_bytes;
+      CHECK_LE(packet_bytes_, static_cast<ssize_t>(packet_size_));
       if (packet_bytes_ == static_cast<ssize_t>(packet_size_)) return true;
     }
   }
@@ -149,7 +151,7 @@
     for (size_t i = 0; i < packet_size_; ++i) {
       if (buf_[i] == 0) {
         ++zeros;
-        if (zeros == 4) {
+        if (zeros == kZeros) {
           if (kDebugLogs) LOG(INFO, "start at %zd\n", i);
           packet_bytes_ = packet_size_ - (i + 1);
           memmove(buf_, buf_ + i + 1, packet_bytes_);
diff --git a/bbb_cape/src/bbb/packet_finder.h b/bbb_cape/src/bbb/packet_finder.h
index 962291f..2ad230b 100644
--- a/bbb_cape/src/bbb/packet_finder.h
+++ b/bbb_cape/src/bbb/packet_finder.h
@@ -41,6 +41,8 @@
   // We have 64-bit ints in some of our data.
   typedef char __attribute__((aligned(8))) AlignedChar;
 
+  static const int kZeros = 4;
+
   // Reads bytes until there are 4 zeros and then fills up buf_.
   // Returns true if it finds one or false if it gets an I/O error first or the
   // packet is invalid in some way.
diff --git a/bbb_cape/src/bbb/packet_finder_test.cc b/bbb_cape/src/bbb/packet_finder_test.cc
index ccd81e5..3e6dc26 100644
--- a/bbb_cape/src/bbb/packet_finder_test.cc
+++ b/bbb_cape/src/bbb/packet_finder_test.cc
@@ -24,10 +24,10 @@
                             const ::aos::time::Time &/*timeout_time*/)
       override {
     size_t to_transfer = ::std::min(max_bytes, bytes_left_);
+    if (to_transfer == 0) return -2;
     memcpy(dest, static_cast<const uint8_t *>(data_) + data_size_ - bytes_left_,
            to_transfer);
     bytes_left_ -= to_transfer;
-    if (to_transfer == 0) return -2;
     return to_transfer;
   }
 
@@ -60,7 +60,12 @@
       EXPECT_EQ(!expect_failure,
                 packet_finder.ReadPacket(::aos::time::Time(0, 0)));
       if (expect_failure && i + 1 != *failure && i + 1 != packets) {
-        while (!packet_finder.ReadPacket(::aos::time::Time(0, 0))) {}
+        int failures = 0;
+        while (!packet_finder.ReadPacket(::aos::time::Time(0, 0))) {
+          ++failures;
+          SCOPED_TRACE("failure " + ::std::to_string(failures));
+          ASSERT_LT(failures, 500);
+        }
         i += 1;
       }
     }