@@ -350,25 +350,46 @@ parse(const uint8_t* data_ptr, size_t buf_size) const
350350{
351351 std::string result;
352352
353+ constexpr uint8_t MAGIC_HEADER = 0xCA ;
354+ constexpr uint8_t MAGIC_FOOTER = 0xBA ;
355+ constexpr size_t SCAN_STEP = 4 ; // Minimum alignment step for searching
356+
353357 size_t offset = 0 ;
354- size_t entry_header_size = m_config.get_entry_header_size ();
355- size_t entry_footer_size = m_config.get_entry_footer_size ();
356- size_t total_entry_size = entry_header_size + m_message_size + entry_footer_size;
358+ const size_t entry_header_size = m_config.get_entry_header_size ();
359+ const size_t entry_footer_size = m_config.get_entry_footer_size ();
360+ const size_t min_entry_size = entry_header_size + m_message_size + entry_footer_size;
357361
358- while (offset + total_entry_size <= buf_size) {
359- // Skip entry header
360- size_t msg_offset = offset + entry_header_size;
362+ // Search for valid entries by looking for the header magic byte
363+ while (offset + min_entry_size <= buf_size) {
364+ // Look for header magic byte (0xCA)
365+ if (data_ptr[offset] != MAGIC_HEADER) {
366+ offset += SCAN_STEP;
367+ continue ;
368+ }
361369
362- // Parse the actual log message header
370+ // Parse the message to determine entry size
371+ const size_t msg_offset = offset + entry_header_size;
363372 auto entry_data = parse_entry (data_ptr, msg_offset, buf_size);
364373 auto format = std::stoul (entry_data[m_field_indices.at (" format" )]);
365374 auto argc = std::stoul (entry_data[m_field_indices.at (" argc" )]);
366375
367- result += format_entry_row (entry_data);
376+ const size_t payload_size = calculate_entry_size (argc, format);
377+ const size_t full_entry_size = entry_header_size + payload_size + entry_footer_size;
378+
379+ // Check if we have space for the full entry
380+ if (offset + full_entry_size > buf_size) {
381+ break ;
382+ }
383+
384+ // Validate footer magic (last byte of footer structure)
385+ const size_t footer_magic_offset = offset + entry_header_size + payload_size + entry_footer_size - 1 ;
386+ if (data_ptr[footer_magic_offset] != MAGIC_FOOTER) {
387+ offset += SCAN_STEP;
388+ continue ;
389+ }
368390
369- // Calculate total entry size including header/footer
370- size_t payload_size = calculate_entry_size (argc, format);
371- size_t full_entry_size = entry_header_size + payload_size + entry_footer_size;
391+ // Valid entry found - format and add it
392+ result += format_entry_row (entry_data);
372393 offset += full_entry_size;
373394 }
374395 return result;
0 commit comments