diff --git a/receiver/JFJochReceiverFPGA.cpp b/receiver/JFJochReceiverFPGA.cpp index 5ba633b2..5d8aa6cc 100644 --- a/receiver/JFJochReceiverFPGA.cpp +++ b/receiver/JFJochReceiverFPGA.cpp @@ -479,9 +479,15 @@ void JFJochReceiverFPGA::FrameTransformationThread(uint32_t threadid) { const auto compression_start_time = std::chrono::steady_clock::now(); try { + // Reserve 32 bytes for close, etc. If the metadata already fills the + // slot the subtraction below would wrap (size_t), so bail out here and + // let the catch drop just this frame. + if (metadata_size + 32 >= slot_size) + throw CompressionBufferTooSmallException("CBOR metadata leaves no room for the compressed image"); + size_t image_size = transformation.CompressImage( writer_buffer + serializer.GetImageAppendOffset(), - slot_size - (metadata_size + 32)); // keep 32 byte extra for close, etc. + slot_size - (metadata_size + 32)); const auto compression_end_time = std::chrono::steady_clock::now(); message.compression_time_s = std::chrono::duration( compression_end_time - compression_start_time).count();